Kurzfassung —
Exit Forverlässt sofort eineFor-Schleife;Exit Doverlässt eineDo-Schleife;Exit SubundExit Functionkehren aus einer Prozedur zurück. Sie sind ein und dieselbe Idee — die aktuelle Struktur jetzt verlassen — und der Code nach dieser Struktur läuft weiter. Die Falle:Exit Forverlässt nur die innerste Schleife, sodass bei verschachtelten Schleifen die äußere weiterläuft. VBA kennt keinContinueund keinExit If; um einen einzelnen Durchlauf zu überspringen, nutzen Sie einIf(oder, selten, einGoToauf eine Sprungmarke direkt vorNext).
Sub FindFirstMatch()
Dim i As Long, found As Long
For i = 1 To 100000
If Cells(i, 1).Value = "TARGET" Then
found = i
Exit For ' sofort anhalten, sobald wir es finden - Rest nicht scannen
End If
Next i
MsgBox IIf(found > 0, "Found on row " & found, "Not found")
End Sub
Exit ist der Weg, einen Block früh zu verlassen, ohne das ganze Programm zu verlassen. Brechen Sie mit
Exit For oder Exit Do aus einer Schleife aus, kehren Sie mit Exit Sub aus
einer Prozedur zurück, und lassen Sie den Rest des Makros weiterlaufen. Genau dieser letzte Teil ist der
springende Punkt und die eine Zeile, die Exit von End trennt: Exit schließt
eine Tür; End zieht den Stecker.
Was Sie lernen
- Das Denkmodell, das
Exit For,Exit Do,Exit SubundExit Functionzu einer einzigen Regel verbindet - Warum
Exit Foraus einer Schleife ausbricht und warum der Code nach der Schleife trotzdem läuft - Die Falle Nummer eins:
Exit Forverlässt in einem verschachteltenFornur die innerste Schleife - Warum VBA kein
Continueund keinExit Ifkennt und wie Sie einen einzelnen Durchlauf sauber überspringen - Das Guard-Clause-Muster (
If ... Then Exit Sub), das tief verschachtelteIf-Blöcke ersetzt - Wie sich
Exit SubvonEndunterscheidet — eine Prozedur verlassen gegenüber das ganze Makro stoppen
Das Denkmodell: diese Struktur verlassen, das Programm weiterlaufen lassen
Jede Form von Exit benennt die Struktur, die sie verlässt, und verlässt nur diese Struktur:
Exit For ' verlaesst die umschliessende For-Schleife
Exit Do ' verlaesst die umschliessende Do-Schleife
Exit Sub ' verlaesst die umschliessende Sub (zurueck zum Aufrufer)
Exit Function ' verlaesst die umschliessende Function (zurueck zum Aufrufer)
Stellen Sie sich Ihre Prozedur als ineinander verschachtelte Räume vor — ein Sub enthält eine Schleife,
die Schleife enthält ein If. Exit For tritt aus dem Raum der Schleife heraus, bleibt aber im Sub.
Exit Sub verlässt die ganze Prozedur. In jedem Fall setzt die Ausführung beim nächsten Element
außerhalb der verlassenen Struktur fort — der Zeile nach Next oder dem Aufrufer, der Ihr Sub gestartet
hat. Nichts nach Ihrem Exit innerhalb dieses Blocks läuft, aber alles nach dem Block schon. Das macht
Exit strukturiert: Sie wissen immer genau, wo die Steuerung landet, weil sie direkt außerhalb der
von Ihnen benannten Box landet.
Exit For: eine Schleife anhalten, sobald Sie fertig sind
Eine For-Schleife läuft standardmäßig durch jeden Durchlauf. Sehr oft brauchen Sie nicht jeden Durchlauf
— Sie suchen, und sobald Sie die Antwort gefunden haben, sind die übrigen Durchläufe verschwendete Arbeit:
Dim i As Long
For i = 2 To 100000
If Cells(i, 1).Value = "" Then Exit For ' erste leere Zeile - hier anhalten
Next i
' i haelt jetzt die Zeile, wo wir stoppten; Ausfuehrung geht ab hier weiter
Zwei Dinge lohnt es sich festzuhalten. Erstens setzt Exit For den Schleifenzähler weder zurück noch
löscht es ihn — nach der Schleife hält i genau den Wert, den es beim Ausstieg hatte, was oft genau das
ist, was Sie wollen (die Zeile, auf der Sie angehalten haben). Zweitens haben Sie nur die Schleife
verlassen. Jeder Code nach Next i läuft ganz normal. Wollten Sie die ganze Prozedur abbrechen, ist das
Exit Sub, nicht Exit For.
Die Falle Nummer eins: Exit For verlässt nur die innerste Schleife
Das ist der Fehler, der Leute einen ganzen Nachmittag kostet. Wenn Sie ein For in ein anderes
verschachteln, verlässt Exit For nur die Schleife, in der es steht — die innere. Die äußere Schleife
läuft weiter, als wäre nichts geschehen:
Dim r As Long, c As Long
For r = 1 To 100
For c = 1 To 50
If Cells(r, c).Value = "STOP" Then Exit For ' verlaesst NUR die c-Schleife
Next c
' <-- Steuerung landet HIER, und die aeussere r-Schleife laeuft bis r = 100 weiter
Next r
Es gibt kein Exit For, For, um zwei Ebenen auf einmal zu durchbrechen. Wenn Sie wirklich beide
Schleifen anhalten müssen, haben Sie drei ehrliche Möglichkeiten: Setzen Sie ein Boolean-Flag und prüfen
Sie es in der Bedingung der äußeren Schleife; verlagern Sie die verschachtelten Schleifen in eine eigene
Function und verlassen Sie mit Exit Function beide auf einmal; oder — die eine Stelle, an der erfahrene
VBA-Entwickler noch danach greifen — ein GoTo auf eine Sprungmarke direkt hinter dem äußeren Next. Der
Function-Ansatz ist meist der sauberste — unter VBA GoTo lesen Sie, warum der Sprung
ein letztes Mittel ist.
Exit Do: dieselbe Idee für Do-Schleifen
Do-Schleifen bekommen aus genau demselben Grund ihr eigenes Schlüsselwort, Exit Do. Am wichtigsten ist
es beim Do ... Loop ohne Bedingung, der sonst ewig liefe:
Dim n As Long
Do
n = n + 1
If n > 1000 Then Exit Do ' der einzige Ausweg aus dieser Schleife
Loop
Verwenden Sie Exit Do in Do While, Do Until und im blanken Do ... Loop. Versuchen Sie nicht,
Exit For in einer Do-Schleife zu verwenden oder umgekehrt — das Schlüsselwort muss zum Schleifentyp
passen, sonst wirft VBA einen Kompilierfehler. Für den Unterschied zwischen den Schleifenformen selbst
siehe VBA While Loop.
Exit Sub und Exit Function: früh aus einer Prozedur zurückkehren
Außerhalb von Schleifen bringt Sie dieselbe Idee aus einer ganzen Prozedur zurück. Exit Sub beendet ein
Sub sofort und gibt die Steuerung an das zurück, was es aufgerufen hat; Exit Function tut dasselbe für
eine Function und gibt den Wert zurück, den der Funktionsname gerade hält:
Function SafeDivide(a As Double, b As Double) As Double
If b = 0 Then
SafeDivide = 0
Exit Function ' jetzt 0 zurueckgeben; die Division unten ueberspringen
End If
SafeDivide = a / b
End Function
Achten Sie auf die Reihenfolge bei Exit Function: Setzen Sie den Rückgabewert, bevor Sie aussteigen,
denn Exit Function verlässt die Funktion sofort und erreicht die Zeilen darunter nie. Dieses Muster —
eine Bedingung prüfen und früh aussteigen — ist das Nützlichste, was Exit überhaupt tut, und es hat
einen Namen.
Das Guard-Clause-Muster: Exit Sub statt verschachtelter Ifs
Wenn eine Prozedur Vorbedingungen hat — ein Blatt muss existieren, eine Zelle darf nicht leer sein, der
Benutzer muss etwas ausgewählt haben — ist die verlockende Struktur eine Pyramide aus verschachtelten
If-Blöcken. Die flachere, besser lesbare Alternative ist eine Guard Clause: Prüfen Sie jede
Vorbedingung ganz oben und steigen Sie mit Exit Sub aus, wenn sie fehlschlägt, damit die eigentliche
Arbeit am linken Rand ohne Verschachtelung läuft:
Sub ProcessSelection()
If Selection Is Nothing Then Exit Sub
If Selection.Cells.Count = 0 Then Exit Sub
If Not TypeName(Selection) = "Range" Then Exit Sub
' ab hier ist jede Vorbedingung erfuellt - die Arbeit tun, unverschachtelt
Dim cell As Range
For Each cell In Selection
cell.Value = UCase(cell.Value)
Next cell
End Sub
Jede Guard liest sich wie ein schlichter Satz — ist nichts ausgewählt, sind wir fertig. Der Gewinn: Der
wichtige Code ist nie drei If-Ebenen tief vergraben. Hat eine Prozedur einen klaren Grund, früh
anzuhalten, schlägt eine Exit Sub-Guard ganz oben das Einpacken des ganzen Rumpfs in If ... End If.
In VBA gibt es kein Continue und kein Exit If
Zwei Dinge, nach denen Programmierer aus anderen Sprachen greifen und die sie nicht finden werden. VBA hat
kein Continue, um zum nächsten Durchlauf zu springen, und kein Exit If — Exit verlässt nur
Schleifen und Prozeduren, nie einen If-Block (ein If endet von selbst an seinem End If). Um einen
Durchlauf einer Schleife zu überspringen, packen Sie den Rumpf in ein If, sodass das Überspringen
einfach heißt: diesmal nichts tun:
For i = 1 To n
If Cells(i, 1).Value = "" Then
' leere Zeilen ueberspringen - einfach nichts tun und zu Next durchfallen
Else
' nicht leere Zeilen hier verarbeiten
End If
Next i
Dieses umgekehrte If ist VBAs idiomatische Entsprechung von Continue. Die Alternative, die Sie in
älterem Code sehen — ein GoTo auf eine Sprungmarke direkt vor Next — funktioniert, aber sie ist ein
Sprung, und Sprünge sind schwerer zu verfolgen als ein If. Greifen Sie nur dann danach, wenn die
Überspringen-Logik wirklich zu verworren für ein If ist, und lesen Sie zuerst
VBA GoTo.
Exit ist nicht End: eine Tür, nicht der Stecker
Die wichtigste Grenze auf dieser Seite. Exit Sub kehrt aus der aktuellen Prozedur zurück und lässt
das Programm weiterlaufen — der Aufrufer führt seine nächste Zeile aus, Ihre Aufräumarbeit läuft, Excel
bleibt in einem sauberen Zustand. End stoppt das ganze Makro auf der Stelle: Es
verwirft jede Variable, schließt UserForms und — der eigentliche Schaden — überspringt jede Aufräumarbeit,
die Sie eingeplant hatten, sodass Application.ScreenUpdating auf False bleiben kann und Ereignisse
deaktiviert bleiben können. Wenn Sie diese Prozedur verlassen wollen, lautet die Antwort fast immer
Exit Sub, nie End.
Wie ExcelMaster hilft
Der frühe Ausstieg ist der Punkt, an dem sich richtig und schnell treffen: eine Suche, die beim ersten
Treffer anhält, statt 100.000 Zeilen zu durchforsten, eine Prozedur, die sauber aussteigt, wenn ihre
Eingaben falsch sind. Die zwei klassischen Fehler sind, von Exit For zu erwarten, dass es aus
verschachtelten Schleifen ausbricht, und Exit Sub (die Prozedur verlassen) mit End (alles stoppen und
das Aufräumen überspringen) zu verwechseln.
ExcelMaster lässt Sie das Ziel
beschreiben — finde die erste Zeile, in der Spalte A leer ist, und halte an — und schreibt die Schleife mit
dem richtigen Exit, ergänzt Guard Clauses für die Vorbedingungen und strukturiert die Aufräumarbeit so,
dass nichts halb erledigt bleibt. Sie behalten die Arbeitsmappe und den Code.
Häufig gestellte Fragen
Wie breche ich in VBA aus einer For-Schleife aus?
Verwenden Sie Exit For. Es verlässt sofort die umschließende For-Schleife und fährt bei der ersten
Zeile nach Next fort. Üblicherweise steht es in einem If, damit die Schleife nur bei erfüllter
Bedingung anhält, zum Beispiel If Cells(i, 1).Value = "TARGET" Then Exit For. Der Schleifenzähler behält
nach dem Ausstieg seinen aktuellen Wert, was oft die Zeile oder der Index ist, den Sie gesucht haben.
Bricht Exit For aus verschachtelten Schleifen aus?
Nein — Exit For verlässt nur die innerste Schleife, in der es steht; die äußere Schleife läuft weiter.
VBA bietet keine Möglichkeit, zwei Schleifenebenen mit einer einzigen Anweisung zu verlassen. Um beide
anzuhalten, setzen Sie ein Boolean-Flag und prüfen es in der äußeren Schleife, verlagern Sie die
verschachtelten Schleifen in eine Function und nutzen Exit Function, oder springen Sie mit GoTo auf
eine Sprungmarke hinter dem äußeren Next.
Was ist der Unterschied zwischen Exit Sub und End?
Exit Sub kehrt aus der aktuellen Prozedur zurück und lässt das Programm weiterlaufen — der Aufrufer macht
weiter, und jede vorhandene Aufräumarbeit läuft. End stoppt das ganze Makro auf einen Schlag: Es löscht
alle Variablen, schließt Formulare und überspringt Ihr Aufräumen, was ScreenUpdating ausgeschaltet oder
Ereignisse deaktiviert lassen kann. Um eine Prozedur zu verlassen, verwenden Sie Exit Sub; heben Sie sich
End für echte Notfälle auf.
Wie überspringe ich einen Durchlauf in einer VBA-Schleife?
VBA hat keine Continue-Anweisung. Der idiomatische Weg ist, den Schleifenrumpf in ein If zu packen,
sodass die Durchläufe, die Sie überspringen wollen, einfach nichts tun und zu Next durchfallen. Älterer
Code emuliert Continue manchmal mit einem GoTo auf eine Sprungmarke direkt vor Next, aber ein
umgekehrtes If ist klarer und führt keinen Sprung ein.
Gibt es ein Exit Do und ein Exit While?
Es gibt Exit Do, das jede Do-Schleife verlässt (Do While, Do Until oder ein blankes
Do ... Loop). Ein Exit While gibt es nicht — die alte While ... Wend-Schleife hat überhaupt keine
Ausstiegsanweisung, was ein weiterer Grund ist, Do-Schleifen vorzuziehen. Das Exit-Schlüsselwort muss
zum Schleifentyp passen: Verwenden Sie Exit For in For-Schleifen und Exit Do in Do-Schleifen.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 24.09.2026.
Verwandte Anleitungen: VBA GoTo · VBA End · VBA For Loop · VBA While Loop · VBA On Error
