VBA On Error – Beste Praktiken der Fehlerbehandlung
In this Article
Spickzettel für VBA-Fehler
Fehler
Siehe weitere „VBA-Spickzettel“ und kostenlose PDF Downloads
VBA-Fehlerbehandlung
VBA-Fehlerbehandlung bezieht sich auf den Prozess des Voraussehens, Erkennung und Behebung von VBA-Laufzeitfehlern. Der Prozess der VBA-Fehlerbehandlung findet beim Schreiben vom Code statt, bevor Fehler tatsächlich auftreten.
VBA-Laufzeitfehler sind Fehler, die während der Code-Ausführung auftreten. Beispiele für Laufzeitfehler sind:
- DerVerweis auf eine nicht existierende Arbeitsmappe, ein Arbeitsblatt oder ein anderes Objekt (Laufzeitfehler 1004)
- Ungültige Daten, z. B. Verweis auf eine Excel-Zelle, die einen Fehler enthält (Inkompatible Datentypen – Laufzeitfehler 13)
- Der Versuch, durch Null zu dividieren
Die VBA-Anweisung On Error
Die meisten VBA-Fehlerbehandlungen werden mit der Anweisung On Error durchgeführt. Die Anweisung On Error sagt VBA, was zu tun ist, wenn ein Fehler auftritt. Es gibt drei typen von der Anweiung On Error:
- Bei Fehler GoTo 0
- Bei Fehler Resume Next
- Bei Fehler GoTo Line
On Error GoTo 0
On Error GoTo 0 ist die Standardeinstellung von VBA. Sie können diese Standardeinstellung wiederherstellen, indem Sie die folgende Codezeile hinzufügen:
On Error GoTo 0
Wenn ein Fehler mit On Error GoTo 0 auftritt, hält VBA die Ausführung des Codes an und zeigt sein Standard-Fehlermeldungsfenster an.
Sie werden häufig ein On Error GoTo 0 nach dem Hinzufügen von der Fehlerbehandlung On Error Resume Next (nächster Abschnitt) hinzufügen:
Sub ErrorGoTo0()
On Error Resume Next
ActiveSheet.Shapes("Start_Button").Delete
On Error GoTo 0
'Mehr Code ausführen
End Sub
On Error Resume Next
On Error Resume Next weist VBA an, alle fehlerhaften Codezeilen zu überspringen und mit der nächsten Zeile fortzufahren.
On Error Resume Next
Hinweis: On Error Resume Next behebt einen Fehler nicht oder löst ihn anderweitig auf. Sie weist VBA lediglich an, so fortzufahren, als ob die fehlerhafte Codezeile nicht vorhanden wäre. Eine unsachgemäße Verwendung von On Error Resume Next kann zu unbeabsichtigten Folgen führen.
Ein guter Zeitpunkt für die Verwendung von On Error Resume Next ist bei der Arbeit mit Objekten, die existieren können oder auch nicht. Sie möchten beispielsweise einen Code schreiben, mit dem eine Form gelöscht wird. Wenn Sie den Code jedoch ausführen, während die Form bereits gelöscht ist, wird VBA einen Fehler ausgeben. Stattdessen können Sie On Error Resume Next verwenden, um VBA anzuweisen, die Form zu löschen, wenn sie existiert.
On Error Resume Next
ActiveSheet.Shapes("Start_Button").Delete
On Error GoTo 0
Beachten Sie, dass wir On Error GoTo 0 nach der Codezeile mit dem potenziellen Fehler hinzugefügt haben. Dadurch wird die Fehlerbehandlung zurückgesetzt.
Im nächsten Abschnitt zeigen wir Ihnen, wie Sie mithilfe von Err.Number testen können, ob ein Fehler aufgetreten ist, und wie Sie weitere Optionen für die Fehlerbehandlung erhalten.
Err.Number, Err.Clear und das Abfangen von Fehlern
Anstatt eine Zeile mit einem Fehler einfach zu überspringen, können wir den Fehler abfangen, indem wir On Error Resume Next und Err.Number verwenden.
Err.Number gibt eine Fehlernummer zurück, die dem Typ des festgestellten Fehlers entspricht. Liegt kein Fehler vor, ist Err.Number = 0.
Diese Prozedur gibt zum Beispiel „11“ zurück, weil der aufgetretene Fehler der Laufzeitfehler ’11‘ ist.
Sub FehlerNummer_Beispiel()
On Error Resume Next
ActiveCell.Value = 2 / 0
MsgBox Err.Number
End Sub
Fehlerbehandlung mit Err.Number
Die wahre Stärke von Err.Number liegt in der Fähigkeit zu erkennen, ob ein Fehler aufgetreten ist (Err.Number <> 0). Im folgenden Beispiel haben wir eine Funktion erstellt, die mit Hilfe von Err.Number prüft, ob ein Blatt existiert.
Sub TestArbeitsblatt()
MsgBox ArbeitsblattExist("test")
End Sub
Function ArbeitsblattExist(arbeitsblattName As String) As Boolean
Dim ws As Worksheet
On Error Resume Next
Set ws = Sheets(arbeitsblattName)
'Wenn WS nicht existiert (Fehler)
If Err.Number <> 0 Then
ArbeitsblattExist = False
Else
ArbeitsblattExist = True
End If
On Error GoTo -1
End Function
Hinweis: Wir haben ein On Error GoTo -1 am Ende hinzugefügt, das Err.Number auf 0 zurücksetzt (siehe zwei Abschnitte weiter unten).
Mit On Error Resume Next und Err.Number können Sie die „Try“- und „Catch“ -Funktionalität anderer Programmiersprachen nachbilden.
On Error GoTo Line
On Error GoTo Line weist VBA an, zu einer gekennzeichneten Codezeile zu springen, wenn ein Fehler auftritt. Sie deklarieren die GoTo-Anweisung folgendermaßen, wobei errHandler die Zeile ist, zu der gewechselt werden soll:
On Error GoTo errHandler
und erstellen eine Zeilenbeschriftung wie diese:
errHandler:
Hinweis: Dies ist die gleiche Beschriftung, die Sie bei einer normalen VBA-GoTo-Anweisung verwenden würden.
Im Folgenden werden wir die Verwendung von On Error GoTo Line zum Beenden einer Prozedur demonstrieren.
On Error Exit Sub
Sie können On Error GoTo Line verwenden , um eine Sub-Prozedur zu beenden, wenn ein Fehler auftritt. Sie können dies tun, indem Sie das Label der Fehlerbehandlungszeile am Ende Ihrer Prozedur platzieren:
Sub ErrGoToEnd()
On Error GoTo endProc
'Beliebiger Code
endProc:
End Sub
oder durch Verwendung des Befehls Exit Sub:
Sub ErrGoToEnd()
On Error GoTo endProc
'Beliebiger Code
GoTo skipExit
endProc:
Exit Sub
skipExit:
'Etwas mehr Code
End Sub
Err.Clear, On Error GoTo -1, und Zurücksetzen von Err.Number
Nachdem ein Fehler behandelt wurde, sollten Sie ihn im Allgemeinen löschen, um zukünftige Probleme bei der Fehlerbehandlung zu vermeiden.
Nachdem ein Fehler aufgetreten ist, können sowohl Err.Clear als auch On Error GoTo -1 verwendet werden, um Err.Number auf 0 zurückzusetzen. Es gibt jedoch einen sehr wichtigen Unterschied: Err.Clear setzt nicht den eigentlichen Fehler selbst zurück, sondern nur die Err.Number.
Was bedeutet das? Wenn Sie Err.Clear verwenden, können Sie die Einstellung für die Fehlerbehandlung nicht ändern. Um den Unterschied zu sehen, probieren Sie diesen Code aus und ersetzen Sie On Error GoTo -1 durch Err.Clear:
Sub Err_Beispiele()
On Error GoTo errHandler:
'"Anwendungsdefinierter" Fehler
Error (13)
Exit Sub
errHandler:
' Fehler löschen
On Error GoTo -1
On Error GoTo errHandler2:
'Fehler "Inkompatible Typen"
Error (1034)
Exit Sub
errHandler2:
Debug.Print Err.Description
End Sub
Normalerweise empfehle ich, immer On Error GoTo -1 zu verwenden, es sei denn, Sie haben einen guten Grund, stattdessen Err.Clear zu verwenden.
VBA On Error MsgBox
Vielleicht möchten Sie bei einem Fehler auch eine Meldungsbox anzeigen. In diesem Beispiel werden verschiedene Meldungsfelder angezeigt, je nachdem, wo der Fehler auftritt:
Sub ErrorMessageEx()
Dim fehlerMeldung As String
On Error GoTo errHandler
'Stufe 1
fehlerMeldung = "Beim Kopieren und Einfügen ist ein Fehler aufgetreten"
'Err.Raise (11)
'Stufe 2
fehlerMeldung = "Während der Datenüberprüfung ist ein Fehler aufgetreten"
'Err.Raise (11)
'Stufe 3
fehlerMeldung = "Während der Phase der GuV-Erstellung und Copy-Over ist ein Fehler aufgetreten"
Err.Raise (11)
'Stufe 4
fehlerMeldung = "Beim Versuch, den Import auf der Setup-Seite zu protokollieren, ist ein Fehler aufgetreten"
'Err.Raise (11)
GoTo endProc
errHandler:
MsgBox fehlerMeldung
endProc:
End Sub
Hier würden Sie Err.Raise(11) durch Ihren eigentlichen Code ersetzen.
VBA – IsError
Eine weitere Möglichkeit, mit Fehlern umzugehen, besteht darin, sie mit der VBA-Funktion IsError zu testen. Die IsError-Funktion testet einen Ausdruck auf Fehler und gibt TRUE oder FALSE zurück, wenn ein Fehler auftritt.
Sub IsErrorBeispiel()
MsgBox IsError(Range("a7").Value)
End Sub
VBA – IfError
Sie können Fehler in VBA auch mit der Excel-Funktion IfError behandeln. Der Zugriff auf die IfError-Funktion muss über die WorksheetFunction-Klasse erfolgen :
Sub IfErrorBeipiel()
Dim n As Long
n = WorksheetFunction.IfError(Range("a10").Value, 0)
MsgBox n
End Sub
Dies gibt den Wert von Bereich A10 aus, wenn der Wert ein Fehler ist, wird stattdessen 0 ausgegeben.
VBA-Fehlertypen
Laufzeit-Fehler
Wie oben erwähnt: VBA-Laufzeitfehler sind Fehler, die während der Code-Ausführung auftreten. Beispiele für Laufzeitfehler sind:
- Verweis auf eine nicht existierende Arbeitsmappe, ein Arbeitsblatt oder ein anderes Objekt
- Ungültige Daten, z. B. Verweis auf eine Excel-Zelle, die einen Fehler enthält
- Versuch, durch Null zu dividieren
Sie können Laufzeitfehler mit den oben beschriebenen Methoden „behandeln“.
Syntax-Fehler
VBA-Syntaxfehler sind Fehler beim Schreiben von Code. Beispiele für Syntaxfehler sind:
- Falsche Schreibweise
- Fehlende oder falsche Zeichensetzung
Der VBA-Editor kennzeichnet viele Syntaxfehler durch rote Hervorhebung:
Der VBA-Editor verfügt auch über eine Option zur „automatischen Syntaxprüfung“:
Wenn diese Option aktiviert ist, generiert der VBA-Editor nach der Eingabe einer Codezeile ein Meldungsfeld, das auf Syntaxfehler hinweist:
Ich persönlich empfinde dies als äußerst lästig und deaktiviere diese Funktion.
Kompilierfehler
Bevor Sie versuchen, eine Prozedur auszuführen, „kompiliert“ VBA die Prozedur. Durch das Kompilieren wird das Programm vom Quellcode (den Sie sehen können) in eine ausführbare Form umgewandelt (die Sie nicht sehen können).
VBA-Kompilierfehler sind Fehler, die verhindern, dass der Code kompiliert werden kann.
Ein gutes Beispiel für einen Kompilierfehler ist eine fehlende Variablendeklaration:
Andere Beispiele sind:
- For ohne Next
- Select ohne End Select
- If ohne End If
- Aufruf einer Prozedur, die nicht existiert
Syntaxfehler (voriger Abschnitt) sind eine Untergruppe von Kompilierfehlern.
Debuggen > Kompilieren
Kompilierfehler werden angezeigt, wenn Sie versuchen, eine Prozedur auszuführen. Idealerweise sollten Sie jedoch Kompilierfehler erkennen, bevor Sie versuchen, die Prozedur auszuführen.
Dies können Sie tun, indem Sie das Projekt im Voraus kompilieren. Gehen Sie dazu zu Debuggen > VBA-Projekt kompilieren.
Der Compiler wird zum ersten Fehler „gehen“. Sobald Sie diesen Fehler behoben haben, kompilieren Sie das Projekt erneut. Wiederholen Sie diesen Vorgang, bis alle Fehler behoben sind.
Dass alle Fehler behoben sind, erkennen Sie daran, dass „VBA-Projekt kompilieren“ ausgegraut ist:
Überlauffehler
Der VBA-Überlauffehler (Engl. Overflow) tritt auf, wenn Sie versuchen, einen zu großen Wert in eine Variable einzugeben. Integer-Variablen können zum Beispiel nur Werte zwischen -32.768 und 32.768 enthalten. Wenn Sie einen größeren Wert eingeben, erhalten Sie einen Überlauffehler:
Stattdessen sollten Sie die Long-Variable verwenden, um die größere Zahl zu speichern.
Andere VBA-Fehlerbegriffe
VBA-Catch-Fehler
Im Gegensatz zu anderen Programmiersprachen gibt es in VBA keine Catch-Anweisung. Sie können jedoch eine Catch-Anweisung nachbilden, indem Sie „On Error Resume Next“ und „If Err.Number <> 0 Then“ verwenden. Dies wird oben in Fehlerbehandlung mit Err.Number behandelt.
VBA-Fehler ignorieren
Um Fehler in VBA zu ignorieren, verwenden Sie einfach die On Error Resume Next anweisung:
On Error Resume Next
Wie bereits erwähnt, sollten Sie mit dieser Anweisung jedoch vorsichtig sein, da sie einen Fehler nicht behebt, sondern lediglich die Codezeile ignoriert, die den Fehler enthält.
VBA – Throw Error / Err.Raise
Um einen Fehler in VBA zu beheben, verwenden Sie die Methode Err.Raise.
Diese Codezeile löst den Laufzeitfehler ’13‘ aus: inkompatible Typen (Engl. Type mismatch):
Err.Raise (13)
VBA-Fehlerüberbrückung
VBA-Fehlerüberbrückung (Engl. VBA Error Trapping) ist nur ein anderer Begriff für die VBA-Fehlerbehandlung.
VBA-Fehlermeldung
Eine VBA-Fehlermeldung sieht folgendermaßen aus:
Wenn Sie auf „Debuggen“ klicken, sehen Sie die Codezeile, die den Fehler verursacht hat:
VBA-Fehlerbehandlung in einer Schleife
Die beste Methode zur Fehlerbehandlung in einer Schleife ist die Verwendung von On Error Resume Next zusammen mit Err.Number, um zu erkennen, ob ein Fehler aufgetreten ist (denken Sie daran, Err.Clear zu verwenden, um den Fehler nach jedem Auftreten zu löschen).
Das folgende Beispiel dividiert zwei Zahlen (Spalte A durch Spalte B) und gibt das Ergebnis in Spalte C aus. Wenn ein Fehler auftritt, wird das Ergebnis 0 sein.
Sub test()
Dim Zelle As Range
On Error Resume Next
For Each Zelle In Range("a1:a10")
'Zellenwert setzen
Zelle.Offset(0, 2).Value = Zelle.Value / Zelle.Offset(0, 1).Value
'Wenn Zelle.Value Fehlerhaft ist, dann Standardwert 0
If Err.Number <> 0 Then
Zelle.Offset(0, 2).Value = 0
Err.Clear
End If
Next
End Sub
VBA-Fehlerbehandlung in Access
Alle oben genannten Beispiele funktionieren in Access VBA genau so wie in Excel VBA.
Function DatensatzLoeschen(formular As Form)
'Diese Funktion wird verwendet, um einen Datensatz in einer Tabelle aus einem Formular zu löschen
On Error GoTo ending
With formular
If .NewRecord Then
.Undo
End Function
End If
End With
With formular.RecordsetClone
.Bookmark = formular.Bookmark
.Delete
formular.Requery
End With
End Function
ending:
End
End Function