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

VBA Exit For in Excel — Exit For, Exit Do, Exit Sub und der saubere frühe Ausstieg

|

VBA Exit For in Excel — Exit For, Exit Do, Exit Sub und der saubere frühe Ausstieg

Kurzfassung — Exit For verlässt sofort eine For-Schleife; Exit Do verlässt eine Do-Schleife; Exit Sub und Exit Function kehren 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 For verlässt nur die innerste Schleife, sodass bei verschachtelten Schleifen die äußere weiterläuft. VBA kennt kein Continue und kein Exit If; um einen einzelnen Durchlauf zu überspringen, nutzen Sie ein If (oder, selten, ein GoTo auf eine Sprungmarke direkt vor Next).

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 Sub und Exit Function zu einer einzigen Regel verbindet
  • Warum Exit For aus einer Schleife ausbricht und warum der Code nach der Schleife trotzdem läuft
  • Die Falle Nummer eins: Exit For verlässt in einem verschachtelten For nur die innerste Schleife
  • Warum VBA kein Continue und kein Exit If kennt und wie Sie einen einzelnen Durchlauf sauber überspringen
  • Das Guard-Clause-Muster (If ... Then Exit Sub), das tief verschachtelte If-Blöcke ersetzt
  • Wie sich Exit Sub von End unterscheidet — 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