从其他工作簿调用Excel宏

时间:2015-02-26 11:55:59

标签: excel vba excel-vba

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

在HasMacros.xlsm中,我添加了一个名为Mod1的模块,其中只包含以下代码:

Sub testmacro()

   MsgBox ("Test")

End Sub

在HasData.xlsm中,我添加了一个名为Mod2的模块,其中只包含以下代码:

Sub testmacro2()

   'XXX

End Sub

到目前为止,这么好。在Excel中没有打开任何其他内容。

现在,我想从testmacro2调用testmacro,其中写有XXX。

此操作因立即编译错误而失败:

Sub testmacro2()

   testmacro()

End Sub

这会因编译错误而失败"未定义的函数Sub"在exec:

Sub testmacro2()

   Call testmacro

End Sub

此操作因立即编译错误而失败:

Sub testmacro2()

   Mod1.testmacro()

End Sub

这在exec上失败了:

Sub testmacro2()

致电Mod1.testmacro

End Sub

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

  

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

我完全没有关于如何从HasData.xlsm中的VBA代码调用HasMacros.xlsm中的宏的想法

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

Application.Run("'工作簿HasMacros.xlsm'!testmacro")

答案 2 :(得分:1)

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

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

此解决方案仍然难以对模块和子名称进行编码,但您可以获得一般性的想法,并可以对其进行调整以满足您的需求。

============

Master Workbook:Master.xlsm
模块:GlobalMethods
Sub:SetThePath(string)

Slave Workbook:Slave.xlsm
模块:Init
Sub:SetUpMyWorld

==============

Sub SetUpMyWorld()'在奴隶工作簿中定义
    将myMaster变暗为字符串
    将myMasterWB调暗为工作簿
    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&#34;无法打开您的主工作簿:&#34; + myMaster +&#34;。糟糕&#34!;

End Sub

答案 3 :(得分:0)

对我来说这段代码有效:

工作簿(1).testmacro

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