如何引用当前正在运行的模块(VBComponent)?
嗨,这个问题问得挺实用的!其实VBA本身并没有像ThisWorkbook那样现成的ThisVBComponent或者ActiveVBComponent对象,能直接获取当前正在执行代码的模块,但我们可以用几个小技巧来实现类似的效果:
方法一:给每个模块定义专属的“自引用”函数
这是最简单直接的方式,在你需要追踪的模块顶部添加一个函数,专门返回当前模块的VBComponent对象。比如在名为Module1的模块里:' 放在Module1的顶部 Public Function ThisVBComponent() As VBComponent Set ThisVBComponent = ThisWorkbook.VBProject.VBComponents("Module1") End Function之后在这个模块里运行代码时,只要调用
ThisVBComponent()就能直接拿到当前模块的对象了。缺点是每个模块都要单独写这段代码,有点繁琐但胜在靠谱。方法二:借助错误行号逆向查找模块
我们可以利用Erl函数获取当前代码行号,再结合VBComponent.CodeModule的ProcOfLine方法,遍历找到当前运行的模块。不过这个方法需要先给代码开启行号(在VBE里点击「工具」→「选项」→「编辑器」,勾选「行号」即可)。示例代码如下:Public Function GetCurrentVBComponent() As VBComponent Dim lineNum As Long Dim procName As String Dim procKind As vbext_ProcKind ' 故意触发一个小错误来获取当前执行的行号 On Error Resume Next Err.Raise vbObjectError + 1000, , , , Erl lineNum = Erl On Error GoTo 0 If lineNum > 0 Then ' 遍历当前工作簿的所有VB组件 Dim comp As VBComponent For Each comp In ThisWorkbook.VBProject.VBComponents ' 检查当前行是否属于该组件的代码模块 procName = comp.CodeModule.ProcOfLine(lineNum, procKind) If procName <> "" Then Set GetCurrentVBComponent = comp Exit For End If Next comp End If End Function注意:使用这个方法需要确保你的Excel信任设置允许访问VBA项目对象模型——可以在「文件」→「选项」→「信任中心」→「信任中心设置」→「宏设置」里勾选「信任对VBA项目对象模型的访问」。
方法三:调用堆栈解析(进阶版)
如果需要更精准的调用堆栈信息,可以借助Windows API来读取内存中的调用堆栈,但这个方法复杂度较高,需要处理内存地址和符号解析,一般前面两种方法就足够应付大部分日常需求了。
另外要提醒下:Application.VBE.ActiveCodePane获取的是当前你正在编辑的代码窗格,不一定是正在运行代码的模块,所以不能用它来替代“当前运行的模块”哦。
备注:内容来源于stack exchange,提问作者Uno que busca

