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结束

'——————