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

VBA End in Excel — End, End Sub, Exit Sub und Stop im Vergleich

|

VBA End in Excel — End, End Sub, Exit Sub und Stop im Vergleich

Kurzfassung — Die blanke End-Anweisung stoppt das ganze Makro sofort: Sie löscht jede Variable (auch modulweite und Static), schließt UserForms und überspringt jede eingeplante Aufräumarbeit. Das ist etwas anderes als End Sub (das nur markiert, wo ein Sub endet), als Exit Sub (das aus einer Prozedur zurückkehrt und das Programm weiterlaufen lässt) und als Stop (das im Debugger pausiert). Die blanke End wollen Sie fast nie. Um eine Prozedur zu verlassen, verwenden Sie Exit Sub.

Sub WhyEndIsDangerous()
    Application.ScreenUpdating = False
    ' ... work ...
    If somethingWrong Then End       ' stoppt JETZT - ScreenUpdating bleibt False!
    ' ... more work ...
    Application.ScreenUpdating = True ' diese Aufraeumzeile laeuft nach End nie
End Sub

Vier Konstrukte in VBA enthalten das Wort end, und sie zu verwechseln verursacht echte Fehler. Nur eines von ihnen — die blanke End — stoppt Ihr Programm tatsächlich, und zwar auf die grobschlächtigste Weise überhaupt. Die anderen schließen bloß einen Block oder kehren aus einer Prozedur zurück. Zu wissen, was was ist, ist der Unterschied zwischen einem Makro, das hinter sich aufräumt, und einem, das Excel in einem halb konfigurierten Zustand zurücklässt.

Was Sie lernen

  • Was die blanke End-Anweisung tatsächlich tut — und wie viel Zustand sie zerstört
  • Warum End, End Sub, End If, Exit Sub und Stop fünf verschiedene Dinge sind
  • Der eigentliche Fehler: wie End Ihre Aufräumarbeit überspringt und ScreenUpdating oder Ereignisse ausgeschaltet lässt
  • Warum End modulweite und Static-Variablen löscht, die eine normale Rückkehr behalten würde
  • Wann (wenn überhaupt) End die richtige Wahl ist und was Sie stattdessen verwenden
  • Wie sich Stop von End unterscheidet — zum Debuggen pausieren gegenüber beenden

Das Denkmodell: End ist der Stecker, nicht die Tür

Ordnen Sie die vier Doppelgänger danach, wie viel sie stoppen:

End If      ' schliesst einen If-Block    - stoppt nichts; ein Strukturmarker
End Sub     ' markiert das Ende eines Sub  - Prozedur endet hier ohnehin
Exit Sub    ' kehrt aus DIESER Prozedur    - Programm laeuft weiter
End         ' beendet das GANZE Makro      - alles stoppt, nichts raeumt auf

End Sub und End If sind Satzzeichen: Sie sagen VBA, wo ein Block endet. Sie werden nicht ausgeführt. Exit Sub ist eine Tür aus einer Prozedur heraus — Sie gehen, der Aufrufer macht weiter, Ihre Aufräumarbeit läuft. Die blanke End ist der Stecker: Sie hält den ganzen Aufrufstapel auf einmal an, als hätten Sie im Editor die Reset-Schaltfläche gedrückt. Alles stromabwärts — der Aufrufer, dessen Aufrufer, die Aufräumzeile, die Sie zwei Zeilen darunter geschrieben haben — wird schlicht preisgegeben. Genau diese eine Unterscheidung, Tür gegen Stecker, ist die ganze Seite.

Was die blanke End-Anweisung wirklich zerstört

End tut weit mehr als nur den Code zu stoppen. Wenn es auslöst, reißt VBA den gesamten Laufzeitzustand Ihres Projekts nieder:

  • Alle Variablen werden zurückgesetzt — lokale, modulweite und Static-Variablen verlieren ihre Werte.
  • Alle offenen UserForms werden entladen, ohne dass ihre QueryClose- oder Aufräum-Ereignisse normal laufen.
  • Der Aufrufstapel wird verworfen — keine Prozedur darauf kann zu Ende laufen oder ihre restlichen Zeilen ausführen.
  • On Error-Behandler werden gelöscht, und der Laufzeitzustand des VBA-Projekts setzt sich zurück, als wäre es frisch gestartet.

Was es nicht tut, ist irgendetwas rückgängig zu machen, das bereits an der Arbeitsmappe oder an Application geschehen ist. Das ist der Kern der Gefahr. Haben Sie oben Application.ScreenUpdating = False gesetzt und treffen mittendrin auf End, bleibt die Bildschirmaktualisierung aus — denn die Zeile, die sie wieder eingeschaltet hätte, ist eine der vielen Zeilen, die End gerade preisgegeben hat.

Der eigentliche Fehler: End überspringt Ihre Aufräumarbeit

Die meisten nicht trivialen Makros setzen vorab einen Excel-Zustand und stellen ihn am Ende wieder her:

Sub Report()
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    If Not FileExists() Then End    ' <-- die Falle

    ' ... den Bericht bauen ...

    Application.EnableEvents = True     ' nie erreicht, wenn End ausgeloest hat
    Application.ScreenUpdating = True   ' nie erreicht, wenn End ausgeloest hat
End Sub

Gibt FileExists False zurück, stoppt dieses End alles auf der Stelle. EnableEvents und ScreenUpdating bleiben False, sodass das Excel des Benutzers nun stillschweigend Arbeitsblatt-Ereignisse ignoriert und nicht mehr neu zeichnet — ein Support-Ticket über ein eingefrorenes Excel, das wie ein Absturz aussieht, aber in Wahrheit nur übersprungenes Aufräumen ist. Die Behebung ist, zurückzukehren, nicht zu beenden: Ersetzen Sie End durch Exit Sub und legen Sie die Wiederherstellungszeilen dorthin, wo sie immer laufen (ein einziger Ausstiegspfad oder ein Fehlerbehandler). Exit Sub verlässt die Prozedur, lässt aber Ihre Aufräumarbeit — und den Rest des Programms — laufen.

End löscht Static- und modulweite Variablen

Es gibt eine feinere Folge, die eine eigene Anmerkung verdient. Eine normale Rückkehr (Exit Sub oder einfach das Erreichen von End Sub) lässt modulweite und Static-Variablen unangetastet — genau das ist ihr Zweck, über Aufrufe hinweg zu bestehen. Die blanke End wirft sie zusammen mit allem anderen weg:

' Module level
Dim gRunCount As Long

Sub Tick()
    gRunCount = gRunCount + 1     ' soll ueber Laeufe hinweg aufsummieren
    If gRunCount > 100 Then End   ' End setzt gRunCount wieder auf 0 zurueck!
End Sub

Verlässt sich irgendein Teil Ihres Entwurfs darauf, dass Zustand zwischen Makroläufen überlebt — ein Zähler, ein zwischengespeichertes Objekt, eine geladene Konfiguration —, setzt ein verirrtes End ihn stillschweigend zurück, und der Fehler zeigt sich viel später als der Zähler, der immer wieder von vorn anfängt. Ein weiterer Grund, warum die blanke End selten und bewusst sein sollte.

Stop ist nicht End: zum Debuggen pausieren, nicht beenden

Stop sieht verwandt aus, tut aber das Gegenteil von beenden. Es hält die Ausführung an und setzt Sie an dieser Zeile in den VBA-Editor, im Unterbrechungsmodus, mit jeder Variable noch am Leben, sodass Sie sie inspizieren können — genau wie ein Haltepunkt, den Sie in den Code geschrieben haben:

Sub Investigate()
    Dim total As Double
    total = ComputeTotal()
    Stop                     ' hier im Editor pausieren; total ist noch lesbar
    Range("A1").Value = total
End Sub

Verwenden Sie Stop beim Debuggen und entfernen Sie es, bevor Sie ausliefern (anders als ein F9-Haltepunkt lebt Stop im Quelltext, sodass ein vergessenes das Makro eines Benutzers im Editor anhält). End beendet; Stop pausiert. Keines von beiden wollen Sie in Code auslösen sehen, den Ihre Benutzer ausführen — um ein laufendes Makro zu beobachten, ohne es anzuhalten, siehe VBA Debug.Print.

Wann ist End überhaupt die richtige Wahl?

Selten und immer bewusst. Die ehrlichen Anwendungsfälle sind eng: eine katastrophale, nicht behebbare Bedingung in einem eigenständigen Werkzeug, bei der Sie lieber alles stoppen, als zu riskieren, mit fehlerhaftem Zustand weiterzumachen, oder das Abbauen einer nicht modalen, UserForm-getriebenen Anwendung, bei der Sie wirklich das ganze Projekt zurücksetzen wollen. Selbst dann sollten Sie besser einen einzigen sauberen Ausstieg ansteuern — Application-Einstellungen wiederherstellen, schließen, was Sie geöffnet haben — und dann stoppen. In alltäglichen Makros lautet die Antwort auf die Frage, wie man hier anhält, Exit Sub (diese Prozedur verlassen) oder ein Umbau, sodass der Code von selbst End Sub erreicht. Tippen Sie die blanke End, halten Sie inne und vergewissern Sie sich, dass Sie wirklich meinen: alles beenden, jedes Aufräumen überspringen.

Wie ExcelMaster hilft

Die blanke End ist ein kleines Wort mit übergroßem Wirkungsradius, und ihr Schaden ist unsichtbar, bis ein Benutzer ein eingefrorenes Excel meldet, das in Wahrheit nur ausgeschaltetes ScreenUpdating ist. Die Fehler sind, End zu verwenden, wo Sie Exit Sub meinten, und ein Stop in ausgeliefertem Code zu lassen.

ExcelMaster schreibt Prozeduren, die durch einen einzigen sauberen Ausstieg verlassen werden: Exit Sub zum Zurückkehren, Wiederherstellungszeilen, die immer laufen, und kein verirrtes End oder Stop in Code, den Ihre Benutzer anfassen. Muss ein Makro früh aussteigen, tut es das, ohne Excel halb konfiguriert zurückzulassen. Sie behalten die Arbeitsmappe und den Code.

Häufig gestellte Fragen

Was macht die End-Anweisung in VBA?

Die blanke End-Anweisung beendet sofort das ganze Makro. Sie setzt alle Variablen zurück (auch modulweite und Static), entlädt offene UserForms, verwirft den Aufrufstapel und löscht On Error-Behandler — aber sie macht nicht rückgängig, was bereits an der Arbeitsmappe oder an Application geändert wurde, also wird jede eingeplante Aufräumarbeit übersprungen. Um eine Prozedur ohne all das zu verlassen, verwenden Sie Exit Sub.

Was ist der Unterschied zwischen End und End Sub?

End Sub markiert bloß, wo eine Sub-Prozedur endet — es ist ein Strukturmarker, und die Prozedur würde dort ohnehin enden. Die blanke End, für sich allein geschrieben, beendet das ganze Programm auf der Stelle, wo auch immer sie steht. End Sub schließt einen Block; End stoppt alles.

Sollte ich End verwenden, um ein Makro zu stoppen?

Meistens nein. Um die aktuelle Prozedur zu verlassen, verwenden Sie Exit Sub, das zum Aufrufer zurückkehrt und Ihre Aufräumarbeit laufen lässt. Die blanke End überspringt jedes Aufräumen und kann ScreenUpdating ausgeschaltet oder Ereignisse deaktiviert lassen, was ein Excel erzeugt, das eingefroren wirkt. Heben Sie sich End für seltene, bewusste, nicht behebbare Situationen auf.

Was ist der Unterschied zwischen End und Stop?

End beendet das Makro und löscht seinen Zustand. Stop hält die Ausführung an und setzt Sie im Unterbrechungsmodus in den VBA-Editor, mit allen Variablen noch am Leben, sodass Sie debuggen können — wie ein in den Code geschriebener Haltepunkt. Entfernen Sie Stop vor der Auslieferung, denn anders als ein F9-Haltepunkt lebt es im Quelltext und hält das Makro eines Benutzers an.

Warum ist ScreenUpdating nach dem Lauf meines Makros noch ausgeschaltet?

Höchstwahrscheinlich hat eine blanke End (oder ein unbehandelter Fehler) das Makro gestoppt, bevor die Zeile lief, die Application.ScreenUpdating = True wieder einschaltet. Weil End den restlichen Code überspringt, wurde die Wiederherstellung nie ausgeführt. Ersetzen Sie End durch Exit Sub und legen Sie Ihre Wiederherstellungszeilen auf einen einzigen Ausstiegspfad oder in einen Fehlerbehandler, damit sie immer ausgeführt werden.

Getestet in

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

Verwandte Anleitungen: VBA Exit For · VBA GoTo · VBA On Error · VBA Debug.Print · VBA Sub