VBA 错误处理

2025年3月17日 | 阅读 7 分钟

VBA 代码通常容易出错,开发人员总是会犯错误,无论是语法错误还是逻辑错误。 犯错误是很常见的,因为代码不可能永远完美。

错误处理标准是一种专业的编码方法,通过这种方法我们可以计算和调整代码中的错误。 这是一个预测错误并找到我们可以自动响应错误的方法的技术,这样程序就不会崩溃。 它涉及编程行为,以防止失败或正确报告失败(通过通知用户或退出程序),以防发生任何故障。

在继续之前,首先让我们了解什么是错误及其类型。

什么是错误?

"错误定义为中断代码流程或在运行任何程序时创建问题的编程条件。"

错误类型

VBA 编程中会出现三种类型的错误:(a) 语法错误,(b) 编译错误 (c) 运行时错误和 (d) 逻辑错误。

语法错误

语法错误,也称为编译错误或解析错误。 它们发生在 VBScript 的解释时。 例如,下面的程序将抛出一个语法错误,因为我们错误地将对象“worksheets”拼写为“workshee”。

程序

编译错误

当代码中缺少运行宏所需的某些内容时,会发生编译错误。 很多时候,在使用 VBA 时,语法在程序的单行中是正确的,但在考虑所有项目代码时会出现错误。

一些常见的编译错误示例包括

  • 你的宏中的 If 语句没有 End If 语句
  • 使用 For 循环而没有 Next 语句
  • 你的宏中的 Select 语句没有 End Select 语句
  • 在你的程序中定义一个不存在的 Sub 或 Function
  • 使用错误的参数调用 Sub 或 Function
  • Option Explicit 出现在代码的开头,并且变量未在顶部声明

示例 1:使用 If 而没有 End IF

一旦你运行上面的代码,VBA 将抛出一个编译错误。 这是因为我使用了 If Then 语句,但没有用所需的“End If”关闭它。

运行时错误

运行时错误,也称为异常。 这些错误类型在代码执行期间(解释后)发生。

示例 1:演示运行时错误

一旦你运行上面的宏,它将抛出运行时错误,因为这里的语法是正确的,但在运行时它试图调用 fnmul,而函数 fnmul 在我们的程序中不存在。

逻辑错误

逻辑错误是最难处理的类型,因为一个错误可能会改变整个结果。 此外,逻辑错误很难追踪,因为它取决于你的业务逻辑。 与其他错误不同,这些错误不是语法错误或运行时错误的结果。 它们发生在用户在程序逻辑中犯错而改变脚本时,并且用户没有得到期望的输出。

例如,如果你将一个数字除以零或编写进入无限循环的脚本。

示例 1:演示逻辑错误的程序

代码

Err 对象

假设我们有一个运行时错误,那么执行会停止并显示错误消息。 作为开发人员,如果我们要捕获错误,则使用 Error Object。

什么是错误处理?

错误处理定义为处理在代码运行时发生的各种编程错误的方法。 错误处理的实践使你的代码看起来更专业,更准备好应对错误。 在某些时候,如果你认为可能会发生错误,那么使用错误处理技术进行控制是一个好习惯。

错误处理的优点

  1. 错误处理可以检查所有类型的错误,即逻辑错误、运行时错误和语法错误。
  2. 如果发生错误,它将自动跳过代码的其余部分并给你一个通知或执行其他步骤。
  3. 它可以更新或告知用户代码中的错误信息。

错误处理方法

错误处理可以通过以下方法来实践

  • 转到行
  • 转到 0
  • 转到 -1
  • 恢复下一个

1. 转到行

这种错误处理方法启用在给定行参数中指定的行开始的错误处理例程。 如果遇到任何编译时或运行时错误,它会将程序流重新定位到在同一过程中指定的行。

示例 1:编写一个代码,其中 Excel 工作表中不存在 sheet5


VBA Error Handling

输出

按 F5 键运行代码并获取输出。 因此,它将返回编译错误。

VBA Error Handling

在上面的宏中,Excel 工作表不包含 Sheet5。 此外,我们没有处理这些类型的错误,因此,VBA 抛出了一个错误。

在下一个示例中,让我们处理上面的宏。 每当系统遇到错误时,它将直接跳转到“jumpnext: 语句”并显示错误消息。

示例 2:使用 Go To Line 处理错误


VBA Error Handling

输出

按 F5 键运行代码并获取输出。 因此,它将自定义消息。

VBA Error Handling

2. 转到 0

此错误处理方法禁用当前过程中已启用的错误处理程序,将其重置为 Nothing,并显示一个定义错误的 MsgBox。

示例 1:用字符串除法并使用 Go to 0 显示错误


VBA Error Handling

输出

按 F5 键运行代码并获取输出。 因此,它将返回一个窗口,显示类型不匹配错误。

VBA Error Handling

3. 转到 -1

这种错误处理方法禁用了当前过程中现有的异常,清除错误并将其重置为 nil,从而使最终用户能够进行另一次错误捕获。

示例 1:使用 Go To -1 错误处理方法显示错误


VBA Error Handling

输出

按 F5 键运行代码并获取输出。 因此,它将返回一个窗口,显示类型不匹配错误。

VBA Error Handling

4. 恢复下一个

此错误处理方法指定,每当遇到运行时错误时,恢复下一个将忽略该错误,控制流将转到紧跟错误发生的语句之后的语句,并且执行将从该点继续。

示例 1:在不使用恢复下一个的情况下遇到逻辑错误(除以 0)。


VBA Error Handling

输出

按 F5 键运行代码并获取输出。 因此,它将返回一个窗口,显示类型不匹配错误。

VBA Error Handling

使用 恢复下一个,我们可以跳过错误行,因为 VBA 过程以 Sub 开头并以 End Sub 结尾,Excel 将运行它们之间的语句。 让我们在下一个示例中看看如果我们使用 Resume Next 语句运行上面的程序会发生什么情况。

示例 2:使用恢复下一个遇到逻辑错误(除以 0)。


VBA Error Handling

输出

按 F5 键运行代码并获取输出。 因此,它将跳过错误行并移动到下一行代码。 因此,它返回 0。

VBA Error Handling
下一主题VBA Instr 函数