Kurzfassung — Die blanke
End-Anweisung stoppt das ganze Makro sofort: Sie löscht jede Variable (auch modulweite undStatic), schließt UserForms und überspringt jede eingeplante Aufräumarbeit. Das ist etwas anderes alsEnd Sub(das nur markiert, wo einSubendet), alsExit Sub(das aus einer Prozedur zurückkehrt und das Programm weiterlaufen lässt) und alsStop(das im Debugger pausiert). Die blankeEndwollen Sie fast nie. Um eine Prozedur zu verlassen, verwenden SieExit 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 SubundStopfünf verschiedene Dinge sind - Der eigentliche Fehler: wie
EndIhre Aufräumarbeit überspringt undScreenUpdatingoder Ereignisse ausgeschaltet lässt - Warum
Endmodulweite undStatic-Variablen löscht, die eine normale Rückkehr behalten würde - Wann (wenn überhaupt)
Enddie richtige Wahl ist und was Sie stattdessen verwenden - Wie sich
StopvonEndunterscheidet — 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
