VBA – Deklarieren (Dim), Erstellen und Initialisieren von Array-Variablen
In this Article
In diesem Lernprogramm wird gezeigt, wie man Array-Variablen in VBA deklariert (Dim), erstellt und initialisiert.
Was ist eine VBA-Array-Variable?
Eine VBA-Array-Variable kann man sich als eine Gruppe von Variablen vorstellen, die unter demselben Namen gespeichert werden und denselben Datentypen haben. Ein Array kann Text, Zahlen oder Objekte speichern.
Sie verweisen auf ein Element in einem Array über seine 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 – statische und dynamische. Bei einem statischen Array wird die Größe bei der ersten Deklaration des Arrays festgelegt. Es wird auch als festes Array bezeichnet.
Dim intA(4) As Integer
Das obige Array wird mit der Dim-Anweisung auf der Ebene einer Prozedur oder eines Moduls deklariert, und die Größe des Arrays ist 5, da wir die Untergrenze (Engl. LBound) des Arrays nicht angegeben haben.
Nein, das ist kein Tippfehler! Die Array-Größe ist 5, obwohl wir 4 in das Array eingegeben haben. Das liegt daran, dass die Array-Indizien automatisch bei Null beginnen.
Array-Indizien
Array-Indizien beginnen automatisch bei Null, es sei denn, Option Base 1 ist am Anfang Ihres Codemoduls deklariert.
Wenn die Option Base 1 deklariert ist, beginnen Arrays automatisch bei 1.
Ich halte es jedoch für problematisch, Variablen auf diese Weise zu deklarieren. Code-Prüfer wissen möglicherweise nicht, dass Arrays bei Null beginnen oder dass die Option Base 1 deklariert ist.
Stattdessen ziehe ich es vor, die Start- und Endpositionen von Arrays explizit zu deklarieren:
Dim intA(2 To 5) As Integer
Beachten Sie, dass Sie das Array bei jeder beliebigen Zahl beginnen können (nicht nur bei 1 oder 0), wenn Sie dies tun.
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.
Dim intA() As Integer
Sie können die ReDim-Anweisung verwenden, um die Größe des Arrays anzugeben, nachdem das Array erstellt wurde.
ReDim intA(2)
Sie können die Größe eines dynamischen Arrays jederzeit ändern. Wenn Sie die ReDim-Anweisung verwenden, werden jedoch alle vorhandenen Werte gelöscht. Um vorhandene Array-Werte zu erhalten, verwenden Sie stattdessen ReDim Preserve.
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.
Variant Arrays
Variant Arrays sind dynamische Arrays, die einfacher zu handhaben sind.
Dim varNamen()
Beachten Sie, dass Sie weder den Datentypen (es wird angenommen, dass es sich um Variant handelt) noch die Größe des Arrays angeben müssen.
Wie wir weiter unten sehen werden, können Sie variante Arrays mit der Array-Funktion initialisieren (Sie müssen die Größe der Arrays nicht zuerst anpassen)!
Modul & öffentliche Arrays deklarieren
Wie oben gezeigt, können Arrays innerhalb von Prozeduren deklariert werden, für die Verwendung innerhalb dieser Prozedur:
Sub StatischesArray()
'Das Array mit einer Untergrenze von 1 und einer Obergrenze von 4 deklarieren
Dim IntA(1 To 4) As Integer
End Sub
Sie können aber auch auf der Modul- oder Globalebene deklariert werden.
Option Explicit
'Das Array mit einer Untergrenze von 1 und einer Obergrenze von 4 deklarieren
Dim IntA(1 To 4) As Integer
Sub StatischesArray()
End Sub
In diesem Beispiel kann die Array-Variable an beliebiger Stelle in diesem Code-Modul aufgerufen werden. Stattdessen können Sie ein öffentliches Array deklarieren, das in Ihrem gesamten VBA-Projekt verwendet werden kann (siehe nächsten Abschnitt).
Deklaration eines öffentlichen Arrays
Sie deklarieren ein öffentliches statisches Array, wie Sie eine öffentliche Variable deklarieren würden.
Public strNamen(3) As String
Diese Deklaration muss am Anfang Ihres Moduls stehen, unterhalb von Option Explicit. Sie kann dann in Ihrem gesamten VBA-Projekt in jedem Modul oder jeder Prozedur verwendet werden.
Wenn Sie aber das Array am Anfang des Moduls mit dem Schlüsselwort Dim deklarieren, dann ist die Verwendung dieses Arrays auf dieses einzelne Modul beschränkt. Der Versuch, das Array in einem anderen Modul zu verwenden, würde zu einem Fehler führen.
Arrays initialisieren
Einem statischen Array können Sie auf folgende Weise Werte zuweisen.
Sub StatischesArray()
'Das Array mit einer Untergrenze von 1 und einer Obergrenze von 4 deklarieren
Dim IntA(1 To 4) As Integer
'Das Array initialisieren
IntA(1) = 10
IntA(2) = 20
IntA(3) = 30
IntA(4) = 40
'Das Ergebnis von Position 2 des Arrays im Direktfenster anzeigen
Debug.Print IntA(2)
End Sub
Wenn Sie die obige Prozedur ausführen, wird der Wert 20 im Direktfenster angezeigt.
Sie können die Werte auch auf die gleiche Weise einem dynamischen Array zuweisen
Sub DynamischesArray()
'Ein dynamisches Array deklarieren, aber die gebundenen Werte weglassen
Dim IntA() As Integer
'Das Array initialisieren
ReDim IntA(1 To 4)
IntA(1) = 10
IntA(2) = 20
IntA(3) = 30
IntA(4) = 40
'Das Ergebnis der Position 2 des Arrays im Direktfenster anzeigen
Debug.Print IntA(2)
End Sub
Array-Funktion
Bei einem reinen Variant-Array können Sie jedoch die Array-Funktion verwenden, was einfacher als die Standardmethode sein kann.
'Belegen des Arrays
IntA() = Array(10, 20, 30, 40)
Array mit Schleife auffüllen
Sie können Arrays auch auffüllen, indem Sie einen Bereich von Zellen in Excel mit einer Schleife durchlaufen.
Sub DynamischesArrayAusExcel_Test()
'Das Array deklarieren
Dim strNamen() As String
'Ein Integer deklarieren, um die Zeilen in einem Bereich zu zählen
Dim n As Integer
'Ein Integer für die Schleife deklarieren
Dim i As Integer
'Die Zeilen in einem Bereich zählen
n = Range("A1", Range("A1").End(xlDown)).Rows.Count
'Das Array auf die Anzahl der Zeilen im Bereich anpassen.
ReDim strNamen(n)
For i = 0 To n
strNamen(i) = Range("A1").Offset(i + 1, 0)
Next i
'Die Werte im Array anzeigen
MsgBox Join(strNamen())
End Sub
Neuinitialisierung von Arrays
Sie können Ihr Array in jeder Phase Ihres Codes neu initialisieren, aber Sie verlieren dann den ursprünglichen Wert, der an dieser Position in Ihrem Array enthalten ist.
Sub StatischesArray()
'Das Array mit einer Untergrenze von 1 und einer Obergrenze von 4 deklarieren
Dim IntA(1 To 4) As Integer
'Das Array intialisieren
IntA(1) = 10
IntA(2) = 20
IntA(3) = 30
IntA(4) = 40
'Das Ergebnis von Position 2 des Arrays im Direktfenster anzeigen
Debug.Print IntA(2)
'Das Array erneut initialisieren
intA(2)= 200
Debug.Print IntA(2)
End Sub
Im obigen Beispiel behält das statische Array alle Werte bei, mit Ausnahme des Wertes an Position 2. Dieser Wert wird auf 200 geändert.
ReDim verwenden
Wenn Sie ein dynamisches Array verwenden, wird die ReDim-Anweisung verwendet, um die Größe des Arrays festzulegen. Sie können die ReDim-Anweisung anschließend in Ihrem Code verwenden, um die Größe des Arrays so oft wie nötig zu ändern. Mit der folgenden Codezeile wird das Array intA neu initialisiert, so dass es eine Größe von 2 hat (denken Sie daran, dass ein Array-Index bei 0 beginnt!).
ReDim intA(1) As Integer
Der Code, der die ReDim-Anweisung enthält, würde also wie das folgende Beispiel aussehen.
Sub TestDynamischesArray()
'Das Array deklarieren
Dim intA() As Integer
ReDim intA(2)
'das Array mit Zahlen belegen
intA(0) = 2
intA(1) = 5
intA(2) = 9
'die Zahl an Position 1 anzeigen
Debug.Print intA(1)
'Neudimensionierung des Arrays, um die Größe zu ändern
ReDim intA(3)
intA(0) = 6
intA(1) = 8
'Diesmal die Zahl an Position 1 anzeigen
Debug.Print intA(1)
End Sub
Wenn Sie die obige Prozedur ausführen, würde der Wert 5 im Direktfenster angezeigt werden, und dann würde ein Wert von 8 angezeigt werden, sobald wir die Größe des Arrays mit ReDim geändert und es neu aufgefüllt haben. Da wir jedoch IntA(2) nicht aufgefüllt und ReDim Preserve nicht verwendet haben, wird der Wert an dieser Position im Array entfernt, und sowohl Position 3 als auch 4 im Array werden Null sein.
ReDim Preserve verwenden
Wenn wir ReDim Preserve verwenden, bleiben die ursprünglichen Werte im Array erhalten.
Sub DynamischesArrayTest()
'Das Array deklarieren
Dim intA() As Integer
ReDim intA(2)
'Belegt das Array mit Zahlen
intA(0) = 2
intA(1) = 5
intA(2) = 9
'die Zahl an Position 2 anzeigen
Debug.Print intA(2)
'Neudimensionierung des Arrays
ReDim intA(3)
intA(0) = 6
intA(1) = 8
'die Zahl an Position 2 wieder anzeigen
Debug.Print intA(2)
End Sub
In beiden oben angezeigten Meldungsboxen wird die Zahl 9 angezeigt, da die Anweisung ReDim Preserve diesen Wert an dieser Position beibehalten hat.