Excel-vba Application.Run替代方法,以使用命名参数运行宏

时间:2019-05-02 12:51:14

标签: excel vba

如何将Application.Run与命名参数一起使用?基于此MS documentation

  

您不能在此方法中使用命名参数。参数必须按位置传递。

出于我的代码目的,强制按位置传递参数的解决方案似乎不太灵活,即通过传递一些参数来创建运行其他人的宏的宏。示例如下:

Sub MyMacro()

    Dim macroName as String
    Dim foo as String
    Dim bar as String

    macroName = "'quux.xlam'!quuz"
    foo = "thud"
    bar = "baz"

    ' arguments pass by position
    ' this method works
    Application.Run macroName, foo, bar

    ' however, I intend to remove position dependency to allow flexibility
    ' hence, I'd like to pass argument by name, as below
    Application.Run macroName, foo:=foo, bar:=bar ' or below
    Application.Run macroName, bar:=bar, foo:=foo ' both raise compile error

End Sub


' Below is a macro from Add-In quux.xlam
Sub quuz(foo as String, bar as String)

    MsgBox foo & bar

End Sub

我的问题与this类似,但那里没有回答我的问题。那么如何找到Application.Run的替代方案?


场景/假设

我有自己的宏。同时,我正在使用其他人的宏(例如,来自外接程序)。我们俩都没有交流,也没有适当的外接程序文档。潜在的情况如下(2):

  1. 插件代码是固定的

    • 我知道我必须通过foobar,但顺序未知。例如,我无法打开代码bcs该宏受密码保护。
  2. 我的代码是固定的

    • 其他人正在使用我的宏。他们知道使用我的宏时,他们必须接受两个参数foobar但位置未知。
    • 我的宏受密码保护。
    • 这种情况比较容易,因为我至少可以尽我所能并创建适当的文档。

我的实际情况更多地是数字2,所以我认为我的解决方案现在只是按位置传递参数,并为其创建适当的文档。但是我只是在测试第一种情况,如果有人以前曾遇到过这种情况,或者有任何解决办法?

1 个答案:

答案 0 :(得分:2)

解决方案1 ​​

您可以编写一个包装程序,将变量按正确的顺序排序。

Sub test()
    quuzWrapper bar:="bar", foo:="foo"
End Sub

Sub quuzWrapper(foo as String, bar as String)
    Application.Run "quuz", foo, bar 
End Sub



' Below is a macro from Add-In quux.xlam
Sub quuz(foo as String, bar as String)
    MsgBox foo & bar
End Sub

解决方案2

  1. 确保您的VBA加载项具有唯一的VBA名称,并且未命名为VBAProject。例如,将其命名为quuxAddIn

  2. 在您的项目(不是外接程序)中设置一个引用(在VB编辑器菜单中:Extras> References),然后选择quuxAddIn

  3. 然后您可以按以下方式调用您的潜艇:

    quuxAddIn.quuz bar:="bar", foo:="foo"
    

根据评论进行编辑:
如果您设置了对项目的引用,则智能(工具提示)应该起作用,并且在键入quuxAddIn.quuz之后,它应该显示带有参数的工具提示。这样,您还可以按名称提交参数。 (但是实际上,该外接程序必须存在才能将其添加为引用,因此仅适用于您的方案1)。对于方案2,仅提供您描述的解决方案以及按固定顺序使用Application.Run的解决方案。 •尽管如此,良好的文档记录还是必须的。

相关问题