为什么VBA在没有错误时会转到错误处理代码?

时间:2009-07-08 16:30:36

标签: vba error-handling

我在VBA(Excel)中编写了一些带有错误处理标签的代码。它工作正常,直到我最近注意到错误处理代码每次都被执行,而不仅仅是在发生错误时。有人知道为什么会这样吗?感谢。

这是一个简单的测试案例,其中会弹出两个 msgbox。

Sub example()
    On Error GoTo err_handle
    MsgBox "OK!"
err_handle:
MsgBox "not OK"
End Sub

5 个答案:

答案 0 :(得分:12)

您想在例程中添加一个Exit Sub:

Sub example()
    On Error GoTo err_handle
    MsgBox "OK!"
    Exit Sub
    err_handle:
    MsgBox "not OK"
End Sub

Look here进行全面解释。

答案 1 :(得分:1)

这是因为你没有在第一个消息框(OK)之后返回子程序。在显示之后,执行下一行代码,这是“不正常”的消息。

您可以在错误处理程序标签(ExitSub)之前提前退出子例程,或者在成功时转到子例程的结尾(绕过“错误”例程)

答案 2 :(得分:1)

需要添加exit sub否则程序继续执行标签,因为它是代码的一部分

答案 3 :(得分:0)

正如澄清一样,为其他答案添加一些肉。

“err_handle:”只是错误处理代码,因为您正在使用它。它本质上不是一个错误处理程序,就像其他语言中的catch块一样。

技术上“err_handle:”只是一个促进goto跳跃的标签。在你的情况下,goto恰好与错误处理程序一起使用(在错误转到)

答案 4 :(得分:0)

错误处理的普遍接受的模式是具有错误处理程序和退出过程。一个非常标准的代码树桩可能如下所示:

Public Function Example() As String
    Dim strRtnVal As String 'Return value variable.
    On Error GoTo Err_Hnd
    '***************************************************************************
    'Lock interface code here (hourglass, screenupdating etc.)
    '***************************************************************************

    '***************************************************************************
    'Your code here.
    '***************************************************************************
Exit_Proc:
    'Prevents "Error Loops" caused by errors within the exit procedure:
    On Error Resume Next
    '***************************************************************************
    'Restore Interface.
    '***************************************************************************
    Example = strRtnVal 'Set Return Value.
    Exit Function
Err_Hnd:
    'Display message, do some logging, whatever.
    Resume Exit_Proc '<- Run exit procedure.
End Function