Limitationen im VBA-Editor (VBE)
Allgemeines über
Limitationen im VBA-Editor
Übersicht
der VBA-Editor-Limitationen
Anmerkungen
zu VBA-Editor-Limitationen
Fehlermeldungen
des VBA-Editors infolge Überschreiten einer Limitation
Allgemeines über Limitationen im VBA-Editor
Auch der in den Microsoft Office-Programmen integrierte VBA-Editor (VBE) unterliegt gewissen Limitationen, die es zu beachten gilt.
Wenn Sie in verschiedenen Microsoft Office-Programmen wie beispielsweise Excel, Word oder PowerPoint programmieren, sollten Sie beachten, dass die VBA-Editoren dieser Office-Programme zum Teil unterschiedliche Spezifikationen besitzen. Dies, obwohl alle Programme ein und denselben VBA-Editor benutzen.
Weitere Informationen über VBA-verwandte Themen finden Sie auf diesen Seiten:
Weitere Informationen Alle
Limitationen in Excel-VBA und im Excel-Objektmodell finden Sie hier: Alle
Limitationen im VBA-Editor von Microsoft Excel finden Sie hier: Alle
Limitationen in VBA und VB werden hier vorgestellt: Die
Limitationen in den Projekten finden Sie hier: Die
Limitationen von UserForms und Controls stehen auf dieser Seite: |
Bei einigen Spezifikationen ist ein spezieller Vermerk angebracht, beispielsweise "Keine Angabe" oder "Inoffiziell". Was dieser bedeutet, wird hier erklärt:
Weitere Informationen |
Diese Seite ist auch als Acrobat PDF-Dokument erhältlich. Mehr dazu erfahren Sie hier:
Übersicht der VBA-Editor-Limitationen
Tipp:
Direktes Aufrufen einer Limitation
Sämtliche in der nachstehenden Tabelle aufgeführten Limitationen besitzen so
genannte Textmarken und können daher direkt aufgerufen werden. Wenn Sie beispielsweise
die Limitation "Maximale Länge des Passwortes eines VBA-Projektes", welche die
ID 17 besitzt, aufrufen möchten, müssen Sie lediglich im Adressfeld Ihres Browsers den
Zusatz "#L17" an die URL der vorliegenden Seite http://www.xlam.ch/xlimits/vbe.htm
anhängen. Die vollständige Adresse lautet somit "http://www.xlam.ch/xlimits/vbe.htm#L17".
Limitationen im VBA-Editor
Die nachfolgende Tabelle zeigt 28 Limitationen und Spezifikationen des VBA-Editors.
| ID | Merkmal (Limitation) | Spezifikation |
| 1 | Maximale Anzahl Steuerelemente auf einem Benutzerformular (UserForm) | Excel 97: Unbegrenzt Excel 2000: Unbegrenzt Excel 2002: Unbegrenzt Excel 2003: Unbegrenzt Word
97: Unbegrenzt PowerPoint 97: Unbegrenzt Es spielt keine Rolle, welche Steuerelemente sich auf dem Benutzerformular befinden, sprich ob es Schaltflächen, Bezeichnungsfelder, Textfelder oder andere Steuerelemente sind. Die maximal Anzahl ist immer unbegrenzt. Diese Limitation gilt ausschliesslich für VBA-Benutzerformulare, also nicht für Benutzerformulare von Visual Basic 5.0 oder 6.0. Visual Basic-Formulare können maximal 254 Steuerelemente aufnehmen beziehungsweise maximal so viele, wie Systemressourcen zur Verfügung stehen (siehe auch Anmerkung V1). Achtung! Anmerkung des Autors: |
| 2 | Steuerelemente eines Benutzerformulares, die mit VBA direkt angesprochen werden können | Excel 97:
Steuerelemente 1 bis 411 Excel 2000: Steuerelemente 1 bis 411 Excel 2002: (Keine Angabe) Excel 2003: (Keine Angabe) Word
97: Steuerelemente 1 bis 411 PowerPoint 97: Steuerelemente 1 bis
411 Dieses Problem betrifft die Microsoft Office-Programme Excel, Word und PowerPoint der Version 97 und 2000. Ob das Problem auch in den Office-Versionen 2002/XP und 2003 existiert, ist unklar, da es keine Informationen seitens Microsoft gibt. Nebenbei erwähnt gibt es weder ein Service Pack noch einen Hotfix für dieses Problem. Wenn man ein Steuerelement, welches nach dem 411-ten Steuerelement hinzugefügt wurde, im VBA-Code direkt referenziert (z.B. UserForm1.LabelXY.Caption ="") und diese Anweisung dann ausführt, stürzt das Office-Programm sofort ab. Es spielt keine Rolle, welcher Steuerelement-Typ angesprochen wird (Schaltfläche, Bezeichnungsfeld, Textfeld etc.). Wenn Sie beispielsweise das erste der UserForm hinzugefügte Steuerelement löschen und dann das 412-te Steuerelement direkt ansprechen, erfolgt kein Programmabsturz, da durch die Löschung das 412-te hinzugefügte Steuerelement intern neu die Nummer 411 besitzt. Dieses Problem lässt sich umgehen, indem die Controls-Auflistung benutzt wird. Das 412-te Steuerelement kann dadurch mit UserForm1.Controls(411).Caption = "" indirekt referenziert werden (der Controls-Index beginnt bei 0, daher 411). Auch For-Each-Schleifen funktionieren fehlerfrei. Weitere Informationen zu den möglichen Umgehungslösungen finden Sie in Anmerkung V1. Siehe auch Limitation-ID 1. |
| 3 | Maximale Länge eines Modulnamens (Codename) | Excel 97: 31 Zeichen Excel 2000: 31 Zeichen Excel 2002: 31 Zeichen Excel 2003: 31 Zeichen Word
97: 31 Zeichen PowerPoint 97: 31 Zeichen Diese Limitation gilt für Objekte (Modul "DieseArbeitsmappe" und Arbeitsblattmodule in Excel; Modul "ThisDocument" in Word) sowie für Module (Codemodule, Klassenmodule und Benutzerformulare) von VBA-Projekten. Bei Überschreiten dieser Limitation
treten folgende Fehlermeldungen auf: In Visual Basic-Projekten hingegen können Modulnamen bis zu 40 Zeichen lang sein. Weitere Informationen zu VBA- und VB-Projekten finden Sie auf der Seite Limitationen in VBA- und VB-Projekten. |
| 4 | Maximale Länge eines Projektnamens | Excel 97: 128 Zeichen Excel 2000: 128 Zeichen Excel 2002: 128 Zeichen Excel 2003: 128 Zeichen Word
97: 128 Zeichen PowerPoint 97: 128 Zeichen In Visual Basic-Projekten dagegen kann der Projektname maximal 40 Zeichen lang sein. Weitere Informationen zu VBA- und VB-Projekten finden Sie auf der Seite Limitationen in VBA- und VB-Projekten. |
| 5 | Maximale Länge eines Prozedurnamens in Excel-VBA | Excel 97: 255 Zeichen Excel 2000: 255 Zeichen Excel 2002: 255 Zeichen Excel 2003: 255 Zeichen Achtung: Siehe auch Limitation-ID 6. |
| 6 | Maximale Länge eines Prozedurnamens in Word-VBA | Word 97: 80 Zeichen Word 2000: 80 Zeichen Word 2002: 80 Zeichen Word 2003: 80 Zeichen Anmerkung des Autors: Siehe auch Limitation-ID 5. |
| 7 | Maximale Anzahl von Rückgängig-Stufen im VBA-Editor | VBA-Editor Excel 97:
20 Stufen VBA-Editor Excel 2000: 20 Stufen VBA-Editor Excel 2002: 20 Stufen (Inoffiziell) VBA-Editor Excel 2003: 20 Stufen (Inoffiziell) VBA-Editor Word 97: 20 Stufen VBA-Editor PowerPoint 97: 20 Stufen Genau genommen besitzt der VBA-Editor zwei voneinander unabhängige Undo-Speicher, die je 20 Befehle aufnehmen können. Der eine Undo-Speicher ist für Codemodule zuständig und der andere für Benutzerformulare. Das bedeutet, dass im Grunde genommen insgesamt 40 Aktionen rückgängig gemacht werden können. Die Anzahl von 20 Stufen im VBA-Editor ist fest im Programm abgelegt und somit nicht veränderbar. In der Anwendung Microsoft Excel selbst stehen standardmässig 16 Rückgängig-Ebenen zur Verfügung, wobei diese Anzahl anhand eines Windows Registry-Eintrages geändert werden kann. Informationen zur Rückgängig-Limitation in Microsoft Excel finden Sie unter Limitation-ID 40: Maximale Anzahl von Rückgängig-Stufen. Weitere Informationen siehe Artikel xllimit9 'Anzahl von Rückgängig-Ebenen'. |
| 8 | Maximale Länge des Codes im Visual Basic Script Editor von Outlook 97 | 32 KB Bei einer durchschnittlichen Länge einer Codezeile von 25 Zeichen erreicht man die 32 KB Grenze nicht, selbst wenn man 1'000 Zeilen Code programmiert. Das Limitationsproblem kann anhand eines Hotfixes behoben werden. Zudem wurde dieses Problem in Outlook 97 Version 8.02 behoben. |
| 9 | Maximale Länge einer Zeichenfolge fester Länge in Access 2000-VBA | 65'535 Bytes |
| 10 | Maximale Länge einer Zeichenfolge fester Länge in Excel-VBA | Excel 97: 65'529 Zeichen,
ca. 64 KB, ca. 216 Excel 2000: 65'529 Zeichen, ca. 64 KB, ca. 216 Excel 2002: 65'529 Zeichen, ca. 64 KB, ca. 216 (Inoffiziell) Excel 2003: 65'529 Zeichen, ca. 64 KB, ca. 216 (Inoffiziell) In mehreren Dokumentationen steht, dass eine Zeichenfolge fester Länge bis zu 65'529 Zeichen lang sein kann. Diese Information ist meiner Meinung nach falsch. In Microsoft Excel 97 beispielsweise kann die Zeichenfolge maximal 65'526 Zeichen lang sein. Wird eine grössere Zahl in der Variablendeklaration verwendet, erscheint der Fehler "Fehler beim Kompilieren: Ungültige Länge für Zeichenfolge fester Länge". |
| 11 | Maximale Länge einer Zeichenfolge variabler Länge in Excel-VBA | Excel 97: ca. 2
Milliarden, 231 Excel 2000: ca. 2 Milliarden, 231 Excel 2002: ca. 2 Milliarden, 231 (Inoffiziell) Excel 2003: ca. 2 Milliarden, 231 (Inoffiziell) |
| 12 | Maximale Länge einer Zeichenfolge variabler oder fester Länge in Word-VBA | Word 97: 65'280 Zeichen,
ca. 64 KB, ca. 216 Word 2000: 65'280 Zeichen, ca. 64 KB, ca. 216 Word 2002: 65'280 Zeichen, ca. 64 KB, ca. 216 (Inoffiziell) Word 2003: 65'280 Zeichen, ca. 64 KB, ca. 216 (Inoffiziell) In einem Microsoft Knowledge Base-Artikel ist angegeben, dass eine Zeichenfolge fester Länge maximal 65'280 Zeichen lang sein darf. Diese Information ist meiner Meinung nach falsch. In Microsoft Word 97 beispielsweise kann die Zeichenfolge bis zu 65'526 Zeichen lang sein. Wird eine grössere Zahl in der Variablendeklaration verwendet, erscheint der Fehler "Fehler beim Kompilieren: Ungültige Länge für Zeichenfolge fester Länge". |
| 13 | Maximale Anzahl Argumente, die einem Makro, einer Sub-Prozedur oder einer Funktion übergeben werden können in Excel-VBA | Excel 97: 30 Argumente Excel 2000: 30 Argumente Excel 2002: 30 Argumente Excel 2003: 30 Argumente Siehe auch Limitation-ID 14. |
| 14 | Maximale Anzahl Argumente, die einer Sub-Prozedur oder einer Funktion übergeben werden können in Word-VBA | Word 97: 20 Argumente Word 2000: 20 Argumente Word 2002: 20 Argumente (Inoffiziell) Word 2003: 20 Argumente (Inoffiziell) Laut den offiziellen Produkt-Spezifikationen von Microsoft Word ist es tatsächlich so, dass maximal 20 Argumente übergeben werden können. Das ist eigentlich überraschend, weil Microsoft Excel bis zu 30 Argumente verarbeiten kann; und Microsoft Word und Microsoft Excel besitzen den gleichen VBA-Editor bzw. den gleichen VBA-Sprachinterpreter. Siehe auch Limitation-ID 13. Weitere Informationen über Microsoft Word- und Word-VBA-Limitationen siehe Seite Limitationen in Microsoft Word. |
| 15 | Maximale Anzahl Zeichen, die während der Makroaufzeichnung in eine Zelle oder in ein eingebettetes Objekt eingegeben werden können | Excel 97: 255 Zeichen Excel 2000: 255 Zeichen Excel 2002: 255 Zeichen (Inoffiziell) Excel 2003: 255 Zeichen (Inoffiziell) Wenn während der Makroaufzeichnung mehr als 255 Zeichen in eine Zelle eingetragen werden, erscheint die Fehlermeldung "Kann nicht aufzeichnen". Die Eingabe wird von Excel zwar entgegengenommen, aber der dazugehörende VBA-Code nicht generiert. Bei Objekten tritt die Fehlermeldung nicht konsequent auf. Bei Eingabe eines mehr als 255 Zeichen langen Textes in ein Textfeld (Symbolleiste "Zeichnen") wird der VBA-Code fehlerlos generiert (Anmerkung des Autors: Allerdings ist das Textfeld kein eingebettetes Objekt im eigentlichen Sinne). Bei Eingabe eines langen Textes in ein Textfeld der Steuerelement-Toolbox (Symbolleiste "Steuerelement-Toolbox") erscheint keine Fehlermeldung. Es wird aber auch kein VBA-Code generiert. Informationen zur verwandten Excel-Limitation finden Sie unter Limitation-ID 129: Maximale Anzahl Zeichen, die während der Makroaufzeichnung in eine Zelle eingetragen werden können. |
| 16 | Länge des Schlüssels des Passwortes eines VBA-Projektes | Excel 97: 40 Bit Excel 2000: 40 Bit Excel 2002: 40 Bit (Inoffiziell) Excel 2003: 40 Bit (Inoffiziell) Passwörter von VBA-Projekten verwenden eine 40 Bit-Verschlüsselung. |
| 17 | Maximale Länge des Passwortes eines VBA-Projektes | Excel 97: 32 Zeichen Excel 2000: 32 Zeichen Excel 2002: 32 Zeichen Excel 2003: 32 Zeichen Word
97: 32 Zeichen PowerPoint 97: 32 Zeichen Wenn Sie versuchen mit der Brute Force-Technik ein Passwort herauszufinden (d.h. Durchprobieren sämtlicher Zeichenkombinationen), so werden Sie eine nicht-lineare Zunahme der benötigten Zeit feststellen, je länger das Passwort ist. Ein interessantes Beispiel dazu finden Sie in Anmerkung V2. |
| 18 | Tab-Schrittweite | Excel 97: 1 bis 32
Leerzeichen Excel 2000: 1 bis 32 Leerzeichen Excel 2002: 1 bis 32 Leerzeichen Excel 2003: 1 bis 32 Leerzeichen Word 97: 1 bis 32 Leerzeichen PowerPoint 97: 1 bis 32 Leerzeichen Weitere Informationen siehe Anmerkung V3. |
| 19 | Maximale Anzahl Leerzeichen vor einem VBA-Befehl | Excel 97: 256
Leerzeichen Excel 2000: 256 Leerzeichen Excel 2002: 256 Leerzeichen Excel 2003: 256 Leerzeichen Word
97: 256 Leerzeichen PowerPoint 97: 256 Leerzeichen Wenn in einer Codezeile mehr als 256 Leerzeichen vor einem VBA-Befehl stehen, wird der VBA-Befehl automatisch auf die nächste Zeile geschrieben. |
| 20 | Breite/Höhe des Formularrasters | Excel 97: 2 bis 60
Rastereinheiten Excel 2000: 2 bis 60 Rastereinheiten Excel 2002: 2 bis 60 Rastereinheiten Excel 2003: 2 bis 60 Rastereinheiten Word 97: 2 bis 60 Rastereinheiten PowerPoint 97: 2 bis 60
Rastereinheiten |
| 21 | Maximale Zeilenlänge im Direktfenster | Excel 97: 1'023
Zeichen Excel 2000: 1'023 Zeichen Excel 2002: 1'023 Zeichen Excel 2003: 1'023 Zeichen Word
97: 1'023 Zeichen PowerPoint 97: 1'023 Zeichen |
| 22 | Maximale Schriftgrösse im Codefenster | Excel 97: 23 Punkte Excel 2000: 23 Punkte Excel 2002: 23 Punkte Excel 2003: 23 Punkte Word
97: 23 Punkte PowerPoint 97: 23 Punkte |
| 23 | Maximale Länge eines Seitentitels in der Werkzeugsammlung | Excel 97: 30'000
Zeichen Excel 2000: 30'000 Zeichen Excel 2002: 30'000 Zeichen Excel 2003: 30'000 Zeichen Word
97: 30'000 Zeichen PowerPoint 97: 30'000 Zeichen Siehe auch Limitation-ID 24. |
| 24 | Maximale Länge einer Seiten-Steuerelement-Info in der Werkzeugsammlung | Excel 97: 30'000
Zeichen Excel 2000: 30'000 Zeichen Excel 2002: 30'000 Zeichen Excel 2003: 30'000 Zeichen Word
97: 30'000 Zeichen PowerPoint 97: 30'000 Zeichen Siehe auch Limitation-ID 23. |
| 25 | Maximale Anzahl Seiten in der Werkzeugsammlung | Excel 97: mindestens
50 Seiten Excel 2000: mindestens 50 Seiten Excel 2002: mindestens 50 Seiten Excel 2003: mindestens 50 Seiten Anmerkung des Autors: |
| 26 | Höchste erlaubte Kontext-ID für die Hilfedatei | Excel 97:
2'147'483'647 (Long Integer) Excel 2000: 2'147'483'647 (Long Integer) Excel 2002: 2'147'483'647 (Long Integer) Excel 2003: 2'147'483'647 (Long Integer) |
| 27 | Maximale Länge des Schriftartennamens der in Codefenstern verwendeten Schriftart | Excel 97: Je nach
Buchstabenbreite unterschiedlich Excel 2000: Je nach Buchstabenbreite unterschiedlich Excel 2002: Je nach Buchstabenbreite unterschiedlich Excel 2003: Je nach Buchstabenbreite unterschiedlich Die Schriftart wird im Optionenfenster, Registerseite "Editor-Format" im Kombinationsfeld "Schriftart" festgelegt. Da das Feld eine Proportionalschrift verwendet, ist die maximale Länge des Schriftartennamens unterschiedlich. Bei vielen schmalen Zeichen (z.B. Buchstaben i, l und j) kann der Name länger sein als bei vielen breiten Zeichen (z.B. Buchstaben w und m). |
| 28 | Maximale Länge eines Überwachungsausdrucks | Excel 97: 1'023
Zeichen Excel 2000: 1'023 Zeichen Excel 2002: 1'023 Zeichen Excel 2003: 1'023 Zeichen |
Anmerkungen zu VBA-Editor-Limitationen
Nachfolgend finden Sie Zusatzinformationen über verschiedene wichtige Limitationen im VBA-Editor.
[V1] Maximale Anzahl
Steuerelemente auf einem Benutzerformular
Ein VBA-Benutzerformular kann
praktisch unbegrenzt viele Steuerelemente aufnehmen. In Bezug auf das Ansprechen von
Steuerelementen mittels VBA gibt es jedoch eine wichtige Limitation in den Microsoft
Office-Programmen Excel, Word und PowerPoint der Version 97 und 2000 (Anmerkung des
Autors: Ob auch Microsoft Office XP/2002 und 2003 betroffen sind, konnte noch nicht
herausgefunden werden):
| Obwohl praktisch unbegrenzt viele Steuerelemente auf einem Benutzerformular angeordnet werden dürfen, können nur die ersten 411 Steuerelemente, die hinzugefügt wurden, mit VBA-Code direkt angesprochen werden können. Wird im Code ein Steuerelement direkt referenziert, welches nach dem 411. Steuerelement hinzugefügt wurde, so stürzt Microsoft Excel sofort ab. |
Eine direkte Referenzierung erfolgt über den Objektnamen, also z.B. "TextBox450" bei einem TextBox-Steuerelement.
Die Anzahl Steuerelemente eines Benutzerformulares können Sie unter anderem im Direktfenster des VBA-Editors anhand der Anweisung
?UserForm1.Controls.Count
sehr einfach abfragen. Beachten Sie bitte, dass durch diese Abfrage das VBA-Projekt vorübergehend in den Ausführungsmodus (Run Time Mode) versetzt wird. Das bedeutet, dass das Initialize-Ereignis der UserForm ausgelöst und der in dieser Ereignisprozedur enthaltene Programmcode ausgeführt wird. Das Terminate-Ereignis dagegen wird nicht ausgeführt, und auch andere Formular-Ereignisse wie Form_Activate, Form_Deactivate und Form_QueryClose bleiben unbeachtet. Sie sollten den in der Prozedur Form_Initialize stehenden Programmcode zuerst auskommentieren (am einfachsten über die VBA-Editor-Schaltfläche "Block auskommentieren") oder auf der ersten Codezeile die Anweisung "Exit Sub" einfügen, damit der Programmcode nicht ausgeführt wird. Das Einschalten des Entwurfsmodus zeigt in diesem Fall keine Wirkung (er deaktiviert normalerweise Ereignisse), da die Abfrage im Direktfenster den Laufzeitmodus aktiviert und somit den Entwurfsmodus ausschaltet.
Es existieren mehrere Lösungsvarianten, wie man das Problem mit der direkten Steuerelement-Referenzierung beheben bzw. umgehen kann:
1. Verteilen Sie die Steuerelemente auf mehrere
Benutzerformulare
Verschieben Sie so lange Steuerelemente auf andere, neue Benutzerformulare, bis das
Formular weniger als 412 Steuerelement besitzt. Bei 411 oder weniger Steuerelementen tritt
die oben beschriebene Problematik nicht auf.
2. Reorganisieren Sie die Reihenfolge der
Steuerelemente
Verschieben Sie diejenigen Steuerelemente in die Zwischenablage, die Sie nicht mit
VBA-Code ansprechen. Fügen Sie anschliessend die Controls aus der Zwischenablage in
Benutzerformular ein. Dadurch ändert sich die Reihenfolge der hinzugefügten
Steuerelemente. Wenn Sie beispielsweise zuerst ein Bezeichnungsfeld und danach ein
Textfeld der UserForm hinzufügen, besitzt das Bezeichnungsfeld die Nummer 1 und das
Textfeld die Nummer 2 in der internen Reihenfolge der hinzugefügten Controls. Wird das
Bezeichnungsfeld ausgeschnitten, erhält das Textfeld die Nummer 1, da das ehemalige
Steuerelement mit der Nummer 1 nicht mehr existiert. Wenn Sie dann das Bezeichnungsfeld
aus der Zwischenablage wieder einfügen, erhält es automatisch die Nummer 2 (bzw. es wird
ans Ende der internen Steuerelement-Liste gestellt).
Oft befinden sich auf einem Benutzerformulare mehrere Steuerelemente, die nicht aktiv im VBA-Code angesprochen werden, da sie nur zur Ausgabe von statischen Daten verwendet werden. Es handelt sich dabei gewöhnlich um Steuerelemente vom Typ Bezeichnungsfeld (Label) und Anzeige (Image). Angenommen das Bezeichnungsfeld "Label67" wird nicht im Programmcode angesprochen, so kann es via Zwischenablage ausgeschnitten und neu eingefügt werden. Bei diesem Control spielt es nämlich keine Rolle, ob es das 67-ste, das 412-te oder das 600-ste hinzugefügte Steuerelement ist.
Mit dieser VBA-Prozedur können Sie den Control-Index eines bestimmten Steuerelementes herausfinden (Beispiel "Label67"):
Sub GetControlIndex()
Dim intControl As Integer
For intControl = 0 To UserForm1.Controls.Count - 1
If UserForm1.Controls(intControl).Name = "Label67" Then
MsgBox "Label67: Index " & CStr(intControl)
Exit Sub
End If
Next intControl
End Sub
Wenn die angezeigte Indexnummer kleiner als 411 ist und das Benutzerformular mehr als 411 Steuerelemente enthält, kann "Label67" wie oben beschrieben ausgeschnitten und neu eingefügt werden.
3. Verwenden Sie die indirekte
Steuerelement-Referenzierung
Sie können sämtliche Steuerelemente eines Benutzerformulares indirekt ansprechen,
ohne dass das Office-Programm abstürzt. Die indirekte Referenzierung erfolgt anhand der Controls-Auflistung,
indem man den Control-Index angibt. Beispielsweise diese Anweisung funktioniert
fehlerfrei:
UserForm1.Controls(450).Text = "Hallo"
- oder -
UserForm1.Controls.Item(450).Text = "Hallo"
Die Zuweisung des Textes "Hallo" ist allerdings nur möglich, wenn es sich beim Control mit dem Index 450 um ein Steuerelement handelt, welches die Eigenschaft "Text" kennt (i.d.R. Steuerelement-Typ "TextBox"). Beachten Sie zudem, dass der Index bei 0 beginnt, d.h. dass das Control mit dem Index 450 das 451-ste Control auf dem Benutzerformular darstellt.
Auch For-Each-Schleifen funktionieren problemlos. Hier ein Beispiel zum Ausgeben der Steuerelement-Namen:
Sub GetControlNames()
Dim ctlControl As Control
For Each ctlControl In UserForm1.Controls
MsgBox ctlControl.Name
Next
End Sub
Da jedes Steuerelement über die Name-Eigenschaft verfügt, funktioniert die obige Prozedur ohne Fehler. Wenn Sie auf eine Eigenschaft zugreifen möchten, die nicht bei jedem Steuerelement vorhanden ist, müssen Sie prüfen, um was für einen Typ Steuerelement es sich handelt. Mit der TypeName-Funktion kann der Typ eines Steuerelementes festgestellt werden. Das folgende Beispiel zeigt, wie man Bezeichnungsfelder, Schaltflächen und Textfelder korrekt behandelt:
Sub GetControlTextOrCaption()
Dim ctlControl As Control
For Each ctlControl In UserForm1.Controls
If TypeName(ctlControl) = "TextBox" Then
MsgBox ctlControl.Text
ElseIf TypeName(ctlControl) = "Label" Or TypeName(ctlControl)
= "CommandButton" Then
MsgBox ctlControl.Caption
End If
Next
End Sub
Hinweis
Das Exportieren und Importieren einer UserForm bringt keinen Erfolg, da
sich dadurch die Reihenfolge der auf einem Benutzerformular hinzugefügten Steuerelemente
nicht ändert. Auch das Bereinigen des VBA-Projektes mit den Tools Code Cleaner
oder vbClear hilft nicht.
Die beiden erwähnten Tools sind Freeware-Programme und können auf der Downloadseite heruntergeladen werden:
Anmerkung
In Visual Basic-Projekten kann ein Formular (Form) maximal 254
Steuerelemente enthalten, sofern keine so genannten Steuerelement-Arrays verwendet werden.
Jedes Steuerelement-Array kann bis zu 32'768 Steuerelemente aufnehmen.
Weitere Informationen über Steuerelemente in Visual Basic-Projekten erhalten Sie hier:
Weitere Informationen |
[V2] Maximale Länge
des Passwortes eines VBA-Projektes
Je nach Länge des gewählten
Passwortes nimmt der Zeitaufwand zum Ausprobieren sämtlicher möglichen
Zeichenkombinationen überproportional zu.
Ausprobieren aller Kombinationsmöglichkeiten
Nehmen wir einmal an, als gültige Zeichen für das Passwort sind alle
Buchstaben, Ziffern und 10 Sonderzeichen (Plus-Zeichen, Bindestrich usw.) zugelassen. Das
ergibt 46 verschiedene mögliche Zeichen: 26 Buchstaben (A-Z), 10 Ziffern (0-9) sowie 10
Sonderzeichen.
Als Performance zum Durchprobieren der Kombinationen nehmen wir einen Durchsatz von 100 Möglichkeiten pro Sekunde an, was zwar ein eher optimistischer Wert ist, aber mit sauber programmiertem VBA-Code und einer schneller CPU erreicht werden kann. Gäbe es also 1'000 Möglichkeiten für das Zusammensetzen der zugelassenen Zeichen für ein Passwort, so würde man 10 Sekunden benötigen, um alle Kombinationen auszuprobieren. Es gibt allerdings bedeutend mehr als nur 1'000 Möglichkeiten, wie die folgenden Rechenbeispiele zeigen.
Zweistelliges Passwort
Ein zweistelliges Passwort umfasst 2'116 Kombinationsmöglichkeiten
(=46*46 bzw. 46^2).
Das Ausprobieren aller Kombinationen dauert 21.16 Sekunden.
Dreistelliges Passwort
Ein dreistelliges Passwort umfasst 97'336 Kombinationsmöglichkeiten
(=46*46*46 bzw. 46^3).
Das Ausprobieren aller Kombinationen dauert 973.36 Sekunden oder 16.22 Minuten.
Vierstelliges Passwort
Ein vierstelliges Passwort umfasst 4'477'456 Kombinationsmöglichkeiten
(=46*46*46*46 bzw. 46^4).
Das Ausprobieren aller Kombinationen dauert 44'774.56 Sekunden oder 746.24 Minuten
oder 12.43 Stunden.
Fünfstelliges Passwort
Ein fünfstelliges Passwort umfasst 205'962'976 Kombinationsmöglichkeiten
(=46*46*46*46*46 bzw. 46^5).
Das Ausprobieren aller Kombinationen dauert 2'059'629.76 Sekunden oder 34'327.16
Minuten oder 572.12 Stunden oder 23.83 Tage.
Sechsstelliges Passwort
Ein sechsstelliges Passwort umfasst 9'474'296'896
Kombinationsmöglichkeiten (=46*46*46*46*46*46 bzw. 46^6).
Das Ausprobieren aller Kombinationen dauert 94'742'968.96 Sekunden oder
1'579'049.48 Minuten oder 26'317.49 Stunden oder 1'096.56 Tage oder 3.01 Jahre.
Zehnstelliges Passwort
Ein zehnstelliges Passwort umfasst 42'420'747'482'776'576
Kombinationsmöglichkeiten (=46^10).
Das Ausprobieren aller Kombinationen dauert 424'207'474'827'765.76 Sekunden oder
7'070'124'580'462.76 Minuten oder 117'835'409'674.37 Stunden oder 4'909'808'736.43 Tage
oder 13'455'030.78 Jahre.
Fünfzehnstelliges Passwort
Ein fünfzehnstelliges Passwort umfasst 8'737'103'395'697'172'336'050'176
Kombinationsmöglichkeiten (=46^15).
Das Ausprobieren aller Kombinationen dauert 2'770'517'312'182'005.43 Jahre.
Anmerkung: Würde man jede Kombination in eine Zelle eines Excel-Tabellenblattes
eintragen (ein Tabellenblatt umfasst 16'777'216 Zellen; 256 Spalten * 65'536 Zeilen), so
würde man über 520'771'944'266'389'151 Tabellenblätter füllen.
Schlussbemerkung
Die obigen Beispiele gehen davon aus, dass 46 verschiedene Zeichen für
ein Passwort erlaubt sind. Wäre auch nur ein einziges Zeichen mehr erlaubt, also
insgesamt 47 Zeichen, so würde man zusätzliche 1'054'745'356'140'029.14 Jahre
benötigen, d.h. total 3'825'262'668'322'034.57 Jahre, um ein fünfzehnstelliges Passwort
durchzuprobieren.
In der Realität können nicht nur 46 bzw. 47 Zeichen verwendet werden sondern ca. 72 verschiedene Zeichen, da die 26 Buchstaben A bis Z in Gross- und Kleinschrift geschrieben werden können.
[V3] Erlaubte
Tab-Schrittweite
Wird eine Schrittweite gewählt, die
nicht im Bereich von 1 bis 32 liegt, erscheint folgende Fehlermeldung:

Abbildung: Tab-Schrittweite muss im Bereich von 1 bis 32 liegen
Fehlermeldungen des VBA-Editors infolge Überschreiten einer Limitation
Vor allem wenn ein VBA-Projekt zu gross wird oder zu viele Variablen enthält, tritt eine Fehlermeldung auf. Der VBA-Editor kennt in diesem Zusammenhang sechs verschiedene Fehlermeldungen, die nachfolgend vorgestellt werden.
Meldung: "Unveränderliche oder statische Daten können maximal 64 KB umfassen"
Konstante und statische Daten umfassen nicht automatische Variablen, Zeichenfolgen fester Länge und Datenfelder fester Grösse. Für diesen Fehler gibt es die folgenden Ursachen und Lösungen:
» Verringern Sie die deklarierte Datenmenge. Obwohl Daten auf Modulebene 64 KB nicht überschreiten dürfen, können Zeichenfolgen variabler Länge und Datenfelder auf Modulebene diesen Wert überschreiten.
» Verringern Sie die deklarierte Datenmenge dieses Typs. Statische Daten aus allen Prozeduren in einem Modul sind zusammengenommen auf maximal 64 KB beschränkt (nicht auf 64 KB pro Prozedur). Statische Zeichenfolgen variabler Länge und Datenfelder können diesen Wert überschreiten.
» Verringern Sie die Grösse des benutzerdefinierten Typs. Die Grösse eines benutzerdefinierten Typs entspricht im allgemeinen der Summe der einzelnen Elementgrössen. Auf einigen Plattformen können Lücken zwischen den Elementen entstehen, um die Elemente an Wortgrenzen auszurichten. Wenn Sie einen benutzerdefinierten Typ in einem anderen benutzerdefinierten Typ verschachteln, muss ausserdem die Grösse des eingeschlossenen Typs bei der Grösse des neuen Typs berücksichtigt werden.
» Obwohl die Grössenbeschränkung für Variablen benutzerdefinierter Typen auf Modulebene 64 KB beträgt, dürfen Variablen eines benutzerdefinierten Typs in Prozeduren nicht grösser als 32 KB sein. Verkleinern Sie die Variable des benutzerdefinierten Typs, oder verwenden Sie eine Variable auf Modulebene.
» Verkürzen Sie die Zeichenfolge fester Länge. Bei Zeichenfolgen variabler Länge gilt diese Einschränkung nicht.
Meldung: "Zu viele lokale, nichtstatische Variablen"
Lokale, nichtstatische Variablen sind Variablen, die in einer Prozedur definiert und bei jedem Aufruf der Prozedur neu initialisiert werden. Für diesen Fehler gibt es die folgende Ursache und Lösung:
» Deklarieren Sie, wo dies möglich ist, einige der Variablen mit der Static-Anweisung. Static-Variablen behalten im Gegensatz zu nichtstatischen Variablen zwischen den Prozeduraufrufen ihren Wert, weil ihnen verschiedene Speicherressourcen zugeordnet werden.
Prozeduren dürfen von Anfang bis Ende maximal 64 KB umfassen, aber da Sprünge innerhalb einer Prozedur vorwärts oder rückwärts erfolgen können, sind derartige Sprünge auf 32'767 Bytes in beiden Richtungen beschränkt. Für diesen Fehler gibt es die folgenden Ursachen und Lösungen:
» Verschieben Sie die Zielmarke näher an die Sprunganweisung, oder verkleinern Sie die Prozedur.
» Verkleinern Sie die Schleife.
» Verkleinern Sie den Abschnitt der Struktur, der mehr als 32 KB umfasst.
Der kompilierte Code einer Prozedur darf 64 KB nicht überschreiten. Für diesen Fehler gibt es die folgende Ursache und Lösung:
» Teilen Sie diese und andere grosse Prozeduren in zwei oder mehrere kleinere Prozeduren auf.
Meldung: "Zu viele Variablen auf Modulebene"
Variablen auf Modulebene werden im Deklarationsabschnitt eines Moduls vor den Prozeduren des Moduls deklariert. Für diesen Fehler gibt es die folgende Ursache und Lösung:
» Dies stellt die Speichergrenze für dieses Modul dar. Sie können gegebenenfalls einige der Variablen als Public in einem anderen Modul deklarieren, oder, wenn einige Variablen auf Modulebene nur in einer Prozedur verwendet werden, können Sie sie in dieser Prozedur deklarieren. Wenn Sie Variablen auf Modulebene deklariert haben, weil sie zwischen Prozeduraufrufen ihren Wert behalten sollen, können diese auch in der Prozedur, in der sich der Verweis befindet, als Static deklariert werden.
Anmerkung
Der verfügbare Speicherplatz kann bei den unterschiedlichen Betriebssystemen
variieren.
Meldung: "Nicht genügend Speicher. Einige Überwachungsausdrücke können gelöscht worden sein"
Wenn Ihrem System nicht mehr genügend Speicher zur Verfügung steht, wird Speicherplatz durch Löschen von Überwachungsausdrücken bereitgestellt, damit die Ausführung fortgesetzt werden kann. Für diesen Fehler gibt es die folgende Ursache und Lösung:
Wenn Sie Ihre Arbeit fortsetzen möchten, entfernen Sie alle nicht benötigten Elemente aus dem Speicher, einschliesslich nicht benötigter Anwendungen, Projekte oder Module, die geladen sein könnten.
Haben Sie Fragen,
Anregungen oder einen Fehler entdeckt?
Kontakt zum Autor
Zuletzt aktualisiert am
26.01.2006 / 19:00 Uhr
Zuletzt kontrolliert am 22.12.2008 / 07:00 Uhr
© 2002-2009 by Philipp von Wartburg, Schweiz
Alle Rechte vorbehalten