【问题标题】:Capture Variable/Object Name causing the error捕获导致错误的变量/对象名称
【发布时间】:2014-08-13 17:02:11
【问题描述】:
如何在 VBA 中捕获导致错误的变量名或对象名?
前
Sub test()
On Error GoTo Handler
i = 0
n = 1/i
Handler:
Select Case variablename
Case "n"
'do something................
【问题讨论】:
标签:
vba
excel
error-handling
【解决方案1】:
错误不是由变量引起的。该错误是由试图将 1 除以 0 的代码行引起的。分配实际上并没有发生。
我发现在积极开发时诊断问题的最佳方法是在错误处理程序中使用Stop,然后使用Resume。
Public Sub func()
On Error GoTo ErrHandler
'... some code here ...
Exit Sub
ErrHandler:
Stop
Resume
End Sub
它的工作方式是,当出现错误时,VBA 将在Stop 上中断(暂停执行,显示指令指针箭头和黄色突出显示)。您可以转至Resume,然后再次找出导致错误的特定代码行。
一旦您开始了解您遇到的错误,您就可以构建单独的 If ... Then 案例,让他们适当地处理每个案例。当您准备好将代码发布到生产环境中(即,为其他用户)时,您需要将 Stop/Resume 替换为意外错误处理程序,该处理程序将其记录或显示给用户。
【解决方案2】:
虽然 Blackhawk 的答案对于一个小例子来说效果很好,但我个人更喜欢避免修改代码来追踪这样的错误。如果我正在处理大量文件以试图追踪一个讨厌的错误,那么我完全有可能在完成调试后忘记删除任何“特殊代码”,如Stop 语句等。如果任何这样的代码能够投入生产,那对我来说可能会很尴尬。此外,必须将此代码添加到许多不同的地方以便首先找出错误发生的位置可能很烦人(它并不总是像您的示例中那样明显!)。
由于这些原因,我更喜欢使用 VBA 编辑器提供的工具。所以:
-
打开 VBA 编辑器。
- 转到工具>选项。
- 选择常规标签并点击Break on All Errors单选按钮。
- 点击确定。
现在运行你的代码,你会注意到当它到达这一行时:
n = 1/i
您将看到一个错误对话框,说明问题所在(“运行时错误 '11':除以零”),然后您可以选择单击 对话框上的“调试”按钮,这将中断上述行的执行并以黄色突出显示。
完成调试并找到一直困扰您的错误后,您可以返回 VBA 编辑器选项并将“错误捕获”设置恢复为默认选项(“中断未处理的错误” )。
这样,您无需对发布代码之前需要记住的代码进行任何更改,并且设置/取消设置此行为的实际操作只需单击几下。