'on error goto 0'和'on error goto -1'之间的区别 - VBA

ste*_*ton 40 excel msdn vba

任何人都可以在VBA中找到'On error goto -1'和'on error goto 0'之间的区别?我试过谷歌和msdn,但我没有运气.

Fra*_*ean 57

On Error GoTo 0 禁用过程中当前存在的任何错误捕获.

On Error GoTo -1 清除错误处理并将其设置为空,允许您创建另一个错误陷阱.

示例:On Error GoTo -1

在引发第一个错误之后,它将GoTo ErrorFound清除例程的错误处理并设置一个新GoTo AnotherErrorFound错误,这将在发现错误时发生.

Sub OnErrorGotoMinusOneTest()

    On Error GoTo ErrorFound

    Err.Raise Number:=9999, Description:="Forced Error"

    Exit Sub

ErrorFound:

    On Error GoTo -1 'Clear the current error handling
    On Error GoTo AnotherErrorFound 'Set a new one
    Err.Raise Number:=10000, Description:="Another Forced Error"

AnotherErrorFound:

    'Code here

End Sub
Run Code Online (Sandbox Code Playgroud)

示例:On Error GoTo 0

引发第一个错误后,您将收到错误,因为已禁用错误处理.

Sub OnErrorGotoZeroTest()

    On Error GoTo 0

    Err.Raise Number:=9999, Description:="Forced Error"

End Sub
Run Code Online (Sandbox Code Playgroud)

  • +1,很好的解释.有趣的是,只有"On Error Goto -1"才允许在错误捕获中进一步捕获错误.事实上,即使是"On Error Resume Next"仍然会导致未捕获的错误,从而停止操作. (4认同)
  • 有趣,谢谢您的解释。On Error Goto -1和On Err.Clear之间有什么区别吗? (2认同)
  • @DanielCook实际上根据:http://www.cpearson.com/excel/errorhandling.htm#Resume,您可以使用“Resume”、“Resume Next”或“Resume <label>”来退出错误处理块。另外,正如您在此处所述,您可以使用“On error goto -1” (2认同)
  • 呃。VBA 将允许您将编号的行/标签定义为“&hFFFFFFFF”,VBE 将其解析/自动更正为“-1”。在这种情况下,“On Error Goto -1”实际上会转到编号为“-1”的行 (2认同)

D_B*_*ter 14

这个答案解决了错误对象和错误处理程序之间的混淆.

错误对象可以使用被清除Err.Clear.这不会影响错误处理程序.

错误处理程序成为使用启用On Error Goto <label>.它在发生错误时变为活动状态.

错误处理程序处于活动状态时,您无法分配新的错误处理程序.On Error Goto <label>没有效果.VBA只是忽略了分配新错误处理程序的尝试.

使用Err.Clear不会取消错误处理程序.

使用代码跳转到代码中的其他位置Goto <label>不会取消错误处理程序.使用Goto <label>在错误处理块会引起混淆,应加以避免.您可能认为错误处理程序不再处于活动状态,实际上它仍处于活动状态.

活动错误处理程序的作用是您无法分配新的错误处理程序.On Error Goto <label>没有效果.VBA只是忽略了分配新错误处理程序的尝试.错误处理程序处于活动状态时,任何其他错误都将无法处理.

退出活动错误处理程序的唯一方法是:

  1. Resume
  2. Resume Next
  3. Resume <label>
  4. On error goto -1
  5. 退出程序

使用这些方法中的任何一种来退出错误处理程序也将清除错误对象.

优秀来源:VBA芯片中的Pearson错误处理 Pearson On error goto -1在他的文章中没有提及.引用他:

我故意不包括On Error GoTo -1,因为它没有任何实际意义,并且可以锁定整个Excel应用程序,除非以完全正确的方式使用.是的,On Error GoTo -1在语法上是有效的,但它就像给醉酒的少年枪.它没有任何好处.

您还可以使用错误对象在不使用错误处理程序的情况下处理内联错误:MSDN内联错误处理

  • @HarveyFrench`Err.Clear`和`On Error GoTo -1`之间的区别在于第一个不退出(重置)错误处理程序,但第二个错误处理程序.只有在退出(重置)错误处理程序后,才能启用另一个错误处理程序. (2认同)