vba 显示对其他程序的引用

标签 vba list procedures

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

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

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 上下文菜单中选择“查找所有引用”命令:

Rubberduck 1.4.3 Find all references

然后,您可以双击列表中的项目以导航到那里。

最新的发布日期有点晚(2015 年 7 月),但该项目在 GitHub 上非常活跃,2.0 版应该会在 6-8 周内发布。它不会让您使用 VBA 代码迭代过程/标识符引用,而是使用 COM API 来完成该项目的路线图。

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

Rubberduck 2.0's search results toolwindow

到属性:

references to 'Cancelled' property accessor

...和库函数:

references to MsgBox

使用 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/

相关文章:

vba - 使用 VBA-Macros 抓取源代码

arrays - VB中对象数组的使用方法

excel - 检查VBA-excel中是否存在重复记录的列

mysql - 如何编写 MySQL 触发器以将行插入另一个表?

nested - 为什么在 tcl 中我们需要嵌套过程

arrays - 将工作表范围分配给数组

python - 在 python 上,如何在加入 float 列表后去掉引号?

Python:如何在遍历列表时只保留所有先前子列表中的元素?

python - 如何在python中比较两个列表列表,然后将数据写入excel

MySQL日期计算和选择大于55