Rückkehr in VBA-Code-Beispiele

VBA – Deklarieren (Dim), Erstellen und Initialisieren von Array-Variablen

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.

vba option base

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.

array oeffentlich deklarieren

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.

array deklaration fehlermeldung

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.

statisches array beispiel

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.