我正在尝试调用另一个工作簿中的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 "(或者它也可以是相同的).
为了获得它的名称,你将不得不做一些循环,更改安全设置,等等.如果这是你所追求的(由于安全设置问题,这适用于较小的环境),在这里你作为一个例:
使用一个工作表创建工作簿.将其重命名为" 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)将文件另存为启用宏的文档,并将其命名为" 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
Run Code Online (Sandbox Code Playgroud)按F5运行test
,您应该在立即窗口中看到100.
你可以在#4中看到我正在循环遍历所有组件(模块,类等),寻找Name
具有值为MySheet1的属性的组件.一旦我有了,我就可以获得该组件的名称,在本例中是Sheet1,并使用它来构造我的字符串,该字符串将在MacroXSLX.xlsm中运行工作表的宏.当你找到你想要的东西时,可以进一步清理代码以退出For语句.
正如上面提到的,只有真正的回拉的情况是安全设置件,并确保你有到的VBAProject的编程访问 - 罚款一到十台计算机,但可能是一个麻烦,如果你要保证更重要的是总是被设置正确.