如何将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):
插件代码是固定的
foo
和bar
,但顺序未知。例如,我无法打开代码bcs该宏受密码保护。我的代码是固定的
foo
和bar
但位置未知。我的实际情况更多地是数字2,所以我认为我的解决方案现在只是按位置传递参数,并为其创建适当的文档。但是我只是在测试第一种情况,如果有人以前曾遇到过这种情况,或者有任何解决办法?
答案 0 :(得分:2)
您可以编写一个包装程序,将变量按正确的顺序排序。
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
确保您的VBA加载项具有唯一的VBA名称,并且未命名为VBAProject
。例如,将其命名为quuxAddIn
。
在您的项目(不是外接程序)中设置一个引用(在VB编辑器菜单中:Extras> References),然后选择quuxAddIn
。
然后您可以按以下方式调用您的潜艇:
quuxAddIn.quuz bar:="bar", foo:="foo"
根据评论进行编辑:
如果您设置了对项目的引用,则智能(工具提示)应该起作用,并且在键入quuxAddIn.quuz之后,它应该显示带有参数的工具提示。这样,您还可以按名称提交参数。 (但是实际上,该外接程序必须存在才能将其添加为引用,因此仅适用于您的方案1)。对于方案2,仅提供您描述的解决方案以及按固定顺序使用Application.Run的解决方案。 •尽管如此,良好的文档记录还是必须的。