VBA - Array-Variable deklarieren (Dim), erstellen und initialisieren

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.

Sie werden die Entwicklung der Website helfen, die Seite mit Ihren Freunden teilen

wave wave wave wave wave