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 
免责声明:我自己编写了Rubberduck插件的这一部分,我拥有并维护了Rubberduck项目.
下载并安装Rubberduck.右键单击过程名称(从其声明或其任何用法),然后从代码窗格上下文菜单中选择"查找所有引用"命令:

然后,您可以双击列表中的项目进行导航.
最新发布的日期有点(2015年7月),但该项目在GitHub上运行良好,版本2.0应在6-8周内发布.它不会让你重复使用VBA代码的程序/标识符引用,但一个COM API来完成这一功能是对项目的路线图.
Rubberduck 2.0的"查找所有引用"可以从类中找到对几乎所有内容的引用:
属性:
......和库函数:
使用VBIDE API执行代码,甚至是非常智能的代码,都不可能实现.这样做的原因是将此代码包含在内是完全合法的Module1:
Sub DoSomething()
    'do something
End Sub
然后这段代码Module2:
Sub DoSomething()
    'do something
End Sub
要正确解析对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