Verwenden von Try-Catch in VBA
-
Verwendung von
On Error Resume Next
zur Fehlerbehandlung in VBA -
Verwenden Sie
On Error GoTo 0
, um Fehler in VBA zu behandeln -
Verwenden Sie
On Error GoTo [Label]
, um Fehler in VBA zu behandeln
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:
On Error Resume Next
– ignoriert alle aufgetretenen Fehler und der Code wird weiter ausgeführt.On Error GoTo 0
– stoppt den Code in der Zeile, die den Fehler verursacht, und zeigt ein Meldungsfeld an, das den Fehler beschreibt.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.