VBA-Schleifen: Zellbereiche automatisch durchlaufen
Schleifen sind das Werkzeug, um in VBA wiederkehrende Schritte automatisch zu wiederholen – etwa jede Zeile einer Tabelle zu prüfen oder zu formatieren. Excel-VBA kennt dafür vor allem drei Varianten: For…Next, For Each…Next und Do While…Loop.
Beispieldaten
| A | B | |
|---|---|---|
| 1 | Produkt | Bestand |
| 2 | Notizbuch | 12 |
| 3 | Kugelschreiber | 0 |
| 4 | Textmarker | 5 |
| 5 | Locher | 0 |
For…Next – feste Anzahl Durchläufe
Am gängigsten, wenn du eine bekannte Zeilenanzahl durchlaufen willst:
Sub BestandPruefen()
Dim i As Long
Dim letzteZeile As Long
letzteZeile = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To letzteZeile
If Cells(i, 2).Value = 0 Then
Cells(i, 2).Interior.Color = RGB(255, 199, 199)
End If
Next i
End Sub
Cells(Rows.Count, 1).End(xlUp).Row ermittelt die letzte belegte Zeile in Spalte A – so läuft die Schleife immer korrekt bis zum Tabellenende, egal wie viele Zeilen es sind.
For Each…Next – über Zellen oder Objekte
Praktisch, wenn du nicht über Zeilennummern, sondern direkt über einen Zellbereich iterieren willst:
Sub BestandPruefenForEach()
Dim zelle As Range
For Each zelle In Range("B2:B5")
If zelle.Value = 0 Then
zelle.Interior.Color = RGB(255, 199, 199)
End If
Next zelle
End Sub
Do While…Loop – solange eine Bedingung gilt
Sinnvoll, wenn die Anzahl der Durchläufe vorher nicht feststeht:
Sub ZeilenZaehlenBisLeer()
Dim i As Long
i = 2
Do While Cells(i, 1).Value <> ""
i = i + 1
Loop
MsgBox "Letzte belegte Zeile: " & (i - 1)
End Sub
Schleifen mit direktem Zugriff auf Cells(i,...) sind bei großen Datenmengen langsam, weil jede Zeile einzeln in Excel geschrieben wird. Für Tausende von Zeilen lohnt es sich, den Bereich zuerst in ein Array (Range.Value) einzulesen, in der Schleife nur im Array zu rechnen und das Ergebnis am Ende in einem Rutsch zurückzuschreiben.
Bei Do While musst du selbst dafür sorgen, dass sich die Abbruchbedingung irgendwann ändert (hier i = i + 1). Fehlt das, läuft die Schleife endlos – Excel „hängt" scheinbar. Abbruch dann mit Strg+Untbr bzw. Esc.
Häufige Fehler
- Endlosschleife – Abbruchbedingung wird nie erfüllt, siehe Hinweis oben.
- Falscher Bereich – die letzte Zeile wurde fest verdrahtet (z. B.
To 100) statt dynamisch ermittelt; bei mehr Datensätzen werden dann Zeilen übersprungen. - Langsame Ausführung – bei jedem Schleifendurchlauf wird die Tabelle neu berechnet. Mit
Application.Calculation = xlCalculationManualzu Beginn undxlCalculationAutomaticam Ende beschleunigst du lange Schleifen spürbar.