我有一段简单的代码,如果失败则应重试(等待一小段时间后)。
这是基本设置:
主要调用条,调用 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位)
答案 0 :(得分:2)
此行为的可能原因是您没有从第一个错误“恢复”。您不能在错误处理程序中抛出错误,因为在第一个错误发生后,您实际上处于foo
的错误处理程序中。
您应该将GoTo
替换为Resume
,如下所示,以便VBA不再认为您在错误处理程序中:
...
ErrhandFoo:
MsgBox ("ErrhandFoo")
Application.Wait (Now + TimeValue("0:00:5"))
Resume Retry ' NOT GoTo
End Function