VBA错误处理程序在第二个错误时退出内部函数

时间:2014-07-09 01:32:21

标签: vba error-handling

我有一段简单的代码,如果失败则应重试(等待一小段时间后)。 这是基本设置:
主要调用,调用 Foo 。 Foo和Bar都有一个简单的On Error处理程序,它显示了一个消息框。在Foo中,错误处理程序还有一个GoTo到函数的开头。这是代码:

Sub main()
Bar
End Sub
Function Bar()
    On Error GoTo ErrHandBar
    Foo
ErrHandBar:
    MsgBox ("ErrhandBar")
End Function
Function Foo()
    On Error GoTo ErrhandFoo
Retry:
    x = y / 0
ErrhandFoo:
    MsgBox ("ErrhandFoo")
    Application.Wait (Now + TimeValue("0:00:5"))
    GoTo Retry
End Function

如果我一步一步地运行Main,它会告诉我ErrHandFoo只被调用一次。在第二个错误上它调用ErrHandFoo 我不是在寻找其他编程技巧,我只想了解为什么会发生这种情况! 一些细节:
Excel 2010上的VBA 7.0.1619(14.0.6106.5005 32位)

1 个答案:

答案 0 :(得分:2)

此行为的可能原因是您没有从第一个错误“恢复”。您不能在错误处理程序中抛出错误,因为在第一个错误发生后,您实际上处于foo的错误处理程序中。

您应该将GoTo替换为Resume,如下所示,以便VBA不再认为您在错误处理程序中:

...
ErrhandFoo:
    MsgBox ("ErrhandFoo")
    Application.Wait (Now + TimeValue("0:00:5"))
    Resume Retry ' NOT GoTo
End Function