Verwenden von Try-Catch in VBA

Glen Alfaro 18 April 2022
  1. Verwendung von On Error Resume Next zur Fehlerbehandlung in VBA
  2. Verwenden Sie On Error GoTo 0, um Fehler in VBA zu behandeln
  3. Verwenden Sie On Error GoTo [Label], um Fehler in VBA zu behandeln
Verwenden von Try-Catch in VBA

Die Try-Catch-Methode verhindert Programmabstürze, wenn ein interner Fehler in der Computerprogrammierung auftritt. Es ist nützlich, um Systemfehler zu verhindern und einen reibungslosen Ablauf der Codeausführung zu ermöglichen.

Im Gegensatz zu anderen Programmiersprachen verfügt VBA jedoch nicht über den Try-Catch-Block. Auf der guten Seite hat es Workaround-Methoden, die explizit für Fehlerbehandlungsverfahren entwickelt wurden.

In diesem Artikel werden Fehlerbehandlungsverfahren in VBA besprochen und zusammen mit mehreren Beispielen demonstriert, die Ihnen helfen würden, Fehlerbehandlungsschemata in Ihrem VBA-Projekt zu implementieren.

Fehlerhandler sind ein wichtiger Teil Ihres Codes. Sie sind unser Ansprechpartner, wenn der VBA-Compiler mit Dingen nicht umgehen kann.

Nachfolgend sind die VBA-Fehlerbehandlungsmethoden aufgeführt:

  1. On Error Resume Next – ignoriert alle aufgetretenen Fehler und der Code wird weiter ausgeführt.
  2. On Error GoTo 0 – stoppt den Code in der Zeile, die den Fehler verursacht, und zeigt ein Meldungsfeld an, das den Fehler beschreibt.
  3. On Error GoTo [Label] – Sie können angeben, was Sie tun möchten, wenn Ihr Code einen Fehler aufweist.

Wir werden alle diese Fehlerbehandlungsroutinen im Folgenden ausführlich besprechen.

Verwendung von On Error Resume Next zur Fehlerbehandlung in VBA

Dieser Fehlerhandler ermöglicht es dem Compiler, den Fehler zu ignorieren und die nächste Codezeile auszuführen. Es ist die häufig verwendete Fehlerbehandlungsroutine in VBA, da für die Implementierung kein komplizierter Code erforderlich ist.

Gehen Sie bei der Verwendung dieses Fehlerhandlers jedoch mit Vorsicht vor, da er Fehler ignoriert. Die Codeausführung wird mit diesen unerkannten Fehlern möglicherweise nicht wie geplant ausgeführt.

On Error Resume Next ist am besten, um zu wissen, auf welche Art von Fehlern Sie wahrscheinlich stoßen werden. Und wenn Sie glauben, dass es sicher ist, diese Fehler zu ignorieren, können Sie dies verwenden.

Der folgende Codeblock gibt ohne Fehlerbehandlungsroutinen einen Fehler aus, da eine Division durch Null mathematisch nicht zulässig ist.

Sub DivideNumbers()

Dim x,y,z as integer

x = 10/4
y = 15/0
z= 2/5

Debug.Print x & vbNewLine & y & vbNewLine & z

End Sub

DivideNumbers Ausgabe:

Error: ! Runtime Error '11':
         Division by Zero

Verwenden des Fehlerhandlers On Error Resume Next:

Sub DivideNumbers()
    On Error Resume Next
 
Dim x, y, z As Integer

x = 10 / 4
y = 15 / 0
z = 2 / 5

Debug.Print x & vbNewLine & y & vbNewLine & z

End Sub

DivideNumbers Ausgabe:

2.5

0

Die Ausgabe DivideNumbers zeigt, dass die zweite Zeile übersprungen wurde, da in dieser Zeile ein Division by Zero-Fehler aufgetreten ist.

Verwenden Sie On Error GoTo 0, um Fehler in VBA zu behandeln

Der Error-Handler On Error GoTo 0 setzt das Standard-Fehlerverhalten des Compilers zurück.

Warum also noch verwenden? Der Fehlerhandler On Error GoTo 0 adressiert das Risiko der Nichterkennung von Fehlern, die durch den Fehlerhandler On Error Resume Next verursacht werden. Daher wird On Error GoTo 0 typischerweise in Verbindung mit On Error Resume Next verwendet, um eine Fehlererkennung in dem Codeabschnitt zu ermöglichen, in dem kein Fehler auftreten sollte.

Um eine bessere Erklärung zu erhalten, sehen Sie sich den folgenden Codeblock an:

Sub ErrorSub()
    On Error Resume Next

'An error could happen in this area but will not be detected.

    On Error Goto 0

'Once an Error occurs, an error message will appear.

End Sub

Ein besseres Beispiel finden Sie im folgenden Codeblock.

Sub DivideNumbers()
    On Error Resume Next

Dim x, y, z, a, b, c

x = 3 / 2
y = 0 / 0
z = 2 / 6

Debug.Print x & vbNewLine & y & vbNewLine & z
    On Error GoTo 0

a = 8 / 7
b = 2 / 0
c = 2 / 7

Debug.Print a & vbNewLine & b & vbNewLine & c
End Sub

DivideNumbers Ausgabe:

1.5
0.333333333333333

Dann ist ein Fehler aufgetreten, da das On Error Resume Next durch das On Error GoTo 0 im zweiten Teil des Codes negiert wurde.

Error: ! Runtime Error '11':
         Division by Zero

Verwenden Sie On Error GoTo [Label], um Fehler in VBA zu behandeln

Die beiden obigen Fehlerbehandlungsroutinen behandeln keine Fehler; Entweder sie haben den Fehler übersprungen oder vernachlässigt. Der dritte Fehlerbehandler, On Error GoTo [Label], ermöglicht es Ihnen, den Fehler zu behandeln und die Aktion auszuwählen, die ausgeführt werden soll, wenn ein Fehler auftritt.

Es gibt mehrere Best Practices bei der Verwendung von On Error GoTo [Label], eine besteht darin, die Codeausführung zu beenden, wenn ein Fehler auftritt, und die andere besteht darin, den Fehler zu korrigieren, es dann erneut zu versuchen, und vieles mehr. Das folgende Beispiel demonstriert die Verwendung von On Error GoTo [Label].

Der folgende Codeblock beendet den Code automatisch, wenn ein Fehler auftritt.

Sub DivideNumbertoNumber()
    On Error GoTo ErrHandler

Dim i As Integer

For i = 5 To -5 Step -1
Debug.Print i / i

Next i

ErrHandler:

End Sub

DivideNumbertoNumber Ausgabe:

 1 
 1 
 1 
 1 
 1 

Wie beobachtet, stoppte die Codeausführung, wenn i= 0, da i geteilt durch i 0 geteilt durch 0 bedeuten würde, was zu einem Überlauf führen würde.

Im nächsten Beispiel demonstrieren wir, wie im Immediate Window gedruckt werden kann, wenn ein Fehler auftritt. Wir können auch die Eigenschaft Err.Description verwenden, um den eigentlichen Fehler auszugeben.

Sub DivideNumbertoNumber()
    On Error GoTo ErrHandler

Dim i As Integer

For i = 5 To -5 Step -1
Debug.Print i / i

Next i

Exit Sub

ErrHandler:
Debug.Print "An Error occured at i is equal to " & i & vbNewLine & "Error Type: " & Err.Description

End Sub

DivideNumbertoNumber Ausgabe:

 1 
 1 
 1 
 1 
 1 
An Error occured at i is equal to 0
Error Type: Overflow

Beachten Sie, dass Exit Sub vor dem ErrHandler platziert wurde, um die Subroutine zu verlassen, bevor sie den ErrHandler erreicht, für die Fälle, in denen kein Fehler aufgetreten ist. Ohne das Einfügen des Exit Sub würde der Compiler den ErrHandler ausführen, auch wenn kein Fehler vorliegt.