首页 文章

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

提问于
浏览
8

我正在尝试调用另一个工作簿中的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 回答

  • 11

    我知道你已经想到这一点,可能是经过多次撕裂和咖啡,但我想:

    • 为您提供更多详细信息

    • 为您提供一种方法,您可以使用工作表的名称来获得您想要的 .

    首先,您想要的工作表名称与代码模块名称不同 . 因此,在您的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 . 像这样:

    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

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

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

  • 1

    VBA项目是否有密码保护?另外,sub是私有子吗?如果是这样,那么我不相信会找到宏 .

相关问题