TOP

VBA-Lektion 13.2. Verwenden von Arrays (Arrays) (Fortsetzung)


Um mehr als eine Datenspalte zu speichern, benötigen wir eine andere Dimension des Arrays. Beispiel:

Daten in einem zweidimensionalen Array speichern:

 'Erklärung
 Dim array_example(10, 2) '11 x 3 „definiertes“ Array

 'Daten in einem Array speichern
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

Hier sind einige Beispiele für die Arbeit mit diesen Werten:

MsgBox array_example(0, 0)  '=> Rückgabe: 03.11.2026
MsgBox array_example(0, 1)  '=> gibt zurück: 24
MsgBox array_example(9, 2)  '=> gibt zurück: NO
MsgBox array_example(10, 2) '=> gibt zurück: YES

Dynamisches Array

Stellen wir uns für einen Moment vor, dass wir die Daten in unserem Array regelmäßig aktualisieren müssen und daher zum Zeitpunkt der Deklaration keine festen Werte zuweisen können ...

Um die Zeilennummer der letzten nicht leeren Zelle, also der letzten Zeile unserer Datenbank, herauszufinden, verwenden wir die folgende Formel:

last_row = Range("A1").End(xlDown).Row

Excel akzeptiert keine Variablen in der Deklaration.

Deklarieren Sie stattdessen ein dynamisches Array (mit leeren Klammern) und definieren Sie dann seine Größe mit Redim:

Dim array_example()
ReDim array_example(last_row - 2, 2)

Mit dem folgenden Verfahren können Sie alle Zeilen Ihres Datensatzes (Tabelle) in unserem Array speichern:

Dim array_example()
ReDim array_example(last_row - 2, 2)

Ubound

Im vorherigen Beispiel war die letzte Zahl in unserem Array last_row - 2:

For i = 0 To last_row - 2

Eine andere Möglichkeit, die letzte Zahl in unserem Array zu ermitteln, könnte die Verwendung von Ubound sein:

For i = 0 To UBound(array_example)

Diese Funktion gibt die größte Zahl im Array für die ausgewählte Dimension zurück (die erste Dimension ist die Standardeinstellung).

Hier sind einige Beispiele, die dies deutlicher machen sollen:

Sub example()
     Dim array_example(10, 2)
     
     MsgBox UBound(array_example)    '=> gibt zurück: 10
     MsgBox UBound(array_example, 1) '=> gibt zurück: 10
     MsgBox UBound(array_example, 2) '=> gibt zurück: 2
End Sub

Speichern von Daten in einer Reihe von Array-Elementen

Es ist möglich, ein Array mit Werten aus einem Bereich von Zellen in einem Arbeitsblatt zu füllen, ohne eine Schleife zu verwenden:

 'Erklärung
 Dim array_example(10, 2) '11 x 3 „definiertes“ Array

 'Daten in einem Array speichern
 For i = 0 To 10
     array_example(i, 0) = Range("A" & i + 2)
     array_example(i, 1) = Range("B" & i + 2)
     array_example(i, 2) = Range("C" & i + 2)
 Next

Der vorangehende Code kann effektiv durch diesen ersetzt werden:

 'Erklärung
 Dim array_example()

 'Daten in einem Array speichern
 array_example = Range("A2:C12").Value

Obwohl die zweite Methode attraktiver zu sein scheint als die erste, sollten Sie bedenken, dass die Implementierung in den meisten Fällen mehr Zeit kosten kann als die erste.

Wenn Sie die Daten auf diese Weise in Ihrem Array speichern, ist die erste Zahl 1 statt 0, was zu Verwirrung führen kann ...

Wenn Sie sich später beim Erweitern des Codes dafür entscheiden, nur Daten im Array zu speichern, die bestimmten Suchkriterien entsprechen (oder eine völlig andere Operation ausführen), müssen Sie den Code mit einer anderen Schleifenfunktion komplett neu schreiben ...

Diese zweite Methode ist jedoch sehr nützlich, wenn Sie den gesamten Inhalt eines großen Datensatzes speichern müssen, da sie schneller ist als eine Schleife (Einsparung von etwa 0,2 Sekunden pro 15.000 Datensätze).

Array (Array)

Wenn Sie jedoch ein Array mit „festen“ Inhalten erstellen müssen.

Eine Lösung könnte darin bestehen, die Werte Band für Band aufzuzeichnen:

Dim en(5)

en(0) = "IF"
en(1) = "VLOOKUP"
en(2) = "SUM"
en(3) = "COUNT"
en(4) = "ISNUMBER"
en(5) = "MID"

Glücklicherweise können Sie diesen Code vereinfachen, indem Sie ein Array (Array) verwenden:

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")

Hier ist eine Demonstration der Verwendung der Funktion Replace (dies wird Ihnen helfen, das folgende Beispiel zu verstehen):

Sub replace_example()
     Dim var_translate As String

     'Textband für dieses Beispiel
     var_translate = "Hello World !"
     
     'Ersetzen Sie im Textband „Welt“ durch „Sie“.
     var_translate = Replace(var_translate, "World", "you")

     'Klebeband nach dem Austausch
     MsgBox var_translate '=> gibt „Hallo du!“ zurück
End Sub

Wenn wir nun eine Reihe von Werten durch einen anderen Datensatz ersetzen möchten, ist die Verwendung von Arrays und der Funktion Array äußerst nützlich:

Sub translate() 'Ein vereinfachtes Beispiel für die Übersetzung von Formeln vom Englischen ins Französische
     Dim var_translate As String

     'Textband für dieses Beispiel
     var_translate = "Formula to translate : SUM(IF(ISNUMBER(A1:E1),A1:E1,0))"
     
     'Zwei Wertesätze
     en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
     fr = Array("SI", "RECHERCHEV", "SOMME", "NB", "ESTNUM", "STXT")
     
     'Ersetzen Sie „SI“ durch „IF“, „RECHERVEV“ durch „VLOOKUP“ usw.
     For i = 0 To UBound(en)
         var_translate = Replace(var_translate, en(i), fr(i))
     Next

     'Klebeband nach dem Austausch
     MsgBox var_translate '=> gibt „Formula zum Übersetzen: SOMME(SI(ESTNUM(A1:E1),A1:E1,0))“ zurück
End Sub

Text in Array konvertieren (VBA Split)

Mit der Funktion Split können wir die Zeichenfolge in Teile aufteilen und die resultierenden Werte in ein Array schreiben.

Gehen Sie wie folgt vor, um ein Menüband in ein Array umzuwandeln:

variable = "IF/VLOOKUP/SUM/COUNT/ISNUMBER/MID"

Verwenden Sie die VBA-Funktion Split und geben Sie das Trennzeichen an:

en = Split(variable, "/")

Das Array „en“ gibt die folgenden Werte zurück:

MsgBox en(0) '=> gibt zurück: IF
MsgBox en(1) '=> gibt zurück: VLOOKUP
MsgBox en(2) '=> gibt zurück: SUM
MsgBox en(3) '=> gibt zurück: COUNT
MsgBox en(4) '=> gibt zurück: ISNUMBER
MsgBox en(5) '=> gibt zurück: MID

Die folgenden drei Arrays geben ebenfalls dieselben Werte zurück:

en = Array("IF", "VLOOKUP", "SUM", "COUNT", "ISNUMBER", "MID")
en = Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")
en = Split("IF VLOOKUP SUM COUNT ISNUMBER MID", " ")

Das folgende Beispiel gibt den dritten Wert in der Zeichenfolge zurück:

MsgBox Split("IF,VLOOKUP,SUM,COUNT,ISNUMBER,MID", ",")(2) '=> gibt zurück: SUM

Die Umkehrung von Split ist die VBA-Funktion Join.

Diese Funktion sammelt die Werte eines Arrays in einem String.

MsgBox Join(Array(1, 2, 3, 4, 5), "") '=> gibt zurück: 12345