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 nichtOption Base 1setzen. 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 Preservenur die letzte Dimension ändern.ReDim Preserve raster(1 To 5, 1 To 10)geht, wenn sich nur die10ändert; ändert sich die5, 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:
- Das Ergebnis ist immer 1-basiert —
arr(1, 1)ist die obere linke Zelle, unabhängig vonOption Base. - Eine einzelne Zelle ergibt kein Array.
Range("A1").Value2ist 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
- VBA Range in Excel — Zellen ansprechen, lesen & schreiben
- VBA Dictionary in Excel — Nachschlagen, Duplikate entfernen & Gruppieren
- VBA For-Schleife in Excel — 8 Praxisbeispiele
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).
