Rückkehr in VBA-Code-Beispiele

VBA On Error – Beste Praktiken der Fehlerbehandlung

Spickzettel für VBA-Fehler

Fehler

Beschreibung
VBA-Code
On Error – Code anhalten und Fehler anzeigen
On Error GoTo 0
On Error – Fehler überspringen und den Code weiterlaufen lassen
On Error Resume Next
On Error – Gehe zu einer Codezeile [Label]
On Error GoTo [Label]
Fehler löschen (zurücksetzen)
On Error GoTo – 1
Fehlernummer anzeigen
Fehlernummer in einer Meldungsbox anzeigen
Fehlerbeschreibung anzeigen
Fehlerbeschreibung in einer Meldungsbox anzeigen
Funktion zum Erzeugen eines eigenen Fehlers
Err.Raise

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:

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.

vba laufzeitsfehler unverträgliche typen

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

vba laufzeitsfehler null division

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

vba laufzeitsfehler unverträgliche typen

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:

vba syntaxfehler beispiel

Der VBA-Editor verfügt auch über eine Option zur „automatischen Syntaxprüfung“:

vba optionen syntaxpruefung

Wenn diese Option aktiviert ist, generiert der VBA-Editor nach der Eingabe einer Codezeile ein Meldungsfeld, das auf Syntaxfehler hinweist:

vba meldung kompilierfehler

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:

vba variable definieren komplierfehler variable nicht definiert Andere Beispiele sind:

  • For ohne Next
  • Select ohne End Select
  • If ohne End If
  • Aufruf einer Prozedur, die nicht existiert

kompilierungsfehler if ohne endif

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.

vba debuggen 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:

vba projekt kompilieren deaktiviert

Ü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:

vba laufzeitsfehler ueberlauf

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 laufzeitsfehler unverträgliche typen

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:

vba laufzeitsfehler unverträgliche typen

Wenn Sie auf „Debuggen“ klicken, sehen Sie die Codezeile, die den Fehler verursacht hat:

vba fehlermeldung anzeigen

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