今天我想问这个问题。
假设我有一个模块,并且在该模块中我调用位于其他模块中的不同过程(子程序或函数),如果我想复制这些过程,我如何以简单的方式列出所有过程名称及其模块或类到当前模块并删除这些模块。
谢谢
我不知道如何实现,但这是一个虚拟代码
for each UserDefinedProcedure in UserProcuduresCollection
if UserDefinedProcedure.Name (is Found in this module) then
debug.print UserDefinedProcedure.Name
end if
next
最佳答案
DISCLAIMER: I wrote this part of the Rubberduck add-in myself, and I own and maintain the Rubberduck project.
下载安装Rubberduck .右键单击过程名称(来自其声明或任何用法)并从代码 Pane 上下文菜单中选择“查找所有引用”命令:
然后,您可以双击列表中的项目以导航到那里。
最新的发布日期有点晚(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
关于vba 显示对其他程序的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36183657/