【问题标题】:Run another macro in another Excel file在另一个 Excel 文件中运行另一个宏
【发布时间】:2020-11-13 05:08:16
【问题描述】:

您好,我正在构建一个 Excel 系统来运行宏,以便在其他 Excel 文件上运行多个不同的宏。

假设我有两个 Excel 文件:“Parent.xlsx”和“child.xlsx”已经打开。

在我的 Parent.xlsx 中,我正在运行一个 VBA 脚本,我如何在我的“PERSONAL.XLSB”中为我的“child.xlsx”运行一个名为“method1”的宏

现在,在我的 Parent.xlsx 中,我尝试运行这个宏 VBA 脚本:

Workbooks("child.xlsx").Application.Run "PERSONAL.XLSB!method1"

在 Modelue6 的 PERSONAL.XLSB 中,我有:

Sub method1()
    Dim rTable As Range
    Selection.AutoFilter
End sub

错误: 运行时错误'1004': Range 类的 AutoFilter 方法失败

非常感谢!

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您需要限定和引用代码应该作用的工作簿。

    在此处查看 ActiveWorkbook 属性:https://docs.microsoft.com/en-us/office/vba/api/excel.application.activeworkbook

    【讨论】:

      【解决方案2】:

      应用程序运行

      在Parent.xlsx 中(要保留代码,请将文件另存为例如Parent.xlsm)

      Sub callMethod1()
          Dim wb As Workbook
          Set wb = Workbooks("child.xlsx")
          Application.Run "PERSONAL.XLSB!method1", wb
      End Sub
      

      在PERSONAL.XLSB

      Sub method1(wb As Workbook)
          wb.Activate
          If Not Selection Is Nothing Then
              If TypeName(Selection) = "Range" Then
                  If ActiveSheet.AutoFilterMode Then
                      ActiveSheet.AutoFilterMode = False
                  End If
                  Selection.AutoFilter
              End If
          End If
      End Sub
      

      【讨论】:

        【解决方案3】:

        首先,您不能期望 xlsx 格式的工作簿中有宏。确保您有 eikther xlsm 或 xlsb 作为源。这让我们想到了第二个必要性。必须已保存工作簿才能具有这种格式。您不能从尚未保存的打开工作簿中调用宏(因为它还没有任何格式)。

        这是在另一个工作簿中调用现有宏的正确语法。

        Sub Test_TestCall()
            Application.Run "'Personal.xlsb'!Method1"
        End Sub
        

        按照被调用过程所需的顺序在括号中添加参数。

        但是,您可能会发现简单地设置对其他工作簿的引用更容易。这是step-by-step guide how to set a reference。设置引用后,您可以调用其他项目中的所有宏,就好像它们在调用工作簿中一样。参考与工作簿一起保存,并且在您下次打开工作簿时仍然存在。此方法(以及任何其他方法)的缺点是您无法将调用工作簿的工作副本发送给第三方,除非您也发送引用的工作簿。

        您得到的错误还有另一个原因。 Selection 是由用户在 ActiveWorkbook 中创建的,由于您没有告诉 Method1 哪个工作簿处于活动状态,所以它无法找到它,对吧?但是,最好通过遵循所有编程规则中最基本的规则来解决这个问题:“避免使用Selection 对象!”请改用Range 对象。如果您绝对必须使用 Selection` 对象,则将其作为参数传递给您的过程。

        Application.Run "'Personal.xlsb'!Method1(Selection)"
        ' and
        Sub method1(MyRange As Range)
            Dim rTable As Range
            MyRange.AutoFilter
        End sub
        

        【讨论】:

        • 这个宏参考的语法记录在哪里,尤其是(Selection) 部分?
        • 以Application.Run 开头的行将在打开的工作簿中的过程内。 Sub Method1 将在被引用的工作簿中,例如 Personal.xlb。
        • 我明白,但是这个语法记录在哪里:'<wbfile>'!<method>(<argument>)?
        • 所有代码都可以在 VB 编辑器窗口中访问。您可以通过按 Alt+F11 从 Excel UI 转到那里,但某些 Excel 学生许可证可能不包含 VBA 功能。如果 VBA 包含在您的许可证中,您可以修改功能区以显示 开发人员 选项卡(谷歌为“修改功能区”)并通过单击 Visual Basic 切换到 VB 编辑器开发者标签上的按钮。
        • 也许你理解英语有困难,或者我表达自己有困难,但这不是我要问的。我要求 Application.Run 方法的第一个参数或宏名称文字的官方文档。指定您使用的外部宏的方法仅在 Word 的 Run 方法的示例中提到,但它在哪里正确记录?
        猜你喜欢
        • 2019-07-01
        • 2023-03-18
        • 2016-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-24
        • 2015-10-20
        相关资源
        最近更新 更多