【问题标题】:Error Messages Without Line Numbers没有行号的错误消息
【发布时间】:2012-04-25 07:47:31
【问题描述】:

我正在用 Visual Basic for Applications (6.5) 编写一个小程序(宏),我正在使用集成到 Excel 2007 中的标准编辑器。

我的问题是我收到没有任何行号信息的错误消息。 我不是指我的错误处理或用户定义的消息。

例子:

错误消息说我有一个运行时错误“1004”。 我无法单击“调试”按钮,只有“结束”和“帮助”可用。 因此,我看不到错误发生在哪一行。这很令人沮丧。

我该如何解决这个问题?

【问题讨论】:

  • 错误信息翻译为“应用程序或对象定义错误”

标签: excel vba error-handling


【解决方案1】:

VBA 宏中的此错误通常表示 Excel VBA 函数的滥用。您将不会获得调试信息,因为它会从调试器无法访问的内部办公室代码中抛出。

隔离失败的行的最佳方法是在失败的宏的顶部放置一个断点,并逐行跟踪它。您还可以在堆栈跟踪中找到您的代码行(尽管我不记得在 VBA 中有多少可用的代码)。

如果您知道某些代码部分发生故障,您可以将其添加到您的问题中,让我们看看。

【讨论】:

  • 谢谢你的回答..不幸的是代码非常大..程序的执行需要很长时间..另外我不能设置断点..好吧..我可以设置断点,但在执行时我收到消息,断点被忽略(或者我可以停止程序)....仍在编辑
  • .. 我的解决方法:我使用了很多 MsgBoxes 来本地化引发错误的块..但这不是一个很好的解决方案..
【解决方案2】:

您需要手动添加行号并捕获错误。在陷阱中,使用 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

【讨论】:

  • 感谢您的回答,但我不敢相信我必须手动引入行号。我希望从现代程序语言中得到有用的错误消息。
  • @user1328819 有一个来自 mztools 的免费插件,可以为您进行编号。我以前用过,推荐一下。
【解决方案3】:

无法进入调试模式的一个原因是 VBA 受保护 - VBA 项目属性 - 锁定项目以供查看。

【讨论】:

    【解决方案4】:

    您可以在 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
    

    【讨论】:

      【解决方案5】:

      有时这种错误会发生在受密码保护的代码部分中——尤其是在加载项中——因为 VBA 无法将其调试光标移动到那里。这就是为什么它没有给你行号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-11
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        相关资源
        最近更新 更多