首页 > 解决方案 > 从 VBA 脚本中提取变量名

问题描述

我想获取脚本中使用的变量列表,即VariableName13, strDLink, strZone.
单个文件包含大约 150 多个事件,每个项目包含大约 700-900 个文件。

在 VBA 环境中,我想解析每个文件,遍历每个事件并提取事件声明或引用的变量名称。

我确实找到了一些类似RoslynTypeLib但无法理解如何使用它们的材料?

有人可以分享提取变量的正确方法吗?

Environment: VBA 6, SCADA HMI

Private Sub Rect13_Click()
Dim lResult As Long
Dim strDLink As String
Dim strZone As String
On Error GoTo ErrorHandler
lResult = OpenFuncUpdate
If lResult = SomeValue Then
    'DoThis
ElseIf lResult = SomeOtherValue Then
    strDLink = "FullPathLink"
    FuncDisassemblePath strDLink, , , , , , , , , , , , strZone
    If Len(strZone) > 0 And (InStr(VariableName13.CurrentValue, "%") = 0) Then
        SubLoadIA strZone & "%" & VariableName13.CurrentValue, Me
    Else
        SubLoadIA VariableName13.CurrentValue, Me
    End If
End If
Exit Sub
ErrorHandler:
    SubHandleError
End Sub

标签: vba

解决方案


根据您定义“变量”的方式,您可以尝试使用 VBA 代码和正则表达式解析 VBA 代码。

如果您的所有声明都是一致的,并且一致地声明一个变量,并且变量是一致地声明的(Option Explicit在每个模块中),那么捕获Dim|Private|Public|Friend|Global {identifier}应该足够好......但这会产生很多“ifs”

现实生活中的项目有Dim可以声明局部或私有变量列表的语句。或者在ReDim某处有一个声明实际上是在现场声明一个数组。或者他们并不总是指定Option Explicit变量,甚至根本不总是声明变量。或者在语句中间有一行继续破坏了正则表达式。或者,或者,或者......很多事情都可能出错,解析VBA代码是一个兔子洞。

例如,假设您需要选择并列出未声明的变量。正则表达式无法从过程或函数调用中分辨出它的用法,因为它们在语法上是相同的。正则表达式缺少语法的上下文——通过对源代码进行标记(也称为“词法分析”),然后使用解析器规则解析标记,我们可以 100% 确定我们正在查看的内容。

幸运的是,这是一个已解决的问题,并且有免费的开源 VBIDE 工具可用于此,并且每次都能为您提供 100% 正确的结果,而无需编写任何代码或担心哪些法律声明可能无法解释。

Rubberduck(我管理这个 OSS 项目并拥有它的网站)将正确解析任何合法的 VB6/vBA 代码(如果没有,我们对重现非常感兴趣!),然后您只需单击“复制”按钮可立即在剪贴板中包含每个声明:

Rubberduck 的代码浏览器

Ctrl+V /粘贴到工作表(或Word文档,或记事本中!),然后您可以轻松地将其变成启用过滤器的表格;在您的情况下,您希望为“变量”过滤 [声明类型]:

Ruberduck 用户声明导出

上面,一个 VBA 项目的导出声明具有一个Sheet1模块,该模块具有一个test使用(但不声明)名为的变量的过程undeclared

Sub test()
    undeclared = 42
    Debug.Print undeclared
End Sub

这是您提供的代码的同一张表:

在此处输入图像描述

请注意,SubHandleErrorand 其他SubandFunction调用将解析为并解析为项目中的过程/函数。在这里,它们被作为未声明的变量拾取,因为除了您提供的代码之外我没有解析任何东西,所以这些标识符是未定义的。


推荐阅读