【问题标题】:How to tell if a statement in vba can have a line number如何判断vba中的语句是否可以有行号
【发布时间】:2019-06-13 19:21:20
【问题描述】:

在古代,所有基本语句都被允许有甚至被要求有行号。我今天正在编写一些代码来在所有语句上创建行号。目的是使用错误处理程序中的 erl 函数来帮助调试错误。这是一个示例:

       Public Sub AddErrorEventHandlerToForm()
1040        Const sProcedure As String = "AddErrorEventHandlerToForm"
1060        Dim obj As AccessObject, dbs As Object
1080        Dim i As Integer
1100        Dim modOpenModules As Modules

这是修改某些 ms-access 代码的结果。头脑简单的代码为所有语句编号。我不得不从所有声明部分语句中删除数字,因为编译器在编号时将它们标记为错误。 它还在编号时标记过程的第一条语句。 1040 语句没有标记,不会生成错误,也不会将常量 sProcedure 添加到程序的符号表中。所以后面在使用sProcedure的时候会在代码中产生错误。

在搜索 Microsoft Developers Network for Office vba 时,我未能找到有关此主题的文档。我发现的关于行号的最好的是在词汇表中。

似乎需要大量的反复试验。我希望有人完成了这项工作并愿意分享。

【问题讨论】:

  • 进一步检查表明还有其他因素在起作用。我用原始的副本替换了更改的代码。它编译正常。我在相关行中添加了语句编号,它仍然可以编译。我会继续调查。
  • Erl 已损坏且未记录。仅当您有庞大的程序做太多事情并且有太多失败的原因时,才“需要”行编号。你自己说的,“在古代”是一回事。我们在 2019 年,不要像 1985 年那样编写代码。如果 VBA 是您的生计,并且您确实需要行号来记录日志,那么您需要 vbWatchDog - 那么您将得到实际 文件行号(而不是任意编号的标签)、对调用堆栈的编程访问以及 try/catch 错误处理。

标签: vba


【解决方案1】:

声明不是可执行的语句(你不能中断它们),所以给它们编号是没有意义的。

Public WhateverPrivate WhateverFriend WhateverDim WhateverConst Whatever 语句,包括 SubFunctionProperty 声明,以及不在过程范围内的任何内容.

任何编译的声明语句都不会抛出运行时错误。请注意,End Sub/Function/Property 在技术上也是一个可执行语句 - 但对它们进行编号毫无意义。

但是请注意,you don't want line numbers.

下面是一种行号可能令人讨厌的几种方式:

Public Sub TestMe()
10 DoSomething: DoSomething
End Sub

Private Sub DoSomething()
10 Debug.Print "did something"
End Sub

您是否期望TestMe 输出did something 两次? Woopsie,第一个过程调用是一个行标签! ...是的,你可以在同一行代码中同时拥有行号行标签。

也就是说我无法重现 Const 声明导致错误的问题,在这里可以正常工作:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多