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

4

我有一个关于在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个回答

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运行时的真正错误处理机制。但要注意:如果此错误未在调用链中更高处的活动错误处理程序中捕获,则在用户单击“确定”按钮后,它将终止您的程序

请注意,在该错误处理程序中使用“Error(SaveError)”语句重新生成运行时错误会导致失去获取错误发生位置的实际行号的能力,因为您正在重新生成运行时错误。但这可能并不重要,因为大多数VB代码实际上并不使用任何行号,所以Erl始终返回0。


谢谢您的建议。如果无法使用标准运行时错误处理程序,这就是计划B。 - strcompnice
编辑了答案,并添加了另一个(危险的)选项来真正地调用错误处理机制。 - JeffK

0

将 On Error Resume Next 替换为

On Error Goto SomePlaceInCodeToHandleErrors

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

查看这个Stack Overflow线程获取更多信息和示例代码。


感谢您提供的链接和有用的代码。当使用SomePlaceInCodeToHandleErrors时,如果Err.Number与XXXX不同,则会忽略该错误。 - strcompnice

0

所以为了跟进JeffK的新建议,下面的代码似乎在VBA中运行良好,而且我看不出使用它会有什么危险。终止Excel非常关键,因为那可能会丢失很多工作,但由于代码始终检查错误是否存在,所以怎么会发生呢?

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

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

我认为这只会终止您的VBA例程的执行,而Excel将继续运行。当我在我的原始答案中说“危险”时,我的想法是一个独立的VB6项目,忘记了我正在回答一个VBA问题。 - JeffK

0
在您的VBA选项中,选择“中断未处理的错误”。要启用处理,请使用on error goto SomeLabelon error resume next。要停止错误处理,请使用on error goto 0
在这种情况下,您的问题是矛盾的。如果启用错误处理,那么您将禁用标准错误处理。如DaMartyr所建议的,您仍然可以使用msgbox err.description之类的东西。

谢谢您的澄清。那么唯一的可能性就是将 On Error 改回 GoTo 0,然后再次引发错误,从而总共引发两次错误,这并不是很理想的做法。 - strcompnice
你可以这么看,但我不确定这是否是一个好主意,并且我没有尝试在处理错误期间更改错误处理方法。通常,你知道需要错误处理的代码部分,在这些部分之外,选择使用“On error Goto 0”来使用Excel的错误处理方式是由你决定的。 - iDevlop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接