vba显示对其他过程的引用

Ali*_*v3n 5 vba list procedures

今天我想问这个问题.说我有一个模块,在该模块中我调用位于其他模块中的不同程序(子或函数),如何以简单的方式列出所有过程名称及其模块或类,以防我想复制这些过程到当前模块并删除这些模块.谢谢

我不知道如何实现,但这是一个虚拟代码

for each UserDefinedProcedure in UserProcuduresCollection
if UserDefinedProcedure.Name (is Found in this module) then
debug.print UserDefinedProcedure.Name
end if 
next 
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 5

免责声明:我自己编写了Rubberduck插件的这一部分,我拥有并维护了Rubberduck项目.


下载并安装Rubberduck.右键单击过程名称(从其声明或其任何用法),然后从代码窗格上下文菜单中选择"查找所有引用"命令:

Rubberduck 1.4.3查找所有参考文献

然后,您可以双击列表中的项目进行导航.

最新发布的日期有点(2015年7月),但该项目在GitHub上运行良好,版本2.0应在6-8周内发布.它不会让你重复使用VBA代码的程序/标识符引用,但一个COM API来完成这一功能对项目的路线图.

Rubberduck 2.0的"查找所有引用"可以从类中找到对几乎所有内容的引用:

Rubberduck 2.0的搜索结果工具窗口

属性:

对

......和库函数:

对MsgBox的引用


使用VBIDE API执行代码,甚至是非常智能的代码,都不可能实现.这样做的原因是将此代码包含在内是完全合法的Module1:

Sub DoSomething()
    'do something
End Sub
Run Code Online (Sandbox Code Playgroud)

然后这段代码Module2:

Sub DoSomething()
    'do something
End Sub
Run Code Online (Sandbox Code Playgroud)

要正确解析对DoSomething内部的引用Module1,您需要检查调用是否合格(例如,Module2.DoSomething将调用内部的过程Module2- 不合格的调用将调用内部的过程Module1).

解析标识符引用是我花了整整一年时间来完善代码的,并且它仍然不完美(虽然它现在解决了你甚至认为不合法的VBA的疯狂模糊代码) - 在普通的VBA中这样做是有自杀的最好.

最后,我们将公开一个COM API,它将允许Rubberduck用户编写类似于这个完全假设的代码的VBA代码:

For Each declaration In RubberduckParserState.UserDeclarations
    If declaration.DeclarationType = Procedure And declaration.ParentScope = "VBAProject.Module1" Then
        For Each reference In declaration.References
            Debug.Print declaration.IdentifierName " used in " & reference.ToString
        Next
    End If
Next
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我真的很感谢你通过给我们The Rubberduck :)给你的世界贡献,我实际上正在寻找能够增强VBE并增加更多功能的东西.干杯 (5认同)

Sam*_*Sam 0

在中断模式下,按Ctrl+L查看调用堆栈。这是您在 VBE 中所能得到的最好的结果。

请注意,调用堆栈无法通过代码访问,因此您的最终目标无法在 VBA 中实现。