【问题标题】:VBA: Displaying the standard run-time error handlerVBA:显示标准运行时错误处理程序
【发布时间】:2010-12-29 22:09:43
【问题描述】:

我有一个关于在 Excel 中处理 VBA 错误的正确方法的问题。如果发生特定错误,例如 xxxxxxx,则应显示 MsgBox。如果发生另一个错误,则应弹出标准运行时错误处理程序。如何实现?下面是示例代码:

On Error Resume Next

'Line of code that causes an error here.

If Err.Number = xxxxxxx Then

    MsgBox "Specific error message."

ElseIf Err.Number = 0 Then

    Do nothing

Else 'Some error other than xxxxxxx.

    'This is the problem. Here I would like to display standard run-time error
    'handler without causing the error again.

End If

On Error GoTo 0

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    通过将其放入“Else”块中,您可以获得一个看起来非常像标准错误消息的消息框:

    MsgBox "Run-time error '" & Err.Number & "':" & _
        vbNewLine & vbNewLine & _
        Error(Err.Number), vbExclamation + vbOKOnly, _
        "YourProjectNameHere"
    

    但这只是一个传真。这不是 VB6 提出的实际错误消息对话框;它只是格式化为看起来像它。此时,“On Error Resume Next”语句仍然禁用错误处理。

    但如果你真的,真的想要调用标准错误处理代码,你可以把它放在“Else”块中:

    Dim SaveError As Long
    SaveError = Err.Number
    On Error Goto 0
    Error (SaveError)
    

    此代码保存错误编号,重新启用错误处理,然后重新引发错误。您可以通过这种方式调用 VB 运行时真正的错误处理机制。但请注意:如果调用链中较高位置的活动错误处理程序未捕获此错误,则在用户单击“确定”按钮后,它将终止您的程序

    请注意,您还将无法在错误处理程序中使用“Erl”获取发生错误的实际行号,因为您正在使用“Error (SaveError)”语句重新生成运行时错误。但这可能无关紧要,因为大多数 VB 代码实际上并不使用任何行号,所以 Erl 无论如何都只返回 0。

    【讨论】:

    • 感谢您的建议。如果无法获得标准的运行时错误处理程序,这是 B 计划。
    • 用另一个(危险的)选项编辑了答案,以真正调用错误处理机制。
    【解决方案2】:

    将 On Error Resume Next 替换为

    On Error Goto SomePlaceInCodeToHandleErrors
    
    SomePlaceInCodeToHandleErrors:
    If Err.Number = XXXX Then
    MSGBOX "Message"
    End If
    

    查看Stack Overflow thread 了解更多信息和示例代码。

    【讨论】:

    • 感谢您提供的链接和有用的代码。但是,当 Err.Number 与 XXXX 不同时使用 SomePlaceInCodeToHandleErrors 时,错误将被忽略。
    【解决方案3】:

    在您的 VBA 选项中,选择“中断未处理的错误”。
    要启用处理,请使用 on error goto SomeLabelon error resume next
    要停止错误处理,请使用on error goto 0

    在这种情况下,您的问题是矛盾的。如果您启用错误处理,那么您将禁用标准错误处理。

    正如 DaMartyr 建议的那样,您仍然可以使用 msgbox err.description 之类的东西。

    【讨论】:

    • 感谢您的澄清。那么唯一的可能就是将 On Error 改回 GoTo 0 并再次导致错误,从而总共导致错误两次,这不是那么理想吗?
    • 你可以这样看,但我不确定这是一个好主意,并且我没有尝试在处理错误的过程中更改错误处理方法。通常你知道代码中需要错误处理的部分,在这些部分之外,你可以选择使用“On error Goto 0”来使用 Excel 的错误处理。
    【解决方案4】:

    因此,为了跟进 JeffK 的新建议,下面的代码似乎可以在 VBA 中正常工作,而且我看不到使用它的危险。终止 Excel 至关重要,因为这可能会丢失大量工作,但由于代码始终检查错误是否存在,这怎么可能发生?

    感谢 JeffK 提出这个有趣的想法。

    Dim savedNumber As Long
    On Error Resume Next
    'Line of code that causes an error.
    If Err.Number = XXXXXXX Then
    'Specific error message.
    ElseIf Err.Number <> 0 Then
    savedNumber = Err.Number
    On Error GoTo 0
    Error savedNumber
    End If
    Err.Clear
    On Error GoTo 0

    【讨论】:

    • 我认为这只会终止您的 VBA 例程的执行,而 Excel 将继续运行。当我在原始答案中说“危险”时,我正在考虑一个独立的 VB6 项目,忘记了我正在回答一个 VBA 问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2017-02-16
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多