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

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

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

我需要做的是在那里也有一个表单引用,如:

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

我已经尝试了这个和许多其他的变化,包括在那里单引号或双引号,但我总是得到的消息,macros不能被发现。

编辑:随着所有的线索和大量的testing,我find了答案。 您可以访问特定于工作表的子工作站,但必须使用“工作表1”这样的规范名称,不能使用实际的工作表名称。 显然其他工作簿不访问该信息。

所以上面的格式工作,只要你不尝试使用sheetname(你可能必须单引号的工作簿名称(通过连接CHR(39)结束)。

我知道你已经知道了,可能经过了很多头发和咖啡,但我想:

  • 给你更多的细节,为什么这是
  • 为您提供一种方法,您可以使用工作表的名称来获得所需的信息。

首先,您想要的工作表名称与代码模块名称不同。 所以在你的VBE中,你会发现代码模块的名字是“Sheet1”,但是如果Name有不同的属性 ,例如“ MySheet1 ”(或者也可能是相同的)。

为了得到它的名字,你将不得不做一些循环,改变安全设置等。如果这就是你所追求的(由于安全设置问题,这在小型环境中运行良好),在这里你作为一个例:

  1. 将您的安全设置更改为信任对VBA项目的编程访问。 在Excel 2007中,转到Orb | Excel选项| 信任中心| 信任中心设置| macros设置,然后启用“信任访问VBA项目模型”
  2. 用一个工作表创build一个工作簿。 将其重命名为“ MySheet1 ”。 打开VBE(Alt + F11),在“ Sheet1(MySheet1) ”中创build一个子例程,调用它TimesTen并在代码中将Debug.Print 10 * 10 。 喜欢这个:

     Sub TimesTen() Debug.Print 10 * 10 End Sub 
  3. 将该文件保存为启用macros的文档,并将其命名为“ MacroXSLX.xlsm ”。 把它打开。

  4. 打开一个新的Excel文档,导航到它的VBE,并在任何地方的新macros,创build一个名为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

你可以在#4中看到,我遍历所有组件(模块,类等),寻找具有值为MySheet1Name属性的组件 。 一旦我有了,我就可以得到这个组件的名字,在这种情况下是Sheet1,并使用它来构造我的string,它将在MacroXSLX.xlsm中运行工作表的macros。 代码可以进一步清理,当你find你想要的东西时退出For语句。

如上所述,唯一真正的缺点是安全设置一块,并确保您有程序访问的VBAProject – 罚款一到十台计算机,但可能是一个麻烦,如果你必须确保超过总是设置正确。

你可以调整你的macros来接受一个sheetname作为参数吗? 那么当你在原始工作簿的表格中调用它时,你可以把它叫做MyMacro(me.name)? 然后当您从其他工作簿中调用它时,可以将其称为application.run(“testworkbook.xls!MyMacro”,“sheetname”),其中“sheetname”是您的参数。

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

VBA项目是否有密码保护? 另外,子是一个私人的子? 如果是这样,那么我不相信macros将被发现。