🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Array in Excel — deklarieren, durchlaufen & Bereiche 100× schneller lesen (7 Beispiele)

|

VBA Array in Excel — deklarieren, durchlaufen & Bereiche 100× schneller lesen (7 Beispiele)

Getestet mit: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 05.06.2026

Kurz gesagt — Ein Array ist eine Variable mit vielen Fächern. Der entscheidende Kniff in Excel VBA: einen ganzen Bereich in ein Array lesen, im Speicher arbeiten und einmal zurückschreiben — statt Zelle für Zelle zu berühren:

Sub SchnellesUpdate()
    Dim arr As Variant
    arr = Range("A2:C10000").Value2          ' EIN Lesen -> 2D-Array

    Dim i As Long
    For i = 1 To UBound(arr, 1)
        arr(i, 3) = arr(i, 2) * 1.1          ' im Speicher arbeiten (sofort)
    Next i

    Range("A2:C10000").Value2 = arr          ' EIN Schreiben
End Sub

Bei 10.000 Zeilen ist das der Unterschied zwischen ~8 Sekunden und ~0,1. Der Rest dieser Anleitung führt zu dieser Zeile und ihren Stolperfallen hin.

Warum Arrays — und was sie sind

Eine normale Variable hält einen Wert. Ein Array hält eine Liste von Werten unter einem Namen, erreichbar über einen Index:

Dim noten(1 To 3) As Long
noten(1) = 90
noten(2) = 75
noten(3) = 60

Wozu der Aufwand? Tempo und Struktur. Jedes Mal, wenn VBA eine Zelle liest oder schreibt, überquert es eine langsame Grenze zwischen Code und Excel. Ein Array liegt im Speicher, daher ist das Durchlaufen von 10.000 Array-Fächern tausendfach schneller als das Durchlaufen von 10.000 Zellen.

Beispiel 1 — Statische Arrays und der Index-Ursprung

Ein statisches Array hat eine feste Größe, die Sie bei der Deklaration festlegen. Geben Sie die Grenzen ausdrücklich an, damit Sie nie raten müssen:

Dim monate(1 To 12) As String      ' Indizes 1..12 — lesbar
Dim nullBasiert(0 To 9) As Double   ' Indizes 0..9

Tipp: Schreiben Sie immer (1 To n) statt (n). Dim a(10) erzeugt tatsächlich 11 Fächer (0–10), sofern Sie nicht Option Base 1 setzen. Das ausgeschriebene (1 To 10) lässt keinen Zweifel.

Beispiel 2 — Dynamische Arrays mit ReDim

Wenn Sie die Größe vorher nicht kennen, deklarieren Sie ein leeres Array und dimensionieren es später mit ReDim:

Dim namen() As String
Dim n As Long
n = Cells(Rows.Count, 1).End(xlUp).Row - 1   ' Datenzeilen

ReDim namen(1 To n)                          ' jetzt dimensionieren
Dim i As Long
For i = 1 To n
    namen(i) = Cells(i + 1, 1).Value
Next i

Ein einfaches ReDim löscht den Inhalt. Um Vorhandenes zu behalten, nutzen Sie ReDim Preserve.

Beispiel 3 — ReDim Preserve (und seine eine große Falle)

ReDim Preserve ändert die Größe, ohne Daten zu verlieren — perfekt für eine wachsende Liste:

Dim treffer() As String
Dim anzahl As Long
anzahl = 0

Dim zelle As Range
For Each zelle In Range("A2:A100")
    If zelle.Value <> "" Then
        anzahl = anzahl + 1
        ReDim Preserve treffer(1 To anzahl)  ' um eins wachsen, Rest behalten
        treffer(anzahl) = zelle.Value
    End If
Next zelle

Die Falle: Bei einem 2-D-Array kann ReDim Preserve nur die letzte Dimension ändern. ReDim Preserve raster(1 To 5, 1 To 10) geht, wenn sich nur die 10 ändert; ändert sich die 5, gibt es „Index außerhalb des gültigen Bereichs". Lösung: die wachsende Achse als letzte Dimension speichern oder transponieren.

Beispiel 4 — UBound und LBound (die Größe nie fest verdrahten)

Fragen Sie das Array nach seiner Größe, statt sie anzunehmen:

Dim arr As Variant
arr = Array("Mo", "Di", "Mi")                ' ein 0-basiertes Array

Dim i As Long
For i = LBound(arr) To UBound(arr)           ' egal welcher Ursprung
    Debug.Print arr(i)
Next i

Bei einem 2-D-Array aus einem Bereich geben Sie die Dimension an: UBound(arr, 1) ist die Zeilenzahl, UBound(arr, 2) die Spaltenzahl.

Beispiel 5 — Einen Bereich in ein Array lesen (der 100×-Trick)

Das ist der ganze Grund, Arrays zu lernen. IrgendeinBereich.Value2 liefert in einem einzigen Lesevorgang ein zweidimensionales, 1-basiertes Array:

Sub SpalteSchnellSummieren()
    Dim arr As Variant
    arr = Range("A2:C10000").Value2          ' arr(Zeile, Spalte), beide 1-basiert

    Dim summe As Double, i As Long
    For i = 1 To UBound(arr, 1)
        summe = summe + arr(i, 2)            ' Spalte 2 = Menge
    Next i

    MsgBox "Gesamtmenge: " & summe
End Sub

Zwei Dinge merken:

  1. Das Ergebnis ist immer 1-basiertarr(1, 1) ist die obere linke Zelle, unabhängig von Option Base.
  2. Eine einzelne Zelle ergibt kein Array. Range("A1").Value2 ist nur der Wert; erst ein mehrzelliger Bereich wird zum 2-D-Array.

Beispiel 6 — Ein Array mit For Each durchlaufen

Wenn Sie nur die Werte brauchen (nicht ihre Position), liest sich For Each am saubersten:

Dim regionen As Variant
regionen = Array("Nord", "Süd", "Ost", "West")

Dim r As Variant
For Each r In regionen
    Debug.Print r
Next r

Beispiel 7 — Arrays schnell mit Array() und Split() bauen

Zwei Einzeiler, die einen Stapel Zuweisungen sparen:

' Array() — eine schnelle Literalliste (0-basiert)
Dim tage As Variant
tage = Array("Mo", "Di", "Mi", "Do", "Fr")

' Split() — Text mit Trennzeichen in ein Array verwandeln (0-basiert)
Dim teile As Variant
teile = Split("Apfel;Banane;Kirsche", ";")
Debug.Print teile(0)        ' Apfel
Debug.Print UBound(teile)   ' 2  (drei Elemente, 0..2)

Join(teile, ", ") macht das Gegenteil — Array zurück in eine Zeichenfolge.

Häufige Array-Fehler (und die Lösung)

Symptom Ursache Lösung
„Index außerhalb des gültigen Bereichs" bei arr(i) i liegt außerhalb von LBound..UBound LBound(arr) To UBound(arr) durchlaufen
Array hat ein zusätzliches leeres Fach Dim a(10) ergab 0..10 = 11 Fächer (1 To 10) deklarieren
ReDim Preserve scheitert bei 2-D-Array Nur die letzte Dimension darf wachsen Wachsende Achse nach hinten oder transponieren
Range("A1").Value2 ist kein Array Eine einzelne Zelle ergibt einen Skalar Einen mehrzelligen Bereich lesen
Zurückgeschriebene Daten verrutscht Schreibbereich anders groß als arr In einen Bereich exakt der Array-Größe schreiben

Lassen Sie die Array-Klempnerei — beschreiben Sie die Umwandlung

Arrays sind schnell, aber ReDim Preserve, UBound(arr, 2) und die 1-gegen-0-Basis-Buchführung sind genau die Details, die aus fünf Minuten einen Nachmittag machen. ExcelMaster Agent lässt Sie das Ziel nennen — „lade die ganze Tabelle, erhöhe jeden Preis um 10 % und schreibe sie zurück" — und erzeugt das Lesen-ins-Array-Verarbeiten-Zurückschreiben-Muster samt korrekter Grenzen. Kostenlos testen →

Weitere Anleitungen

FAQ

Was macht ein Array in VBA? Ein Array speichert viele Werte derselben Art unter einem Namen, erreichbar über einen Index (arr(1), arr(2)…). So lesen und verarbeiten Sie eine Datenliste im Speicher, weit schneller als dieselben Daten Zelle für Zelle.

Wie nutze ich ein Array statt eines Bereichs in Excel VBA? Lesen Sie den Bereich in einem Zug in ein Array — arr = Range("A1:C10000").Value2 — durchlaufen Sie es mit UBound und schreiben Sie es mit Range(...).Value2 = arr zurück. So ersetzen Sie tausende langsame Zellzugriffe durch ein Lesen und ein Schreiben.

Was ist der Unterschied zwischen ReDim und ReDim Preserve? ReDim ändert die Größe eines dynamischen Arrays und löscht den Inhalt. ReDim Preserve ändert die Größe und behält die Werte — bei einem 2-D-Array aber nur die letzte Dimension.

Warum ist mein VBA-Array 0-basiert? Arrays aus Array() und Split() beginnen standardmäßig bei Index 0 (außer mit Option Base 1). Arrays aus einem Bereich (.Value2) sind immer 1-basiert. Durchlaufen Sie LBound(arr) To UBound(arr), dann spielt der Ursprung keine Rolle.

Wie ermittle ich die Länge eines VBA-Arrays? Mit UBound(arr) - LBound(arr) + 1. Bei einem 2-D-Array aus einem Bereich ist die Zeilenzahl UBound(arr, 1) und die Spaltenzahl UBound(arr, 2).