例2. On Error Resume Next图1 On Error Resume Next与 On Error GoTo line 发生错误时跳转到 line 标记的代码块不同,On Error Resume Next 则是在发生错误时结束当前语句,跳转到发生错误的语句后面的语句。本例中,Debug.Print 发生错误时,跳转到跟在后面的 If ... End If 语句块。在 If ... End If 语句块中,判断条件是 Err.Number <> 0。我们在上一篇文章中说过,发生错误时,Err 对象的 Number 属性包含当前错误的错误号。Err.Number 为 0 时,表示没有错误,任何非零值都表示发生了错误。例3. On Error GoTo 0On Error GoTo 0 的作用是清除当前错误并禁止当前过程中的错误捕获设置,不论是 On Error GoTo line 设置的跳转至错误处理代码块,还是 On Error Resume Next 设置的跳转至下一条语句。执行 On Error GoTo 0 之后,相当于当前过程没有了对错误的处置。图2 On Error GoTo 0在这个例子中,先是由 On Error GoTo ErrorHandler 设置了错误处置方式,然后在对表达式 a + 3.5 的求值中发生错误,转到 ErrorHandler 错误处理代码块。在这个代码块中,判断当前错误是否类型错误,若是,则修改变量 a 的值,否则打印出错误号及错误信息。然后执行 Resume 语句,控制返回到发生错误的语句继续执行。此时,因为 a 的值已经修改为数值字符串,因此 a + 3.5 是有意义的,打印出该表达式的值:4.7。接下来,执行 On Error GoTo 0,清除当前错误并禁止前面设置的错误处置方式。然后试图打印 3 / 0 表达式的值,因为该表达式无意义,因此引发错误。又因为此时已没有错误处置方式,VBA 显示错误信息对话框,等待用户手工介入。我们可以在 On Error GoTo 0 之后再设置其他的错误处置方式,如下图:图3 重置错误处置方式在这段代码中,我们在 On Error GoTo 0 关闭错误处置之后,使用 On Error Resume Next 重置错误处置方式:将错误捕获延后(defer)到下一条语句,即紧跟其后的 If ... End If 语句。在这个 If ... End If 结构中,我们判断当前是否发生了错误,如果是,则打印出错误信息,否则,跳过 If ... End If,什么也不做。最后,执行 Exit Sub 退出当前过程。我们也可以把 On Error GoTo 0 看作为返回到 VBA 的默认错误处置方式。例4. On Error GoTo -1图4 On Error GoTo -1对于如图4 所示的情况,即在错误处理程序(ErrorHandler1)中重置错误处理程序(ErrorHandler2),则必须使用 On Error GoTo -1。此时,On Error GoTo 0 是无效的,也就是说,如果这里不是 -1 而是 0,则下面的 On Error GoTo ErrorHandler2 不起作用,仍然是 VBA 的默认错误处置方式,即显示错误信息对话框,并等待用户介入。如图5 所示:图5 无效的错误重置从这个例子可以看出,如果在错误处理代码块中再想重新设置错误处置,则必须使用 On Error Goto -1 来清除 VBA 的当前错误处置方式,只有在这时才能够重新设置 VBA 的错误处置方式。图4 和图3 的不同在于,图3 的重置是在错误处理代码块之外(outside the error handler)的重置,而图4 则是在错误处理代码块之内(inside the error handler)的重置。这就是 On Error GoTo 0 和 On Error GoTo -1 的本质区别。相关阅读Excel VBA 编程基础 -- 错误处理(一)
基本文件流程错误SQL调试
请求信息 : 2026-05-07 17:49:16 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/582819.html