在 VBA 中使用 Try-Catch

Glen Alfaro 2023年1月30日 2022年5月18日
  1. 使用 On Error Resume Next 处理 VBA 中的错误
  2. 使用 On Error GoTo 0 处理 VBA 中的错误
  3. 使用 On Error GoTo [Label] 处理 VBA 中的错误
在 VBA 中使用 Try-Catch

Try-Catch 方法可防止在计算机编程中发生内部错误时程序崩溃。防止系统错误并让代码执行顺畅流动很有用。

但是,与其他编程语言不同,VBA 没有 Try-Catch 块。从好的方面来说,它有专门为错误处理过程设计的变通方法。

在本文中,将讨论和演示 VBA 中的错误处理过程以及几个示例,这些示例将帮助你在 VBA 项目中实现错误处理方案。

错误处理程序是代码的重要组成部分。当 VBA 编译器无法处理事情时,它们是我们的首选。

下面列出了 VBA 错误处理方法:

  1. On Error Resume Next - 将忽略任何遇到的错误,代码将继续运行。
  2. On Error GoTo 0 - 将停止导致错误的行上的代码并显示一个描述错误的消息框。
  3. 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