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

VBA GoTo in Excel — Der Sprung zu einer Sprungmarke und warum Sie ihn meist meiden sollten

|

VBA GoTo in Excel — Der Sprung zu einer Sprungmarke und warum Sie ihn meist meiden sollten

Kurzfassung — GoTo label springt zu einer mit label: markierten Zeile in derselben Prozedur, ohne jede Bedingung. Es hat im modernen VBA genau einen Platz, an den es noch gehört: On Error GoTo für die Fehlerbehandlung. Für alles andere — Schleifen, Überspringen, Verzweigen — ist ein Sprung schwerer zu verfolgen als die strukturierten Werkzeuge (If, Exit For, Exit Sub, Do), und in oder aus einer Schleife zu springen beschädigt die Schleife klammheimlich. Lernen Sie die Syntax, um alten Code lesen zu können; greifen Sie zur strukturierten Variante, wenn Sie neuen Code schreiben.

Sub GoToBasics()
    Dim x As Long
    x = 5
    If x > 0 Then GoTo Positive

    Debug.Print "zero or negative"
    Exit Sub                 ' anhalten, bevor wir in die Sprungmarke unten fallen

Positive:                    ' eine Sprungmarke - Name gefolgt von einem Doppelpunkt
    Debug.Print "positive"
End Sub

GoTo ist das älteste Ablaufwerkzeug überhaupt: Es bewegt die Ausführung zu einer benannten Sprungmarke, bedingungslos und in eine Richtung Ihrer Wahl. VBA unterstützt es weiterhin, und ein modernes Feature — On Error GoTo — baut darauf auf. Doch für den gewöhnlichen Ablauf erzeugt ein Sprung Code, den Sie nicht von oben nach unten lesen können, und deshalb sollte fast jedes GoTo in neuem Code stattdessen ein Exit oder ein If sein.

Was Sie lernen

  • Die Syntax aus Sprungmarke und Sprung: wie Sie eine Sprungmarke schreiben und wie GoTo sie erreicht
  • Die eine Stelle, an die GoTo heute wirklich gehört — die Fehlerbehandlung mit On Error GoTo
  • Warum ein Sprung in oder aus einer Schleife den Schleifenzähler beschädigt und Arbeit halb erledigt lässt
  • Wie GoTo missbraucht wird, um ein Continue vorzutäuschen, das VBA nicht hat, und die saubere Alternative
  • Warum Sie mit GoTo keine Sprungmarke in einer anderen Prozedur ansteuern können
  • Die strukturierten Alternativen, die sich besser lesen als jeder Sprung

Das Denkmodell: ein bedingungsloser Sprung in eine Richtung

Eine Sprungmarke ist ein Name gefolgt von einem Doppelpunkt, allein in einer Zeile; GoTo label bewegt die Ausführung direkt dorthin:

GoTo CleanUp     ' vorwaerts (oder rueckwaerts) zur Zeile mit CleanUp: springen
' ... alle Zeilen hier werden uebersprungen ...
CleanUp:         ' <-- Ausfuehrung setzt hier fort

Zwei Eigenschaften machen GoTo gleichermaßen mächtig und gefährlich. Es ist bedingungslos — für sich allein springt es immer, also braucht eine Verzweigung ein umschließendes If — und es ist eine Einbahn-Bewegung, die keine Spur hinterlässt: Nichts markiert, woher die Steuerung kam, sodass ein Leser, der den Code verfolgt, die ganze Prozedur durchsuchen muss, um jedes GoTo zu finden, das auf einer Sprungmarke landen könnte. Eine strukturierte Anweisung wie Exit For sagt Ihnen genau, wohin die Steuerung geht (direkt hinter Next); ein GoTo kann von überall kommen. Genau dieser Unterschied ist der ganze Einwand gegen es.

Die eine Stelle für GoTo: On Error GoTo

Hier ist die Ausnahme, und sie ist echt. VBAs Fehlerbehandlung baut auf GoTo auf: On Error GoTo sagt VBA, zu welcher Sprungmarke bei einem Laufzeitfehler gesprungen werden soll. Das ist idiomatisch, erwartet und hat in der Sprache keine strukturierte Alternative:

Sub SafeOpen()
    On Error GoTo Failed
    Workbooks.Open "C:\reports\data.xlsx"
    Exit Sub

Failed:
    MsgBox "Could not open the file."
End Sub

Beachten Sie das Exit Sub vor der Sprungmarke Failed: — ohne es würde der normale Pfad in den Fehlerbehandler durchfallen, selbst wenn nichts schiefgegangen ist. Dieses Durchfallen ist der klassische Fehler bei mit GoTo markiertem Code, und er gilt für jede Sprungmarke, nicht nur für Fehlerbehandler. Den vollständigen Mechanismus finden Sie unter VBA On Error. Außerhalb von On Error ist ein GoTo ein Warnsignal, kein Werkzeug.

Die Falle: in oder aus einer Schleife springen

Das Schlimmste, was Sie mit GoTo tun können, ist über die Grenze einer For- oder Do-Schleife zu springen. Springen Sie mit GoTo aus einer Schleife, umgehen Sie deren normalen Ausstieg — der Zähler bleibt auf dem Wert, den er gerade hielt, und alles, was die Schleife zu Ende bringen sollte, wird übersprungen. Springen Sie mitten in eine Schleife, ist das Ergebnis noch schlimmer: Der Zähler wurde nie initialisiert, das Verhalten ist also undefiniert:

' TUN Sie das NICHT - mit GoTo aus einer Schleife springen
For i = 1 To 100
    If Cells(i, 1).Value = "X" Then GoTo AfterLoop   ' umgeht den sauberen Ausstieg der Schleife
Next i
AfterLoop:

Die Zeile oben läuft zwar, aber die ehrliche Variante ist Exit For, das die Schleife durch ihre ordentliche Tür verlässt und die Absicht klarmacht. Jeder Sprung aus einer Schleife ist besser als Exit For oder Exit Do geschrieben; jedes Verlasse-die-Prozedur-jetzt ist besser als Exit Sub geschrieben. Diese benennen die Struktur, die sie verlassen, und lassen die Steuerung an einer vorhersehbaren Stelle landen — ein GoTo tut keines von beidem.

Continue mit GoTo vortäuschen — und die saubere Alternative

VBA hat keine Continue-Anweisung, um zum nächsten Schleifendurchlauf zu springen, also simuliert alter Code es oft, indem er eine Sprungmarke direkt vor Next setzt und dorthin springt:

' der GoTo-Weg fuer "continue" - funktioniert, aber ist ein Sprung
For i = 1 To n
    If Cells(i, 1).Value = "" Then GoTo NextRow
    ' ... die Zeile verarbeiten ...
NextRow:
Next i

Das läuft, aber es verlangt vom Leser, für das Verständnis einer Schleife hin und her zu springen. Die strukturierte Variante kehrt einfach den Test um, sodass die übersprungenen Durchläufe nichts tun und zu Next durchfallen:

' der strukturierte Weg - keine Sprungmarke, kein Sprung
For i = 1 To n
    If Cells(i, 1).Value <> "" Then
        ' ... die Zeile verarbeiten ...
    End If
Next i

Gleiches Verhalten, von oben nach unten lesbar. Ist die Überspringen-Bedingung ein einzelner Test, gewinnt immer das If. Heben Sie sich das Muster mit Sprungmarke-vor-Next für den seltenen Fall auf, in dem die Überspringen-Logik zu verwickelt für ein einzelnes If ist — und selbst dann sollten Sie erwägen, den Rumpf in eine eigene Prozedur auszulagern.

Mit GoTo können Sie nicht über Prozedurgrenzen springen

Eine Sprungmarke ist lokal zu der Prozedur, in der sie steht. GoTo kann nur zu einer Sprungmarke im selben Sub oder in derselben Function springen; von einer Prozedur in eine andere können Sie nicht springen (VBA wirft den Kompilierfehler «Label not defined»). Ertappen Sie sich beim Wunsch, in eine andere Prozedur zu springen, wollen Sie sie in Wahrheit aufrufen — MyCleanup oder Call MyCleanup —, was Ihnen anschließend die Steuerung zurückgibt, genau das, was ein Sprung nicht kann. Diese Einschränkung ist ein Vorteil: Sie hält jeden Sprung innerhalb einer lesbaren Einheit.

Wann ein Sprung wirklich die am wenigsten schlechte Option ist

Die Ehrlichkeit verlangt ein Zugeständnis: Das Ausbrechen aus tief verschachtelten Schleifen ist die eine Ablaufsituation, in der ein GoTo auf eine Sprungmarke hinter der äußeren Schleife sauberer sein kann als die Alternativen, weil VBA nicht mehr als eine Schleifenebene auf einmal mit Exit verlassen kann. Selbst hier ist es meist klarer, die verschachtelten Schleifen in eine Function auszulagern und Exit Function zu verwenden. Die Faustregel: Wenn Sie zu GoTo greifen und es nicht On Error GoTo ist, halten Sie inne und fragen Sie, ob ein Exit, ein If oder eine kleine Hilfsprozedur dasselbe ohne Sprung sagen würde. In neunundneunzig von hundert Fällen wird es das.

Wie ExcelMaster hilft

GoTo ist leicht zu schreiben und schwer zu lesen — genau die Kombination, die Makros hervorbringt, die ein halbes Jahr später niemand mehr pflegen kann. Die zwei Fehler, die wehtun, sind das Durchfallen in eine Sprungmarke, wenn ein vorangehendes Exit Sub fehlt, und Sprünge über Schleifengrenzen, die Zähler und Arbeit in einem undefinierten Zustand zurücklassen.

ExcelMaster schreibt einen Ablauf, den Sie von oben nach unten lesen können: Exit For, wo eine Schleife anhalten soll, Guard Clauses, wo eine Prozedur aussteigen soll, und On Error GoTo nur dort, wo es hingehört — in der Fehlerbehandlung, mit dem Exit Sub, das den normalen Pfad aus dem Behandler heraushält. Sie behalten die Arbeitsmappe und den Code.

Häufig gestellte Fragen

Was macht GoTo in VBA?

GoTo label überträgt die Ausführung bedingungslos auf eine mit label: markierte Zeile in derselben Prozedur. Eine Sprungmarke ist ein Name gefolgt von einem Doppelpunkt, allein in einer Zeile. Weil GoTo immer springt, braucht eine Verzweigung ein umschließendes If, wie in If x < 0 Then GoTo Negative. Die Ausführung läuft dann ab der Sprungmarke weiter.

Ist GoTo in VBA schlechte Praxis?

Für den gewöhnlichen Ablauf ja — ein Sprung ist schwerer zu verfolgen als strukturierte Anweisungen, und in oder aus einer Schleife zu springen kann den Schleifenzähler beschädigen. Die wichtige Ausnahme ist On Error GoTo, der idiomatische und erwartete Weg, Laufzeitfehler an einen Behandler zu leiten. Lernen Sie GoTo, um alten Code zu lesen; bevorzugen Sie Exit, If und Do-Schleifen, wenn Sie neuen Code schreiben.

Wie schreibe ich eine Sprungmarke für GoTo?

Schreiben Sie einen Namen gefolgt von einem Doppelpunkt allein in eine Zeile, etwa CleanUp:, und springen Sie mit GoTo CleanUp dorthin. Sprungmarken unterscheiden nicht zwischen Groß- und Kleinschreibung und sind lokal zur Prozedur. Setzen Sie immer ein Exit Sub vor eine Sprungmarke am Ende einer Prozedur, sonst fällt der normale Pfad in den markierten Code durch, selbst wenn kein Sprung beabsichtigt war.

Kann GoTo zu einem anderen Sub oder einer anderen Function springen?

Nein. Ein GoTo erreicht nur eine Sprungmarke in derselben Prozedur; in ein anderes Sub oder eine andere Function zu springen ist ein Kompilierfehler. Um Code in einer anderen Prozedur auszuführen, rufen Sie sie beim Namen auf — der Aufruf gibt Ihnen nach Abschluss die Steuerung zurück, was Sie meist wollen und was ein Sprung nie kann.

Wie breche ich ohne GoTo aus einer Schleife aus?

Verwenden Sie Exit For für eine For-Schleife oder Exit Do für eine Do-Schleife — beide verlassen die Schleife durch ihren ordentlichen Ausstieg und fahren bei der Zeile danach fort. Um einen einzelnen Durchlauf zu überspringen, statt die Schleife zu verlassen, packen Sie den Rumpf in ein If, sodass die übersprungenen Durchläufe nichts tun. Den vollständigen Satz finden Sie unter VBA Exit For.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 24.09.2026.

Verwandte Anleitungen: VBA Exit For · VBA End · VBA On Error · VBA For Loop · VBA If Then Else