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

VBA On Error in Excel — Resume Next vs. GoTo & warum Makros Bugs verstecken

|

VBA On Error in Excel — Resume Next vs. GoTo & warum Makros Bugs verstecken

Getestet in: Excel 365 v2509 · Excel 2021 · Excel 2019 · zuletzt geprüft am 08.06.2026

Kurz gesagtOn Error legt fest, was dein Makro nach einem Laufzeitfehler tut: Standardmäßig hält es an und wirft dem Anwender einen Dialog ins Gesicht. On Error ändert das. Es gibt genau drei Formen — und die falsche zu nehmen ist der Weg, auf dem Makros stillschweigend Daten zerstören:

Sub DatenVerarbeiten()
    On Error GoTo Fehlerbehandlung   ' jeder Fehler darunter springt zur Routine
    Dim ws As Worksheet
    Set ws = Sheets("Bericht")       ' wenn "Bericht" fehlt → Sprung nach unten
    ws.Range("A1").Value = 100

    Exit Sub                         ' HIER stoppen, sonst fällst du in die Routine
Fehlerbehandlung:
    MsgBox "Schritt fehlgeschlagen: " & Err.Description
End Sub

Die drei Formen, in einem Block:

On Error GoTo Fehlerbehandlung   ' Fehler an eine benannte Routine leiten — die verlässliche Wahl
On Error Resume Next             ' Fehler ignorieren, nächste Zeile ausführen — gefährlich, wenn vergessen
On Error GoTo 0                  ' Fehlerüberwachung AUS — zurück zu "stoppen und Dialog zeigen"

Das Denkmodell: On Error ist eine Weiche für „wohin gehe ich bei einem Absturz?"

Stell dir jede Zeile deines Makros als Fahrt auf einer Straße vor. Das Standardverhalten, wenn eine Zeile auf einen Laufzeitfehler trifft — ein fehlendes Blatt, ein /0, ein Typkonflikt —, ist eine Vollbremsung: Die Ausführung hält an, und Excel zeigt das gelbe Kästchen Laufzeitfehler '…' mit Debuggen / Beenden. Für dich zur Entwurfszeit ist das in Ordnung. Für jemanden, der dein Werkzeug benutzt, ist es eine Sackgasse, die er nicht lesen kann.

On Error ist die Weiche, die diesen Absturz umleitet. Sie verhindert den Fehler nicht — der Fehler passiert weiterhin —, sie entscheidet nur, wohin die Steuerung als Nächstes geht. Diese eine Umdeutung räumt die meiste Verwirrung aus dem Weg: Du „fängst" hier nichts im Sinne von Java oder Python, du legst ein Ziel für den nächsten Absturz fest.

Die Weiche bleibt für den Rest der aktuellen Prozedur umgelegt (oder bis du sie erneut umlegst). Sie gilt pro Prozedur — eine Routine, die du in DatenVerarbeiten setzt, hilft einem davon aufgerufenen Sub kein bisschen, sofern dieses Sub nicht seine eigene setzt.

Die eine Regel: On Error Resume Next versteckt Fehler, es behandelt sie nicht

Das ist die Regel, die ein robustes Makro von einer Zeitbombe trennt:

On Error Resume Next sagt VBA „was eben kaputtgegangen ist, tu so, als wäre nichts, und mach weiter." Es bringt das Symptom zum Schweigen. Es behebt das Problem nicht — und hält es nicht einmal fest.

Gezielt eingesetzt, auf genau einer Zeile, von der du das Scheitern erwartest, ist es perfekt. Achtlos eingesetzt — ein On Error Resume Next oben im Sub und dann vergessen — bringt es jeden Bug in dieser Prozedur zum Schweigen. Das Makro „funktioniert", schreibt halb leere Ergebnisse, und einen Monat lang merkt es niemand.

Das ehrliche Muster ist enger Geltungsbereich + sofortige Prüfung + sofort wieder abschalten:

' Wir WOLLEN eine Form löschen, die es vielleicht gibt — vielleicht auch nicht.
On Error Resume Next                  ' für genau eine riskante Zeile scharfschalten
ActiveSheet.Shapes("AltesLogo").Delete
If Err.Number <> 0 Then Err.Clear     ' zur Kenntnis nehmen & zurücksetzen — die Form war eben nicht da
On Error GoTo 0                       ' SOFORT entschärfen — keine Fehler mehr ignorieren

Drei Dinge machen das sicher: Es deckt eine einzige Zeile ab, es prüft Err.Number direkt danach (siehe das Err-Objekt), und es ruft On Error GoTo 0, um zu entschärfen. Lass eines davon weg, und du versteckst wieder Bugs.

Die zweite Falle: Exit Sub vor der Routine vergessen

Eine benannte Fehlerbehandlungsroutine ist nur Code am Ende der Prozedur. Nichts hält den normalen Weg davon ab, geradewegs in sie hineinzulaufen, sobald die eigentliche Arbeit fertig ist:

Sub BerichtSpeichern()
    On Error GoTo Fehlerbehandlung
    ' ... echte Arbeit, die gelingt ...
    MsgBox "Gespeichert!"            ' Erfolgsmeldung
                                     ' ⚠ kein Exit Sub — die Ausführung läuft weiter ...
Fehlerbehandlung:
    MsgBox "Speichern fehlgeschlagen."  ' ... und der Anwender sieht BEIDE Meldungen
End Sub

Bei einem erfolgreichen Lauf bekommt der Anwender „Gespeichert!" und „Speichern fehlgeschlagen." Die Lösung ist eine Zeile: Exit Sub (oder Exit Function) direkt vor dem Label der Routine, damit der normale Weg die Prozedur verlässt, bevor er durchfallen kann. Das ist das strukturelle Rückgrat, das in VBA Fehlerbehandlung behandelt wird.

On Error GoTo 0 — die Form, die alle vergessen

On Error GoTo 0 setzt die Fehlerüberwachung auf den Standard „stoppen und Dialog zeigen" zurück. Zwei Gründe, warum das zählt:

  • Nach einem bewussten Resume Next ist es der Weg, das Ignorieren von Fehlern wieder zu beenden, damit der nächste echte Bug nicht verschluckt wird.
  • Während der Entwicklung ist es der Weg, VBA auf der schuldigen Zeile anhalten zu lassen, damit du Debuggen drücken kannst — statt dass eine aktive Routine dich vom Tatort wegzieht.
On Error Resume Next
Set wb = Workbooks("Budget.xlsx")   ' vielleicht offen, vielleicht nicht
On Error GoTo 0                     ' ab hier stoppen Fehler das Makro wieder
If wb Is Nothing Then Set wb = Workbooks.Open("C:\Daten\Budget.xlsx")

Die Meinung: ein nacktes On Error Resume Next ohne Err-Prüfung ist ein Bug, keine Robustheit

Viele greifen zu On Error Resume Next, weil es den roten Dialog verschwinden lässt — und „keine Fehlermeldung" fühlt sich an wie „kein Fehler". Ist es aber nicht. Ein Makro, das nicht laut scheitern kann, ist ein Makro, dem du nicht trauen kannst — es scheitert eben leise in deine Daten hinein.

Meine Faustregel: Jedes On Error Resume Next braucht eine passende Err.Number-Prüfung und ein On Error GoTo 0 innerhalb weniger Zeilen. Kannst du diese beiden Begleiter nicht zeigen, hast du den Fehler nicht behandelt — du hast ihn vergraben. Für alles, was über das Überspringen eines einzigen erwarteten Fehlschlags hinausgeht, nimm On Error GoTo Label und eine echte Fehlerbehandlungsroutine.

Wann was

Du willst … Nimm Achte auf
alle Fehler an einen Ort leiten und reagieren On Error GoTo Fehlerbehandlung Exit Sub vor das Label setzen
eine Zeile überspringen, von der du Scheitern erwartest On Error Resume Next (eng) Err.Number prüfen, dann On Error GoTo 0
Ignorieren beenden / auf der echten Zeile debuggen On Error GoTo 0 ohne bleibt Resume Next scharf
die gescheiterte Zeile nach einer Korrektur erneut versuchen Resume (in der Routine) Endlosschleife, wenn die Ursache nicht behoben ist

Häufige On-Error-Fehler (und die Lösung)

Symptom Ursache Lösung
Makro läuft, Ergebnisse sind halb leer On Error Resume Next blieb an und verschluckt echte Fehler entfernen oder auf eine Zeile + On Error GoTo 0 eingrenzen
Anwender sieht Erfolgs- und Fehlermeldung kein Exit Sub vor dem Routine-Label Exit Sub direkt vor Fehlerbehandlung: ergänzen
„Sprungmarke nicht definiert" On Error GoTo X, aber kein Label X: in dieser Prozedur Label ergänzen oder Resume Next/GoTo 0 nehmen
Routine feuert, aber du erkennst nicht, was kaputt ist nie Err.Description / Err.Number gelesen das Err-Objekt in der Routine lesen
Fehler stoppt das Makro trotz gelaufener Routine Routine lief, ohne Resume oder Exit den Ausgang festlegen: Resume Next, Resume oder Exit Sub

Wenn die Fehlerbehandlung der Großteil deines Makros ist — beschreib die Aufgabe einfach

Achte mal darauf, wie viel von einem „simplen" Makro zu Leitungsverlegung wird: Routine scharfschalten, Err prüfen, entschärfen, aufräumen, entscheiden, ob fortgesetzt wird. In einer echten Pipeline — drei Dateien importieren, über die Bestell-ID abgleichen, Abweichungen markieren — kann das Fehler-Gerüst die Logik überwiegen, um die es dir eigentlich geht. ExcelMaster Agent lässt dich diese Aufgabe in Klartext-Deutsch nennen und erzeugt Python, das Fehlschläge schon abfängt und deine Datei vorab sichert — kein On Error, kein Resume, keine stille Datenkorruption. Kostenlos testen →

Verwandte Anleitungen

FAQ

Was macht On Error in VBA? On Error legt fest, was geschieht, wenn in der aktuellen Prozedur ein Laufzeitfehler auftritt. Statt des Standards (anhalten und den Dialog Laufzeitfehler zeigen) kannst du den Fehler an eine Routine leiten (On Error GoTo Label), die scheiternde Zeile überspringen (On Error Resume Next) oder den Standard wiederherstellen (On Error GoTo 0).

Ist On Error Resume Next schlechter Stil? Nicht grundsätzlich — aber nur, wenn es auf eine einzige Zeile eingegrenzt ist, von der du Scheitern erwartest, gefolgt von einer Err.Number-Prüfung und On Error GoTo 0. Über eine ganze Prozedur angelassen bringt es jeden Fehler zum Schweigen, versteckt Bugs und zerstört Ergebnisse still. Für die allgemeine Behandlung ist On Error GoTo Label vorzuziehen.

Was ist der Unterschied zwischen On Error GoTo 0 und On Error Resume Next? On Error Resume Next ignoriert Fehler und fährt mit der nächsten Zeile fort. On Error GoTo 0 tut das Gegenteil — es schaltet die Fehlerüberwachung ab, sodass der nächste Fehler das Makro stoppt und den Dialog wieder zeigt. Typischerweise nimmst du GoTo 0, um einen Resume Next-Block zu entschärfen.

Wie schalte ich die Fehlerbehandlung in VBA ab? Mit On Error GoTo 0. Es löscht jede aktive Einstellung von On Error Resume Next oder On Error GoTo Label für die aktuelle Prozedur und stellt VBAs Standardverhalten „bei Fehler anhalten" wieder her.

Wirkt On Error über aufgerufene Prozeduren hinweg? Nein. On Error gilt pro Prozedur. Wenn A eine Routine setzt und B aufruft, fängt As Routine einen Fehler in B nicht ab — es sei denn, B hat keine eigene Routine, dann pflanzt sich der Fehler hoch zu A. Jede Prozedur, die Behandlung braucht, sollte ihre eigene setzen.