Rubberduck VBA:什么会导致解析器错误?

Rubberduck VBA: What can cause a Resolver Error?

感谢这个问题:, I know that I may have to hit the "Refresh button" to use RubberduckVBA

可以遵循的错误之一显然是 "Resolver Error"。

在哪些不同情况下可能会发生此类解析器错误?

TL;DR:Rubberduck 的新 "official" 版本已过期!

Disclaimer: I manage & contribute to the Rubberduck OSS project.

遍历解析树时抛出异常。很难说到底发生了什么,因为解析+解析VBA代码是一个very complex, multiple-steps process.

要具体找出问题所在,您需要查看日志 - 默认情况下禁用日志记录(相当冗长),您需要通过 设置 启用它对话框:

最低日志级别 设置为 Trace 以获取 parser/resolver 正在做的所有事情的完整详细信息,或者 Error 较不详细的日志,仅包含异常信息;然后,您可以 post 将此日志(或其中的一部分)放入 new issue 中,项目开发人员将相应地 tag/label 它,检查 log/exception 详细信息,并确定是否该问题已在稍后的预发布版本中修复,或者如果它是一个需要修复的新错误。

由于几乎每个功能都需要准确理解 VBE 中的代码,Rubberduck 开发人员非常重视 parser/resolver 问题。

如果您使用的是最新的 "green" 版本 (v2.2.0),我很确定此问题已得到解决。最新的 "pre-release" 版本在 自动完成 功能方面存在恼人的问题(肯定会被 v2.3.0 修复),但解析器现在运行良好:)

至少有以下一种情况:

A Function 或 Sub 不编译,开发人员在 运行 VBA 项目时不知道这一点,因为 Sub 从未被调用。

解法:

此 "junk" 代码可以在 Rubberduck 的 中找到。

以我为例:

Sub CleanSheetOut()
Worksheets(sheetOut).Range("A1:XFD10485576").Clear
Worksheets(sheetOut).Range("A1:XFD10485576").Interior
        .Pattern = xlNone
       .TintAndShade = 0
     .PatternTintAndShade = 0
End Sub

...不正确(未编译)但从未被调用,因此该项目 运行 很好但 Rubberduck 无法解析。

正确代码:

Sub CleanSheetOut()
   Worksheets(sheetOut).Range("A1:XFD10485576").Clear
   With Worksheets(sheetOut).Range("A1:XFD10485576").Interior
      .Pattern = xlNone
      .TintAndShade = 0
      .PatternTintAndShade = 0
   End With
End Sub

...编译并让 Rubberduck 正常解析和解析。

日志: ... 显示了错误的 Sub 以及我可以在哪个模块中找到它。

Rubberduck 开发团队的见解:

Whether the VBE compiles on the fly depends on the compile settings in the bottom right of the Editor tab of the Tools->Options menu.

We actually try to compile the project and warn the user that the project does not compile. However, the forementioned VBE settings can interfere with that. Moreover, compilation before refresh might be deactivated in Rubberduck's own settings.

查看此Github thread了解更多详情。