我正在用 Visual Basic for Applications (6.5) 编写一个小程序(宏),我正在使用集成到 Excel 2007 中的标准编辑器。
我的问题是我收到没有任何行号信息的错误消息。我不是指我的错误处理或用户定义的消息。
例子:
错误消息说我有一个运行时错误“1004”。我无法单击“调试”按钮,只有“结束”和“帮助”可用。因此,我看不到错误发生在哪一行。这非常令人沮丧。
我该如何解决这个问题?
我正在用 Visual Basic for Applications (6.5) 编写一个小程序(宏),我正在使用集成到 Excel 2007 中的标准编辑器。
我的问题是我收到没有任何行号信息的错误消息。我不是指我的错误处理或用户定义的消息。
例子:
错误消息说我有一个运行时错误“1004”。我无法单击“调试”按钮,只有“结束”和“帮助”可用。因此,我看不到错误发生在哪一行。这非常令人沮丧。
我该如何解决这个问题?
无法进入调试模式的一个原因是 VBA 受保护 - VBA 项目属性 - 锁定项目以供查看。
VBA 宏中的此错误通常表明滥用了 excel VBA 函数。您将不会获得调试信息,因为它会从调试器无法访问的内部办公室代码中抛出。
隔离失败行的最佳方法是在失败的宏顶部放置一个断点,并逐行跟踪它。您还可以在堆栈跟踪中找到您的代码行(尽管我不记得在 VBA 中有多少可用的代码)。
如果您知道某些代码部分发生故障,您可以将其添加到您的问题中,让我们看看。
您需要手动添加行号并捕获错误。在陷阱中,使用 Erl 获取行号。我现在没有 Excel 来检查我的语法,但您的代码应该如下所示:
public sub Test()
on error goto TestError
10 Dim i as Integer
20 Dim j as Integer
30 i = 1
40 j = 0
50 debug.Print i/j
TestExit:
exit sub
TestError:
debug.Print Err.Number, Err.Description, Erl
goto TestExit
end sub
您可以在 MZTools 中创建错误处理程序“模板”,并非常快速地将它们应用于项目中的每个子/功能。这样的模板会在遇到错误时给您一个消息框,告诉您错误所在的模块/子,并且停止将导致代码中断,因此您可以按 F8 并继续执行该代码行之后的代码行触发了错误。
On Error GoTo {PROCEDURE_NAME}_ErrorHandler
{PROCEDURE_BODY}
NormalExit:
Exit {PROCEDURE_TYPE}
{PROCEDURE_NAME}_ErrorHandler:
MsgBox "Error " & Err.Number & " (" _
& Err.Description & ") in {PROJECT_NAME}:{MODULE_NAME}:{PROCEDURE_NAME}"
Stop
Resume Next
有时这种错误发生在受密码保护的代码部分中——尤其是在加载项中——因为 VBA 无法将其调试光标移动到那里。这就是为什么它不给你行号。
我发现了几个没有行号的巧妙解决方案。实现时被称为天赐之物的那个触发了我的实现,我在直奔错误线中描述了它