我正在尝试调用另一个工作簿中的Excel宏 . 它是一个特定于表的宏,但Microsoft文档和Web上的研究给出的语法只提供了一种仅通过工作簿访问宏的方法 . 该语法是:
Application.Run ("testworkbook.xls!macroname")
我需要做的是在那里有一个工作表参考,如:
Application.Run ("testworkbook.xls!Sheet1.macroname")
我已经尝试过这个和许多其他变体,包括在那里有单引号或双引号,但我总是得到无法找到宏的消息 .
Edit: 通过所有线索和大量测试,我找到了答案 . 您可以访问特定于Sheet的子,但您必须使用'Sheet1'之类的规范名称,您可以't use the actual sheetname. Apparently other workbooks don' t访问该信息 .
因此,只要您不尝试使用工作表名称,上述格式就可以工作(您可能必须单引用工作簿名称(通过将 CHR(39)
连接到任一端) .
3 回答
我知道你已经想到这一点,可能是经过多次撕裂和咖啡,但我想:
为您提供更多详细信息
为您提供一种方法,您可以使用工作表的名称来获得您想要的 .
首先,您想要的工作表名称与代码模块名称不同 . 因此,在您的VBE中,您会看到代码模块的名称是"Sheet1",但是如果
Name
的不同属性可能不同,例如“MySheet1”(或者它也可能相同) .为了获得它的名称,你将不得不做一些循环,更改安全设置,等等 . 如果这是你所追求的(由于安全设置问题,这适用于较小的环境),在这里你作为一个例:
更改安全设置以信任对VBA项目的编程访问 . 在Excel 2007中,转到Orb | Excel选项|信托中心|信任中心设置|宏设置然后启用"Trust access to the VBA project model"
使用一个工作表创建工作簿 . 重命名为“MySheet1 ". Open the VBE (Alt+F11) and in " Sheet1 (MySheet1) ”创建一个子例程,将其命名为
TimesTen
并在代码中放入Debug.Print 10 * 10
. 像这样:将文件另存为启用宏的文档,并将其命名为“MacroXSLX.xlsm” . 保持开放 .
打开一个新的Excel文档,导航到它的VBE,并在任何地方的新宏中创建一个名为
Test
的子文件 . 在该代码的正文中,把这个: .test
,您应该在立即窗口中看到100 .你可以在#4中看到我正在循环遍历所有组件(模块,类等),寻找具有值为MySheet1的
Name
属性的组件 . 一旦我有了,我就可以获得该组件的名称,在本例中是Sheet1,并使用它来构造我的字符串,该字符串将在MacroXSLX.xlsm中运行工作表的宏 . 当你找到你想要的东西时,可以进一步清理代码以退出For语句 .如上所述,唯一真正的缺点是安全设置部分并确保您可以以编程方式访问VBAProject - 在一到十台计算机上可以正常使用,但如果您必须确保总是设置多个,那么可能会很麻烦正确 .
你可以调整你的宏来接受一个工作表名称作为参数吗?然后,当您在原始工作簿的表单中调用它时,您可以将其称为MyMacro(me.name)?然后,当您从其他工作簿中调用它时,您可以将其称为application.run(“testworkbook.xls!MyMacro”,“sheetname”),其中“sheetname”是您的参数 .
我不确定是否还有其他方法可以做到这一点 .
VBA项目是否有密码保护?另外,sub是私有子吗?如果是这样,那么我不相信会找到宏 .