Kurzfassung —
GoTo labelspringt zu einer mitlabel:markierten Zeile in derselben Prozedur, ohne jede Bedingung. Es hat im modernen VBA genau einen Platz, an den es noch gehört:On Error GoTofü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
GoTosie erreicht - Die eine Stelle, an die
GoToheute wirklich gehört — die Fehlerbehandlung mitOn Error GoTo - Warum ein Sprung in oder aus einer Schleife den Schleifenzähler beschädigt und Arbeit halb erledigt lässt
- Wie
GoTomissbraucht wird, um einContinuevorzutäuschen, das VBA nicht hat, und die saubere Alternative - Warum Sie mit
GoTokeine 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
