如何捕获导致VBA错误的变量名称或对象名称?
实施例
Sub test()
On Error GoTo Handler
i = 0
n = 1/i
Handler:
Select Case variablename
Case "n"
'do something................
答案 0 :(得分:1)
错误不是由变量引起的。该错误是由尝试将1除以0的代码行引起的。分配实际上不会发生。
我在积极开发时发现诊断问题的最佳方法是在错误处理程序中使用Stop
然后Resume
。
Public Sub func()
On Error GoTo ErrHandler
'... some code here ...
Exit Sub
ErrHandler:
Stop
Resume
End Sub
这种方法的工作方式是,当Stop
上出现错误时,VBA将中断(暂停执行,显示指令指针箭头和黄色突出显示)。您可以单步执行Resume
,然后再一次找出导致错误的特定代码行。
一旦你开始了解你遇到的错误,你就可以构建单独的If ...然后让他们适当地处理每个错误。当您准备将代码发布到生产环境中时(例如,对于其他用户),您需要将意外的错误处理程序替换为Stop / Resume,该处理程序将其记录或显示给用户。
答案 1 :(得分:1)
虽然Blackhawk的答案适用于一个小例子,但我个人更愿意避免修改代码来追踪这样的错误。如果我正在处理大量试图追踪令人讨厌的错误的文件,那么我完全有可能忘记删除任何"特殊代码"在我完成调试之后,比如Stop
语句等。如果任何这样的代码生产,那对我来说可能会非常尴尬。另外,为了弄清楚错误发生在哪里(在你的例子中并不总是那么明显!),将这段代码添加到许多不同的地方可能会很烦人。(/ p >
由于这些原因,我更喜欢使用VBA编辑器提供的功能。所以:
现在运行您的代码,当它到达此行时您会注意到:
n = 1/i
您将收到一个错误对话框,说明问题所在("运行时错误' 11&#39 ;:按零划分" )和您可以选择单击对话框中的" Debug" 按钮,这将打破上面一行的执行,并以黄色突出显示。
完成调试并找到一直困扰您的错误后,您可以返回VBA编辑器选项并恢复错误陷阱"设置回默认选项("中断未处理的错误")。
这样,在发布代码之前,您还没有对要记住恢复的代码进行任何更改,只需点击几下就可以设置/取消设置此行为的实际操作。