VBA:如何显示一个错误消息就像标准的错误信息有一个“debugging”button?
和往常一样,我使用On Error Goto
语句创build一个error handling程序,在那里我放了几行清理代码并显示错误消息,但现在我不想失去默认处理程序的舒适性,这也指向我发生错误的确切位置。 我怎样才能做到这一点?
提前致谢。
首先是好消息。 这个代码做你想做的(请注意“行号”)
Sub a() 10: On Error GoTo ErrorHandler 20: DivisionByZero = 1 / 0 30: Exit Sub ErrorHandler: 41: If Err.Number <> 0 Then 42: Msg = "Error # " & Str(Err.Number) & " was generated by " _ & Err.Source & Chr(13) & "Error Line: " & Erl & Chr(13) & Err.Description 43: MsgBox Msg, , "Error", Err.HelpFile, Err.HelpContext 44: End If 50: Resume Next 60: End Sub
运行时,将显示预期的MsgBox:
而现在的坏消息是:
行号是旧版Basic的残留。 编程环境通常负责插入和更新它们。 在VBA和其他“现代”版本中,此function会丢失。
但是, 在这里有几个“自动”添加行号的替代scheme,节省了input它们的繁琐任务……但是所有这些都似乎或多或less是麻烦的或者是商业的。
HTH!
有一种更简单的方法,只要在error handling程序中禁用错误处理程序,如果它不匹配您正在执行和恢复的错误types。
下面的处理程序再次检查每个错误types,如果没有匹配,它将错误恢复到正常的VBA,即转到0并恢复代码,然后尝试重新运行代码,并popup正常的错误块。
On Error GoTo ErrorHandler x = 1/0 ErrorHandler: if Err.Number = 13 then ' 13 is Type mismatch (only used as an example) 'error handling code for this end if If err.Number = 1004 then ' 1004 is Too Large (only used as an example) 'error handling code for this end if On Error GoTo 0 Resume
这个答案没有解决debuggingbutton(你必须devise一个表单,并使用其中的button来执行下一个问题中的方法)。 但它确实解决了这个问题:
现在我不想失去默认处理程序的舒适性,这也指向错误发生的确切位置。
首先,我假设你不想在生产代码中使用它 – 无论是为了debugging,还是为了你自己将要使用的代码。 我使用编译器标志来指示debugging; 那么如果我正在解决程序故障,我可以很容易地find导致问题的线路。
# Const IsDebug = True Sub ProcA() On Error Goto ErrorHandler ' Main code of proc ExitHere: On Error Resume Next ' Close objects and stuff here Exit Sub ErrorHandler: MsgBox Err.Number & ": " & Err.Description, , ThisWorkbook.Name & ": ProcA" #If IsDebug Then Stop ' Used for troubleshooting - Then press F8 to step thru code Resume ' Resume will take you to the line that errored out #Else Resume ExitHere ' Exit procedure during normal running #End If End Sub
注意: Resume
的例外情况是,如果错误发生在没有error handling例程的子过程中,则Resume
将带您到此过程中调用带有错误的子过程的行。 但是你仍然可以进入并通过子程序,使用F8,直到它再次出错。 如果子程序的时间太长,甚至无聊,那么你的子程序可能应该有自己的error handling程序。
有多种方法可以做到这一点。 有时对于我知道的小程序来说,在排除故障时,我会直接通过它,我只是把这些行放在MsgBox语句之后:
Resume ExitHere ' Normally exits during production Resume ' Never will get here Exit Sub
它将永远不会进入Resume语句,除非您正在逐步完成并将其设置为要执行的下一行,可以通过将下一个语句指针拖动到该行来完成,也可以通过按Ctrl F9并在该行的光标处按下。
这里有一篇关于这些概念的文章: 在VBA中处理错误的五个技巧 。 最后,如果您使用的是VBA,但尚未发现Chip Pearson的真棒站点,他有一个页面来解释VBA中的error handling 。
对于我,我只是想看到我的VBA应用程序中的错误,所以在我创build了下面的代码的function..
Function Database_FileRpt'————————- On Error GoTo CleanFail'—————– ——–''Create_DailyReport_Action和代码
CleanFail:
“*********
MsgBox“********************”_
&vbCrLf&“Err.Number:”&Err.Number _
&vbCrLf&“Err.Description:”&Err.Description _
&vbCrLf&“Err.Source:”&Err.Source _
&vbCrLf&“********************”_
&vbCrLf&“…退出VBAfunction:Database_FileRpt”_
&vbCrLf&“… Excel VBA程序重置”。 _
,“VBA错误exception提出!”
'请注意,下一行会将错误对象重置为0,上面的variables用于记住值,以便可以重新提出相同的错误
Err.Clear
'*************************************
恢复CleanExit
CleanExit:
清理代码,如果有的话,去这里。 无论错误状态如何运行。
退出function'SUB或function
结束函数“的Database_FileRpt结束
'——————