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

Lan*_*rts 8 excel vba

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

Application.Run ("testworkbook.xls!macroname")
Run Code Online (Sandbox Code Playgroud)

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

Application.Run ("testworkbook.xls!Sheet1.macroname")
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这个和许多其他变体,包括在那里有单引号或双引号,但我总是得到无法找到宏的消息.

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

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

Tod*_*ain 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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  5. 按F5运行test,您应该在立即窗口中看到100.

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

正如上面提到的,只有真正的回拉的情况是安全设置件,并确保你有到的VBAProject的编程访问 - 罚款一到十台计算机,但可能是一个麻烦,如果你要保证更重要的是总是被设置正确.