Statistica 64宏如何获取自身存储文件名?含VBA相关问询
我来帮你搞定这个问题!你遇到的核心问题是Application.Macros.Item(1)完全依赖宏的加载顺序,一旦打开多个宏文件,返回的结果肯定不对。下面分别针对Statistica(SVB)和Excel VBA给出靠谱的解决方案:
Statistica (SVB) 解决方案
SVB确实没有Me关键字,但我们可以借助VBA项目对象模型(VBE)来精准获取当前宏所在的SVB文件名。需要注意的是,你得先在Statistica的宏安全设置里启用“允许访问VBA项目对象模型”(和Excel的设置逻辑一致)。
方案1:通过活动代码窗格获取(适合前台执行的宏)
Sub Main() Dim currentModule As CodeModule Dim svbFileName As String ' 获取当前执行代码所在的代码模块 Set currentModule = Application.VBE.ActiveCodePane.CodeModule ' 从模块所属的VBA项目中提取SVB文件路径 svbFileName = currentModule.Parent.Parent.FileName Debug.Print "当前宏所在的SVB文件:" & svbFileName Debug.Print "当前代码所在的模块名称:" & currentModule.Name End Sub
方案2:通过过程名定位(适合后台执行的宏)
如果你的宏是后台运行,活动代码窗格可能不是当前模块,可以通过错误处理获取当前执行的过程名,再定位对应的宏文件:
Sub Main() Dim procName As String Dim targetMacro As Macro Dim svbFileName As String ' 借助错误捕获获取当前执行的过程名 On Error Resume Next Err.Raise 999, , "", , 1 procName = Err.Source On Error GoTo 0 ' 根据过程名找到对应的宏对象 Set targetMacro = Application.Macros(procName) ' 提取宏所在的SVB文件名 svbFileName = targetMacro.FileName Debug.Print "当前宏所在的SVB文件:" & svbFileName End Sub
Excel VBA 解决方案
你需要的是代码模块名称而非工作簿文件名,同样可以用VBE对象模型实现,前提是在Excel的信任中心启用“信任对VBA项目对象模型的访问”。
获取当前代码所在的模块名称
Sub GetCurrentModuleInfo() Dim currentModule As CodeModule Set currentModule = Application.VBE.ActiveCodePane.CodeModule Debug.Print "当前代码所在的模块名称:" & currentModule.Name ' 如果需要同时获取工作簿文件名,可以加这句: ' Debug.Print "所属工作簿:" & currentModule.Parent.Parent.FileName End Sub
更可靠的过程名定位法
如果担心活动代码窗格的干扰,可以遍历工作簿组件,通过过程名精准定位模块:
Function GetCurrentModuleName() As String Dim procName As String Dim vbComp As VBComponent ' 捕获当前执行的过程名 On Error Resume Next Err.Raise 999, , "", , 1 procName = Err.Source On Error GoTo 0 ' 遍历所有组件,找到包含该过程的模块 For Each vbComp In ThisWorkbook.VBComponents If vbComp.CodeModule.Find(procName, 1, 1, -1, -1) Then GetCurrentModuleName = vbComp.Name Exit For End If Next vbComp End Function Sub Main() Debug.Print "当前模块名称:" & GetCurrentModuleName() End Sub
内容的提问来源于stack exchange,提问作者Shari W
相关产品推荐
相关产品推荐

