VBA:显示标准运行时错误处理程序

时间:2010-12-29 22:09:44

标签: excel vba

我对在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

4 个答案:

答案 0 :(得分:3)

您可以通过将其放入“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.

答案 1 :(得分:0)

使用

替换错误继续下一步
On Error Goto SomePlaceInCodeToHandleErrors

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

查看此Stack Overflow thread以获取更多信息和示例代码。

答案 2 :(得分:0)

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

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

正如DaMartyr建议的那样,你仍然可以使用像msgbox err.description这样的东西。

答案 3 :(得分:0)

因此,为了跟进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