vba - 从 VBA 脚本中提取变量名
问题描述
我想获取脚本中使用的变量列表,即VariableName13
, strDLink
, strZone
.
单个文件包含大约 150 多个事件,每个项目包含大约 700-900 个文件。
在 VBA 环境中,我想解析每个文件,遍历每个事件并提取事件声明或引用的变量名称。
我确实找到了一些类似Roslyn
或TypeLib
但无法理解如何使用它们的材料?
有人可以分享提取变量的正确方法吗?
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 代码。
如果您的所有声明都是一致的,并且一致地声明一个变量,并且变量是一致地声明的(Option Explicit
在每个模块中),那么捕获Dim|Private|Public|Friend|Global {identifier}
应该足够好......但这会产生很多“ifs”
现实生活中的项目有Dim
可以声明局部或私有变量列表的语句。或者在ReDim
某处有一个声明实际上是在现场声明一个数组。或者他们并不总是指定Option Explicit
变量,甚至根本不总是声明变量。或者在语句中间有一行继续破坏了正则表达式。或者,或者,或者......很多事情都可能出错,解析VBA代码是一个兔子洞。
例如,假设您需要选择并列出未声明的变量。正则表达式无法从过程或函数调用中分辨出它的用法,因为它们在语法上是相同的。正则表达式缺少语法的上下文——通过对源代码进行标记(也称为“词法分析”),然后使用解析器规则解析标记,我们可以 100% 确定我们正在查看的内容。
幸运的是,这是一个已解决的问题,并且有免费的开源 VBIDE 工具可用于此,并且每次都能为您提供 100% 正确的结果,而无需编写任何代码或担心哪些法律声明可能无法解释。
Rubberduck(我管理这个 OSS 项目并拥有它的网站)将正确解析任何合法的 VB6/vBA 代码(如果没有,我们对重现非常感兴趣!),然后您只需单击“复制”按钮可立即在剪贴板中包含每个声明:
Ctrl+V /粘贴到工作表(或Word文档,或记事本中!),然后您可以轻松地将其变成启用过滤器的表格;在您的情况下,您希望为“变量”过滤 [声明类型]:
上面,一个 VBA 项目的导出声明具有一个Sheet1
模块,该模块具有一个test
使用(但不声明)名为的变量的过程undeclared
:
Sub test()
undeclared = 42
Debug.Print undeclared
End Sub
这是您提供的代码的同一张表:
请注意,SubHandleError
and 其他Sub
andFunction
调用将解析为并解析为项目中的过程/函数。在这里,它们被作为未声明的变量拾取,因为除了您提供的代码之外我没有解析任何东西,所以这些标识符是未定义的。
推荐阅读
- cors - 如何将 withCredentials 选项传递给 Request?
- angular - 角度为 6 的主布局插座中的嵌套插座
- c# - VS Code (Mac) 缺少灯泡?
- python - 将列表中的值与列表中的字典值进行比较
- java - 使用循环与 Jackson 创建 Json 字符串
- python-3.x - 需要 url (demo) 用于 Ups Shipment Api 集成
- javascript - 在流星 js 应用程序中显示组织结构图
- sql - 日期时间功能:学期、季度
- javascript - 查找列表中哪个元素具有特定文本
- android - 将 LiveData 转换为 MutableLiveData