我正在尝试调用另一个工作簿中的Excel宏。它是一个特定于表的宏,但Microsoft文档和Web上的研究给出的语法只提供了一种仅通过工作簿访问宏的方法。该语法是:
Application.Run ("testworkbook.xls!macroname")
我需要做的是在那里有一个工作表参考,例如:
Application.Run ("testworkbook.xls!Sheet1.macroname")
我已尝试过这个以及其他许多变体,包括单引号或双引号,但我总是得到无法找到宏的消息。
编辑:通过所有线索和大量测试,我找到了答案。您可以访问特定于Sheet的子,但必须使用像'Sheet1'这样的规范名称,您不能使用实际的工作表名称。显然其他工作簿不能访问这些信息。
因此,只要您不尝试使用工作表名称,上述格式就可以工作(您可能必须单引用工作簿名称(通过将CHR(39)
连接到任一端)。
答案 0 :(得分:11)
我知道你已经想到这一点,可能是经过多次撕裂和咖啡,但我想:
首先,您想要的工作表名称与代码模块名称不同。因此,在您的VBE中,您会看到代码模块的名称是“Sheet1”,但如果Name
的属性不同,例如,“ MySheet1 “(或者它也可能是相同的)。
为了按名称获取它,你必须做一些循环,更改安全设置等。如果这就是你所追求的(由于安全设置问题,这适用于较小的环境),在这里你举个例子:
创建一个工作簿
工作表。将其重命名为“ MySheet1 ”。
打开VBE(Alt + F11)并进入
“ Sheet1(MySheet1)”创建一个子
例程,将其称为TimesTen
并在其中
代码刚放Debug.Print 10 *
10
。像这样:
Sub TimesTen()
Debug.Print 10 * 10
End Sub
将文件另存为启用宏 记录并称呼它 “ MacroXSLX.xlsm ”。保持开放状态。
打开一个新的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
按F5运行test
和你
应该在立即中看到 100
窗口。
你可以在#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"