Getestet mit: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 05.06.2026
Kurz gesagt — Eine While-Schleife wiederholt Code, solange eine Bedingung wahr bleibt. Nehmen Sie sie, wenn Sie die Zeilenzahl vorher nicht kennen. Kopieren und anpassen:
Sub BisLeerDurchlaufen()
Dim i As Long
i = 2 ' in Zeile 2 starten
Do While Cells(i, 1).Value <> "" ' läuft, solange Spalte A Daten hat
Cells(i, 2).Value = Cells(i, 1).Value * 1.1
i = i + 1 ' der Schritt, der die Schleife beendet
Loop
End Sub
Die Geschichten vom eingefrorenen Excel gehen alle auf eine fehlende Zeile zurück. Verstehen Sie das Warum, und Sie schreiben nie wieder eine.
Die eine Idee: Eine Schleife ist ein Versprechen, dass sie endet — und Sie halten es
Eine For i = 1 To 100-Schleife endet von selbst. Die For-Anweisung besitzt den Zähler; sie kann nicht ewig laufen, selbst wenn Sie nichts tun.
Eine While-Schleife übergibt diese Verantwortung Ihnen. Sie läuft genau so lange, wie ihre Bedingung True ist, und hat keine Ahnung, wie sie diese Bedingung umlegt. Jede While-Schleife ist also ein Versprechen — „das wird irgendwann False" — und Sie halten es. Eine Endlosschleife ist kein Freak-Unfall; sie ist das, was in dem Moment passiert, in dem Sie das Versprechen brechen.
Diese Sicht sagt Ihnen, wann Sie überhaupt zur While-Schleife greifen: für eine unbekannte Anzahl — „bis die Daten enden", „bis die Datei öffnet". Wenn Sie die Durchläufe vorher beziffern können, wollen Sie For — und haben die Chance, das Versprechen zu brechen, gar nicht erst.
Die Regel, die das Versprechen hält: Initialisierung, Test, Schritt
Jede korrekte While-Schleife hat dieselben drei Teile. Benennen Sie sie, und die Endlosschleife lässt sich nicht mehr versehentlich schreiben:
i = 2 ' 1. INIT — die Variable setzen, die der Test liest
Do While Cells(i, 1).Value <> "" ' 2. TEST — das Versprechen: das wird False
' ... die Arbeit ...
i = i + 1 ' 3. SCHRITT — die Variable ZUM Ausgang bewegen
Loop
Eine Endlosschleife ist immer ein kaputter Teil 3: Der Schritt fehlt oder bewegt sich weg vom Ausgang (herunterzählen, wenn der Test will, dass der Wert wächst). „Warum stoppt meine Schleife nicht?" hat genau eine Antwort — finden Sie die Variable im TEST und prüfen Sie, ob der SCHRITT sie Richtung False drückt.
Das Schlüsselwort wählen — dasselbe Versprechen, klarere Absicht
| Form | Prüft das Versprechen | Wofür |
|---|---|---|
Do While ... Loop |
vor jedem Durchlauf | Der moderne Standard. Rumpf läuft evtl. 0-mal. |
Do Until ... Loop |
vor (stoppt, wenn wahr) | Liest sich als „bis fertig" — oft klarer. |
Do ... Loop While |
nach jedem Durchlauf | Wenn der Rumpf mindestens einmal laufen muss. |
While ... Wend |
vor jedem Durchlauf | Veraltet — kann kein Exit, in neuem Code vermeiden. |
Do While Bedingung und Do Until Bedingung sind dieselbe Schleife, zweimal gesagt — nehmen Sie, was sich natürlicher liest. Die eine echte Empfehlung: Do vor While...Wend, denn nur Do lässt Sie früh aussteigen.
' Prüfung am Ende — der Rumpf läuft immer einmal (z. B. abfragen, dann prüfen)
Do
n = InputBox("Geben Sie eine positive Zahl ein")
Loop While n <= 0
Das Versprechen unter realen Bedingungen halten
Steigen Sie aus, sobald Sie fertig sind — Exit Do schlägt eine Hilfsvariable und ist der Grund, Do vorzuziehen:
Do While Cells(i, 1).Value <> ""
If Cells(i, 1).Value < 0 Then
MsgBox "Erste negative Zahl in Zeile " & i
Exit Do
End If
i = i + 1
Loop
Hängt der Ausgang von der Außenwelt ab, geben Sie ein zweites Versprechen: eine harte Grenze. Dateien, Netzwerke und andere Apps fallen zeitweise aus, also kann eine Wiederholungsschleife, deren einziger Ausgang „es hat geklappt" ist, ewig laufen:
Dim versuche As Long
Do
versuche = versuche + 1
On Error Resume Next
Workbooks.Open "C:\Berichte\taeglich.xlsx"
On Error GoTo 0
If Not Workbooks Is Nothing Then Exit Do
Loop While versuche < 5 ' die Grenze als Reserve-Versprechen
Die Grenze versuche < 5 macht aus „selbstheilend" ein „kann nicht hängen". Jede Schleife, die auf externen Zustand wartet, sollte eine haben.
Wenn das Versprechen bricht: die Endlosschleife
Wenn nichts im Inneren die Bedingung False machen kann, zeigt Excel „reagiert nicht" und Sie haben das Versprechen gebrochen. Drei Prüfungen verhindern es jedes Mal:
- Ändert der SCHRITT die Variable, die der TEST liest? (
i = i + 1,n = n - 1, nächsten Datensatz lesen …) - Bewegt der SCHRITT sich zum Ausgang? (wachsen, wenn der Test
< 10will, nicht schrumpfen) - Hat eine Schleife mit externem Zustand eine Höchstgrenze?
Gerade in einer Endlosschleife gefangen? Drücken Sie Esc oder Strg + Untbr, um das Makro zu unterbrechen, und korrigieren Sie den SCHRITT vor dem Neustart.
Wann Sie die Schleife gar nicht schreiben sollten
Eine While-Schleife ist das richtige Werkzeug für „verarbeite, bis die Daten enden" — aber auch der häufigste Weg, auf dem aus einem laufenden Makro lautlos eine eingefrorene Arbeitsmappe wird. ExcelMaster Agent lässt Sie stattdessen das Ziel nennen — „bereinige jede Zeile in Spalte A bis zum Datenende und schreibe das Ergebnis in Spalte B" — und erzeugt begrenzten Code, der das Versprechen für Sie hält. Kostenlos testen →
Weitere Anleitungen
- VBA For-Schleife in Excel — wenn die Anzahl vorher feststeht
- VBA If Then Else — die Checkliste fürs Verzweigen
- VBA Select Case — einen Wert zu vielen Ergebnissen leiten
FAQ
Warum stoppt meine VBA While-Schleife nie? Der SCHRITT fehlt oder bewegt sich falsch. Finden Sie die Variable in der Bedingung und sorgen Sie dafür, dass etwas im Inneren sie zum Ausgangswert drückt. Eine Höchstgrenze als Sicherheitsnetz hinzufügen.
Was ist der Unterschied zwischen While und Do While?
Funktional fast identisch am Schleifenanfang. Der praktische Unterschied: Do While unterstützt Exit Do und ist die empfohlene moderne Syntax; While...Wend ist veraltet und kann nicht früh aussteigen.
Wie durchlaufe ich Zeilen, bis eine Zelle leer ist?
Do While Cells(i, 1).Value <> "" (oder Do Until Cells(i, 1).Value = "") und i bei jedem Durchlauf erhöhen. Bei der ersten leeren Zelle stoppen.
Do While oder Do Until?
Was sich klarer liest. Do While läuft, solange wahr; Do Until läuft, bis wahr. Sie sind austauschbar.
