如何从另一个Excel工作簿中调用工作表特定的宏?

时间:2010-02-17 17:28:20

标签: excel vba

我正在尝试调用另一个工作簿中的Excel宏。它是一个特定于表的宏,但Microsoft文档和Web上的研究给出的语法只提供了一种仅通过工作簿访问宏的方法。该语法是:

Application.Run ("testworkbook.xls!macroname")

我需要做的是在那里有一个工作表参考,例如:

Application.Run ("testworkbook.xls!Sheet1.macroname")

我已尝试过这个以及其他许多变体,包括单引号或双引号,但我总是得到无法找到宏的消息。

编辑:通过所有线索和大量测试,我找到了答案。您可以访问特定于Sheet的子,但必须使用像'Sheet1'这样的规范名称,您不能使用实际的工作表名称。显然其他工作簿不能访问这些信息。

因此,只要您不尝试使用工作表名称,上述格式就可以工作(您可能必须单引用工作簿名称(通过将CHR(39)连接到任一端)。

4 个答案:

答案 0 :(得分:11)

我知道你已经想到这一点,可能是经过多次撕裂和咖啡,但我想:

  • 为您提供有关原因
  • 的详细信息
  • 为您提供一种可以使用的方式 你的表的名字来得到你的 想。

首先,您想要的工作表名称与代码模块名称不同。因此,在您的VBE中,您会看到代码模块的名称是“Sheet1”,但如果Name属性不同,例如,“ MySheet1 “(或者它也可能是相同的)。

为了按名称获取它,你必须做一些循环,更改安全设置等。如果这就是你所追求的(由于安全设置问题,这适用于较小的环境),在这里你举个例子:

  1. 将您的安全设置更改为 信任以编程方式访问VBA 项目。在Excel 2007中,转到Orb | Excel选项|信托中心|信任中心设置|宏 设置然后启用“信任 访问VBA项目模型“
  2. 创建一个工作簿 工作表。将其重命名为“ MySheet1 ”。 打开VBE(Alt + F11)并进入 “ Sheet1(MySheet1)”创建一个子 例程,将其称为TimesTen并在其中 代码刚放Debug.Print 10 * 10。像这样:

    Sub TimesTen()
        Debug.Print 10 * 10
    End Sub
    
  3. 将文件另存为启用宏 记录并称呼它 “ MacroXSLX.xlsm ”。保持开放状态。

  4. 打开一个新的Excel文档,导航 它的VBE和一个新的宏 在任何地方,创建一个名为 Test。在该代码的正文中, 把这个:

    Sub test()
    Dim SheetName As String
    SheetName = "MySheet1"
    Dim wb As Workbook
    Set wb = Workbooks("MacroXSLX.xlsm")
    For Each VBComp In wb.VBProject.VBComponents
        If VBComp.Properties.Item("Name").Value = SheetName Then
            Application.Run (wb.Name & "!" & VBComp.Name & ".TimesTen")
        End If
    Next
    End Sub
    
  5. 按F5运行test和你 应该在立即中看到 100 窗口。

  6. 你可以在#4中看到我正在循环遍历所有组件(模块,类等),寻找具有值为 MySheet1的Name属性的组件。一旦我有了,我就可以获得该组件的名称,在本例中是 Sheet1 并使用它来构造我的字符串,该字符串将在 MacroXSLX.xlsm中运行工作表的宏。当你找到你想要的东西时,可以进一步清理代码以退出For语句

    如上所述,唯一真正的缺点是安全设置部分并确保您可以以编程方式访问VBAProject - 在一到十台计算机上运行正常,但如果您必须确保更多,那可能会很麻烦总是设置正确。

答案 1 :(得分:1)

可以调整宏来接受工作表名称作为参数吗?然后,当您在原始工作簿的表单中调用它时,您可以将其称为MyMacro(me.name)?然后,当您从其他工作簿中调用它时,您可以将其称为application.run(“testworkbook.xls!MyMacro”,“sheetname”),其中“sheetname”是您的参数。

我不确定是否还有其他方法可以做到。

答案 2 :(得分:1)

VBA项目是否有密码保护?另外,sub是私有子吗?如果是这样,那么我不相信会找到宏。

答案 3 :(得分:1)

您可以使用此:

Run "'" & MySheet.Parent.name & "'!" & MySheet.CodeName & ".macroName"