Dieses Tutorial zeigt, wie Sie Array-Variablen in VBA deklarieren (Dim), erstellen und initialisieren
Was ist eine VBA-Array-Variable?
Eine VBA-Array-Variable kann man sich als eine Gruppe von Variablen vorstellen, die unter demselben Namen gespeichert sind und denselben Datentyp haben. Ein Array kann Text, Zahlen oder Objekte speichern.
Sie verweisen auf ein Element in einem Array mit seiner Indexnummer.
Sie können eine Array-Variable auf die gleiche Weise wie jede andere Variable deklarieren, indem Sie das Schlüsselwort Dim, Static, Public oder Private verwenden.
Statische Arrays
Es gibt 2 Arten von Arrays - Statisch und Dynamisch. Ein statisches Array wird mit seiner Größe deklariert, wenn Sie das Array anfänglich deklarieren. Es wird auch als festes Array bezeichnet.
1 | Dim intA(4) als ganze Zahl |
Das obige Array wird mit der Dim-Anweisung auf Prozedur- oder Modulebene deklariert, und die Größe des Arrays beträgt 5, da wir den LBound-Wert des Arrays nicht deklariert haben.
Nein, das ist kein Tippfehler! Die Array-Größe ist 5, obwohl 4 in das Array eingegeben wurde. Dies liegt daran, dass Array-Indizes automatisch bei Null beginnen.
Array-Indizes
Array-Indizes beginnen automatisch bei Null, es sei denn Option Basis 1 wird oben in Ihrem Codemodul deklariert.
Wenn Option Basis 1 deklariert ist, starten Arrays automatisch bei 1.
Allerdings finde ich eine solche Deklaration von Variablen problematisch. Code-Reviewer sind sich möglicherweise nicht bewusst, dass Arrays bei Null oder der Deklaration Option Base 1 beginnen
Stattdessen ziehe ich es vor, die Start- und Endpositionen von Arrays explizit zu deklarieren:
1 | Dim intA(2 bis 5) als ganze Zahl |
Beachten Sie, dass Sie das Array dabei mit einer beliebigen Zahl beginnen können (nicht nur mit 1 oder 0).
Dynamische Arrays
Eine dynamische Array-Variable ist ein Array, dessen Größe zur Laufzeit geändert werden kann. Sie deklarieren dynamische Variablen ohne Größe.
1 | Dim intA() als ganze Zahl |
Sie können die ReDim-Anweisung verwenden, um die Größe des Arrays anzugeben, nachdem das Array erstellt wurde.
1 | ReDim intA(2) |
Sie können die Größe eines dynamischen Arrays jederzeit ändern. Bei Verwendung des ReDim-Statements werden jedoch alle vorhandenen Werte gelöscht. Um vorhandene Array-Werte beizubehalten, verwenden Sie ReDim Preserve stattdessen.
1 | ReDim Preserve intA(2) |
Sie können ein dynamisches Array auf Prozedur-, Modul- oder globaler Ebene deklarieren, aber Sie können die ReDim-Anweisung nur innerhalb einer Prozedur verwenden.
Varianten-Arrays
Variantenarrays sind dynamische Arrays, mit denen einfacher zu arbeiten ist.
1 | Dim varNames() |
Beachten Sie, dass Sie weder den Datentyp (es wird als Variante angenommen) noch die Array-Größe angeben müssen.
Wie wir unten sehen werden, können Sie Varianten-Arrays mit der Array-Funktion initialisieren (Sie müssen die Arrays nicht zuerst ändern)!
Modul und öffentliche Arrays deklarieren
Wie oben gezeigt, können Arrays innerhalb von Prozeduren zur Verwendung in dieser Prozedur deklariert werden:
1234 | Sub StaticArray()'das Array mit einem LBound-Wert von 1 und einem UBound-Wert von 4 deklarierenDim IntA(1 bis 4) als IntegerEnd Sub |
Sie können aber auch auf Modul- oder Globalebene deklariert werden.
1234567 | Option explizit'das Array mit einem LBound-Wert von 1 und einem UBound-Wert von 4 deklarierenDim IntA(1 bis 4) als IntegerSub StaticArray()End Sub |
In diesem Beispiel kann die Array-Variable überall innerhalb dieses Codemoduls aufgerufen werden. Stattdessen können Sie ein öffentliches Array deklarieren, das in Ihrem gesamten VBA-Projekt verwendet werden kann (siehe nächster Abschnitt).
Ein öffentliches Array deklarieren
Sie deklarieren ein öffentliches statisches Array wie eine öffentliche Variable.
1 | Öffentliche strNames(3) als String |
Diese Erklärung müsste oben in Ihrem Modul unter Option Explicit stehen. Es kann dann in Ihrem gesamten VBA-Projekt in jedem Modul oder jeder Prozedur verwendet werden.
Wenn Sie das Array oben im Modul deklarieren, jedoch mit dem Schlüsselwort Dim, dann ist die Verwendung dieses Arrays auf dieses einzelne Modul beschränkt. Der Versuch, das Array in einem separaten Modul zu verwenden, würde zu einem Fehler führen.
Arrays initialisieren
Sie können einem statischen Array wie folgt Werte zuweisen.
1234567891011 | Sub StaticArray()'das Array mit einem LBound-Wert von 1 und einem UBound-Wert von 4 deklarierenDim IntA(1 bis 4) als Integer'Array initialisierenIntA(1) = 10IntA(2) = 20IntA(3) = 30IntA(4) = 40'Ergebnis von Position 2 des Arrays im unmittelbaren Fenster anzeigenDebug.Print IntA(2)End Sub |
Wenn Sie das obige Verfahren ausführen, wird der Wert 20 im unmittelbaren Fenster angezeigt.
Auf die gleiche Weise können Sie die Werte auch einem dynamischen Array zuweisen
12345678910111213 | Unter DynamicArray()'ein dynamisches Array deklarieren, aber die gebundenen Werte weglassenDim IntA() als Integer'Array initialisierenReDim IntA(1 bis 4)IntA(1) = 10IntA(2) = 20IntA(3) = 30IntA(4) = 40'Ergebnis von Position 2 des Arrays im unmittelbaren Fenster anzeigenDebug.DruckenIntA(2)End Sub |
Array-Funktion
Jedoch, nur mit dem Varianten-Array, können Sie die Array-Funktion verwenden, die möglicherweise einfacher ist als die Standardmethode.
12 | 'das Array auffüllenintA() = Array(10, 20, 30, 40) |
Array mit Loop füllen
Sie können Arrays auch auffüllen, indem Sie einen Zellbereich in Excel durchlaufen
1234567891011121314151617 | Unter TestDynamicArrayFromExcel()'das Array deklarierenDim strNames() As String'eine ganze Zahl deklarieren, um die Zeilen in einem Bereich zu zählenDim n As Integer'eine ganze Zahl für die Schleife deklarierenDim i As Integer'zähle die Zeilen in einem Bereichn = Range("A1", Range("A1").End(xlDown)).Rows.Count'das Array auf die Anzahl der Zeilen im Bereich redimieren.ReDim-StrNames(n)Für i = 0 bis nstrNames(i) = Range("A1").Offset(i + 1, 0)Als nächstes'zeige die Werte im ArrayMsgBox Join(strNames())End Sub |
Arrays neu initialisieren
Sie können Ihr Array in jeder Phase Ihres Codes neu initialisieren, verlieren dann jedoch den ursprünglichen Wert, der an dieser Position in Ihrem Array enthalten ist.
1234567891011121314 | Sub StaticArray()'das Array mit einem LBound-Wert von 1 und einem UBound-Wert von 4 deklarierenDim IntA(1 bis 4) als Integer'Array initialisierenIntA(1) = 10IntA(2) = 20IntA(3) = 30IntA(4) = 40'Ergebnis von Position 2 des Arrays im unmittelbaren Fenster anzeigenDebug.Print IntA(2)'Array erneut initialisierenintA(2)= 200Debug.Print IntA(2)End Sub |
Im obigen Beispiel behält das statische Array alle Werte bei, außer dem Wert in Position 2 - dieser Wert ändert sich in 200.
Verwenden von ReDim
Wenn Sie ein dynamisches Array verwenden, wird die ReDim-Anweisung verwendet, um die Größe Ihres Arrays festzulegen. Sie können die ReDim-Anweisung anschließend in Ihrem Code verwenden, um die Größe des Arrays beliebig oft zu ändern. Die folgende Codezeile wird das intA-Array neu initialisieren, um eine Größe von 2 zu haben (Denken Sie daran, dass ein Array-Index bei 0 beginnt!)
1 | ReDim intA(1) als Integer |
Der Code einschließlich der ReDim-Anweisung würde also wie im folgenden Beispiel aussehen.
1234567891011121314151617 | Unter TestDynamicArray()'das Array deklarierenDim intA() As IntegerReDim intA(2)'das Array mit Zahlen füllenintA(0) = 2intA(1) = 5intA(2) = 9'zeige die Zahl an Position 1Debug.Print intA(1)'reimen Sie das Array, um die Größe zu ändernReDim intA(3)intA(0) = 6intA(1) = 8'zeige diesmal die Zahl an Position 1Debug.Print intA(1)End Sub |
Wenn Sie das obige Verfahren ausführen, wird der Wert 5 im unmittelbaren Fenster angezeigt, und dann wird ein Wert von 8 angezeigt, sobald wir die Größe des Arrays mit ReDim geändert und neu aufgefüllt haben. Da wir jedoch IntA(2) nicht aufgefüllt und Re-Dim Preserve nicht verwendet haben, wird der Wert an dieser Position im Array entfernt und sowohl Position 3 als auch 4 im Array sind Null.
Verwenden von ReDim Preserve
Wenn wir ReDim Preserve verwenden, werden die ursprünglichen Werte im Array beibehalten.
1234567891011121314151617 | Unter TestDynamicArray()'das Array deklarierenDim intA() As IntegerReDim intA(2)'das Array mit Zahlen füllenintA(0) = 2intA(1) = 5intA(2) = 9'zeige die Zahl an Position 2Debug.Print intA(2)'das Array redimierenReDim intA(3)intA(0) = 6intA(1) = 8'zeige die Zahl an Position 2 wieder anDebug.Print intA(2)End Sub |
In beiden oben angezeigten Meldungsfeldern wird die Zahl 9 angezeigt, da die ReDim Preserve-Anweisung diesen Wert an dieser Position beibehalten hat.