示例:
“qlBlackConstantVol”
与"blackConstantVol"
:
blackVolId = Application.Run("qlBlackConstantVol", _
"blackConstantVol", 35932, "Target", 0.2, "Actual/365 (Fixed)")
如果是这样,他们为什么要在每个函数中重复这个名字,除了这个名字:
blackScholesId = Application.Run( _
"qlGeneralizedBlackScholesProcess", "blackScholes", _
blackVolId, 36, "Actual/365 (Fixed)", 35932, 0.06, 0)
答案 0 :(得分:1)
不,在通过Application.Run
进行调用时,无需重复功能或子名称,这不是您所看到的。 qlBlackConstantVol
与blackConstantVol
的名称不同(请注意ql
)。在上下文中,"blackConstantVol"
只是一个字符串参数,它被传递给qlBlackConstantVol
。此字符串与函数名称类似的事实无关紧要,并且不反映对Application.Run
的使用的任何约束。
答案 1 :(得分:1)
有必要像现在一样传递参数,但我认为您对代码有误解,因为您没有两次传递名称,而只传递了一次。
blackVolId = Application.Run("qlBlackConstantVol", _
"blackConstantVol", 35932, "Target", 0.2, "Actual/365 (Fixed)")
但是,Application.Run
并不需要两次传递名称(如果仔细观察,您会发现实际上并不是您在做什么,而是在传递名称,并且其他一些任意但相似的String
):
在上述情况下,"qlBlackConstantVol"
是要运行的过程,而"blackConstantVol"
只是一个String参数,它是函数qlBlackConstantVol
的输入。
在没有看到函数主体的情况下,无法说出"blackConstantVol"
的用途,以及它是否是“任意的”,因此,如果没有更多细节,我想说除非您知道自己在做什么,否则不要更改它。以及为什么。
该函数的名称无关紧要,并且不反映对
Application.Run
的使用是否有任何约束吗?
名称本身对后续的args列表施加了约束,因此尽管名称本身不是约束(即,您可以传递任何函数名称,只要它是有效/可访问的函数),但它确实会施加约束(args列表必须对该功能有效)。令人困惑?
Application.Run
的包装:Application.Run具有以下签名:
expression . Run( Macro , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 , Arg9 , Arg10 , Arg11 , Arg12 , Arg13 , Arg14 , Arg15 , Arg16 , Arg17 , Arg18 , Arg19 , Arg20 , Arg21 , Arg22 , Arg23 , Arg24 , Arg25 , Arg26 , Arg27 , Arg28 , Arg29 , Arg30 )
第一个参数Macro
是可选的(!),表示:
要运行的宏。可以是具有宏名称的字符串,也可以是 范围对象,指示功能在哪里,或用于 注册的DLL(XLL)功能。如果使用字符串,则该字符串将为 在活动工作表的上下文中进行评估。
其余参数分别表示:
应传递给函数的参数。
假设您有2个带有必需参数的子例程,例如:
Sub foo(i As Long, b As Boolean, s As String)
Static counter As Long
counter = counter + i
If b Then MsgBox ("Count: " & counter & ". " & s)
End Sub
Sub bar(i As Long)
MsgBox i
End Sub
要从foo
调用Application.Run
,您需要这样传递它:
Application.Run("foo", _some_long_integer_value, _a_boolean_value, _a_string_value)
如果没有传递足够的参数,则会出现错误:
Application.Run("foo", 90210)
如果传递太多参数(bar
仅接受一个参数),则会出现错误:
Application.Run("bar", 6, True, "hello")
如果将错误类型的参数传递给它,则会出现错误:
Application.Run("bar", "Blue")
如果向其传递无法计算的不可能参数(例如无效的Range
规范),则会收到1004错误:
Application.Run("foo", True, Range("A1:A-10"))
使用此方法时,可能会出现更多错误,上面的内容很容易说明,但我并不认为它们是详尽的清单。
当然,您可以通过这种方式调用大多数函数/子程序(需要注意的是:它必须在范围内,参数列表取决于函数为Run
等),因此在这种意义上只要后续参数与函数签名匹配,您为Macro
传递的内容就没有严格意义。