VBA On Error Resume Next oder Goto 0
In this Article
In diesem Tutorial zeigen wir Ihnen, wie Sie die VBA-Funktionen On Error Resume Next und On Error Goto 0 verwenden können.
Lesen Sie unser Tutorial für weitere Informationen über die Fehlerbehandlung in VBA.
On Error Resume Next
On Error Resume Next weist VBA an, fehlerhafte Codezeilen zu überspringen und mit der nächsten Zeile fortzufahren. Das funktioniert folgendermaßen:
Sub OnErrorResumeNextDemo()
On Error Resume Next
MsgBox 5 / 0
MsgBox "Erledigt"
End Sub
Die Zeile MsgBox 5 / 0 würde einen Fehler auslösen (man kann nicht durch Null dividieren). Durch Hinzufügen von On Error Resume Next überspringt VBA diese Zeile und führt den Rest der Prozedur aus. Sie können dies selbst testen, indem Sie den Code kopieren und einfügen und dann On Error Resume Next auskommentieren.
On Error GoTo 0
On Error GoTo 0 ist die Standardeinstellung von VBA. Wenn ein Fehler mit On Error GoTo 0 auftritt, hält VBA die Ausführung des Codes an und zeigt sein Standard-Fehlermeldungsfenster wie im folgenden Beispiel an:
Es besteht keine Notwendigkeit, On Error GoTo 0 zu deklarieren, es sei denn, Sie haben eine andere Fehlerbehandlung in Ihrer Prozedur deklariert.
Wenn Sie in Ihrem Code eine Fehlerfalle wie On Error Resume Next hinzugefügt haben, können Sie On Error Goto 0 einfügen, um die Standardfehlerbehandlung von VBA wiederherzustellen.
Sub OnErrorResumeNextDemo()
OnError Resume Next
MsgBox 5 / 0
On Error GoTo 0
MsgBox "Erledigt"
End Sub
Dies ist sehr wichtig! On Error Resume Next sollte nur mit Vorsicht und nur dann verwendet werden, wenn es absolut notwendig ist.
Beispiel für On Error Resume Next
Gehen wir ein Beispiel durch, um zu zeigen, wie Sie On Error Resume Next in der Praxis verwenden können. Mit diesem Code wird jedes Arbeitsblatt in der Arbeitsmappe ausgeblendet:
Sub AlleBlaetterAusblenden()
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Sheets
ws.Visible = False
Next ws
End Sub
Wenn wir diesen Code ausführen, erhalten wir einen Fehler, da wir nicht alle Arbeitsblätter in einer Arbeitsmappe ausblenden können. Mindestens eine Arbeitsmappe muss sichtbar bleiben.
Wenn wir jedoch, wie unten gezeigt, On Error Resume Next zu der Prozedur hinzufügen, wird der Code über den Fehler hinaus fortgesetzt und das letzte Blatt in der Arbeitsmappe bleibt sichtbar.
Sub AlleBlaetterAusblenden()
On Error Resume Next
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Sheets
ws.Visible = False
Next ws
End Sub
Nehmen wir an, wir wollen unserer Prozedur weiteren Code hinzufügen. Als nächstes fügen wir On Error GoTo 0 hinzu, um die Standardfehlerbehandlung von VBA wiederherzustellen.
Sub ErrorGoTo0()
On Error Resume Next
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Sheets
ws.Visible = False
Next ws
On Error GoTo 0
'Weiteren Code hier als Beispiel ausführen:
ActiveSheet.Name = "Tabelle1"
End Sub
Wenn nun ein Fehler nach der Zeile mit On Error Goto 0 auftritt, wird die Excel-Standardfehlermeldung angezeigt. In diesem Beispiel haben wir bereits ein Blatt mit dem Namen Tabelle1 im ActiveWorkbook, da der Code oberhalb von On Error Goto 0 das Blatt ausblendet, es aber nicht löscht. Die Excel-Standardfehlermeldung, die besagt, dass der Blattname bereits in Verwendung ist, würde dann angezeigt werden.
On Error Goto Zeile
Wir können auch erzwingen, dass unser Code zu einer anderen Codezeile wechselt, indem wir den Befehl On Error Goto Zeile (Weitere Informationen) verwenden, der VBA anweist, zu einer bestimmten Codezeile zu wechseln, wenn ein Fehler auftritt.
Sub ErrorGoToZeile()
On Error Resume Next
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Sheets
ws.Visible = False
Next ws
On Error GoTo errhandler
ActiveSheet.Name = "Tabelle1"
Exit Sub
errhandler:
MsgBox("Es existiert bereits ein Blatt namens Tabelle1!", vbCritical)
End Sub
Im obigen Beispiel springt der Code, wenn er das Blatt „Tabelle1“ findet, in die Codezeile unter dem Fehlerbehandlungsetikett. In diesem Fall ruft er eine benutzerdefinierte Meldungsbox auf, die die Benutzer darüber informiert, dass das Blatt bereits existiert. Die Beschriftung des Fehlerbehandlungsprogramms muss einen Doppelpunkt enthalten, um VBA anzuweisen, dass es sich um eine Beschriftung handelt.
errhandler:
Der Code springt dann in die Zeile unter der Beschriftung und gibt die benutzerdefinierte Meldungsbox zurück.
Dies ist nützlich, wenn Sie nicht möchten, dass Ihr Benutzer auf Debug klicken kann, um in Ihren Code zu gelangen, da die Standard-Excel-Meldung immer eine Option zum Debuggen des Codes bietet.
Wir brauchen auch ein Exit Sub in der Prozedur. Wenn es KEIN Blatt mit dem Namen Tabelle1 gibt, würde diese Codezeile ausgeführt und das aktuelle Blatt in Tabelle1 umbenannt werden. Wir möchten, dass der Code endet. Wir möchten nicht, dass er mit der Fehlerbehandlung fortfährt und die Meldungsbox anzeigt. Mit der Zeile Exit Sub wird die Prozedur beendet und der Code angehalten.