在 VBA 中使用 Try-Catch
-
使用
On Error Resume Next
处理 VBA 中的错误 -
使用
On Error GoTo 0
处理 VBA 中的错误 -
使用
On Error GoTo [Label]
处理 VBA 中的错误
Try-Catch
方法可防止在计算机编程中发生内部错误时程序崩溃。防止系统错误并让代码执行顺畅流动很有用。
但是,与其他编程语言不同,VBA 没有 Try-Catch
块。从好的方面来说,它有专门为错误处理过程设计的变通方法。
在本文中,将讨论和演示 VBA 中的错误处理过程以及几个示例,这些示例将帮助你在 VBA 项目中实现错误处理方案。
错误处理程序是代码的重要组成部分。当 VBA 编译器无法处理事情时,它们是我们的首选。
下面列出了 VBA 错误处理方法:
On Error Resume Next
- 将忽略任何遇到的错误,代码将继续运行。On Error GoTo 0
- 将停止导致错误的行上的代码并显示一个描述错误的消息框。On Error GoTo [Label]
- 如果你的代码有错误,你可以指定要执行的操作。
我们将在下面详细讨论所有这些错误处理例程。
使用 On Error Resume Next
处理 VBA 中的错误
此错误处理程序允许编译器忽略错误并执行下一个代码行。它是 VBA 中常用的错误处理程序,因为它不需要任何复杂的代码来实现。
但是,在使用此错误处理程序时,请谨慎行事,因为它会忽略错误。由于这些未检测到的错误,代码执行可能无法按计划执行。
On Error Resume Next
最好知道你可能会遇到什么样的错误。然后,如果你认为忽略这些错误是安全的,你可以使用它。
下面的代码块将在没有错误处理例程的情况下输出错误,因为在数学上不允许除以零。
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
输出:
Error: ! Runtime Error '11':
Division by Zero
使用 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
输出:
2.5
0
DivideNumbers
输出显示第二行已被跳过,因为该行发生除零
错误。
使用 On Error GoTo 0
处理 VBA 中的错误
On Error GoTo 0
错误处理程序重置编译器的默认错误行为。
那为什么还要用呢?On Error GoTo 0
错误处理程序解决了由 On Error Resume Next
错误处理程序引起的未检测到错误的风险。因此,On Error GoTo 0
通常与 On Error Resume Next
结合使用,以在不应发生错误的代码部分启用错误检测。
要获得更好的解释,请参见下面的代码块:
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
有关更好的示例,请参见下面的代码块。
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
输出:
1.5
0.333333333333333
然后发生错误,因为代码第二部分的 On Error GoTo 0
否定了 On Error Resume Next
。
Error: ! Runtime Error '11':
Division by Zero
使用 On Error GoTo [Label]
处理 VBA 中的错误
上面的两个错误处理程序不处理错误;他们要么跳过了这个错误,要么忽略了这个错误。第三个错误处理程序 On Error GoTo [Label]
将允许你处理错误并让你选择发生错误时要采取的操作。
使用 On Error GoTo [Label]
有几个最佳实践,一个是在发生错误时终止代码执行,另一个是纠正错误,然后重试等等。下面的示例将演示 On Error GoTo [Label]
的用法。
下面的代码块会在发生错误时自动终止代码。
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
输出:
1
1
1
1
1
正如所观察到的,当 i
= 0 时代码执行停止,因为 i
除以 i
意味着 0 除以 0,这将导致溢出。
在下一个示例中,我们将演示如果发生错误,如何在立即窗口
中打印。我们还可以使用 Err.Description
属性来打印实际错误。
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
输出:
1
1
1
1
1
An Error occured at i is equal to 0
Error Type: Overflow
请注意,在没有发生错误的情况下,将 Exit Sub
放在 ErrHandler
之前以在子程序到达 ErrHandler
之前退出子程序。如果没有插入 Exit Sub
,即使没有错误,编译器也会执行 ErrHandler
。