【问题标题】:Call an Excel macro from a different Workbook从不同的工作簿调用 Excel 宏
【发布时间】:2015-02-26 11:55:58
【问题描述】:

我有一个工作簿 HasMacros.xlsm 和一个工作簿 HasData.xlsm

在 HasMacros.xlsm 中,我仅使用以下代码添加了一个名为 Mod1 的模块:

Sub testmacro()

   MsgBox ("Test")

End Sub

在 HasData.xlsm 中,我仅使用以下代码添加了一个名为 Mod2 的模块:

Sub testmacro2()

   'XXX

End Sub

在 Excel 中没有打开任何其他内容。

我想从写有 XXX 的 testmacro2 调用 testmacro。

这将失败并立即编译错误:

Sub testmacro2()

   testmacro()

End Sub

执行时出现编译错误“未定义函数的子”:

Sub testmacro2()

   Call testmacro

End Sub

这将失败并立即编译错误:

Sub testmacro2()

   Mod1.testmacro()

End Sub

执行失败:

Sub testmacro2()

   Call Mod1.testmacro

End Sub

我试过How to call function from another specific workbook in VBA?,但我得到了

名称与现有模块、项目或对象库冲突

如何从 HasData.xlsm 中的 VBA 代码调用 HasMacros.xlsm 中的宏

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您还可以将 Workbook HasMacros.xlsm 中的 VBA 项目名称更改为 VBAProject 以外的名称,然后从 HasData.xlsm 项目中设置对该项目的引用(工具 - VB 编辑器中的引用)。这将允许您直接调用另一个宏而不使用Run

    【讨论】:

    • 这行得通。我已经更改了 HasMacros 的项目名称,但这不起作用,但更改 HasData 的项目名称有效。谢谢。
    【解决方案2】:

    Application.Run("'Workbook HasMacros.xlsm'!testmacro")

    【讨论】:

    • 这对函数也有效吗?以及传递参数?
    • 确实如此:Application.Run("'Workbook HasMacros.xlsm'!testmacro", arg1, arg2, arg3)
    【解决方案3】:

    我不想将包含我的子例程的主工作簿的名称硬编码到我的从工作簿中。我已经使用注册表来存储有关我的主工作簿的关键信息,并且有可以提取该信息的例程。

    当我使用 Application.Run 时,我只找到了显示从工作簿硬编码字符串以访问主工作簿方法的示例。我能够想出一个即时构建字符串的解决方案。

    此解决方案仍对 Module 和 Sub 名称进行硬编码,但您可以大致了解并对其进行调整以满足您的需求。

    ============
    
    Master Workbook: Master.xlsm  
    Modules: GlobalMethods  
    Sub: SetThePath(string)  
    
    Slave Workbook: Slave.xlsm  
    Modules: Init  
    Sub: SetUpMyWorld  
    
    ==============
    
    Sub SetUpMyWorld()    ' Defined in the Slave Workbook  
        Dim myMaster as string  
        Dim myMasterWB as Workbook  
        Dim SlaveWB as Workbook  
    
        Set SlaveWB = ThisWorkbook  
    
        myMaster = GetMyMasterWBName() ' This is another module in Slave  
        If myMaster <> "" Then  
            Set myMasterWB = Workbooks.Open(myMaster)  
            On Error GoTo Complaint1  
            Dim sInvoke as String  
    
            sInvoke = Chr(39) & myMaster & Chr(39) & "!GlobalMethods.SetThePath"  
            Application.Run sInvoke, SlaveWB.Path  
            Exit Sub  
        End If       
    
    Complaint1:    
        MsgBox "Could not open your Master workbook: " + myMaster + ". Oops!"  
    
    End Sub  
    

    【讨论】:

      【解决方案4】:

      对我来说,这段代码有效:

      工作簿(1).testmacro

      它不会在代码中自动完成,但可以工作。

      【讨论】:

        猜你喜欢
        • 2015-05-01
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-11
        • 1970-01-01
        相关资源
        最近更新 更多