You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:55:29