是否有必要在呼叫功能中重复名称?

时间:2018-06-18 12:24:06

标签: excel excel-vba quantlib vba

示例:

“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)

2 个答案:

答案 0 :(得分:1)

不,在通过Application.Run进行调用时,无需重复功能或子名称,这不是您所看到的。 qlBlackConstantVolblackConstantVol的名称不同(请注意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)功能。如果使用字符串,则该字符串将为   在活动工作表的上下文中进行评估。

其余参数分别表示:

  

应传递给函数的参数。

Application.Run如何工作?

假设您有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)

enter image description here

如果传递太多参数(bar仅接受一个参数),则会出现错误:

Application.Run("bar", 6, True, "hello")

enter image description here

如果将错误类型的参数传递给它,则会出现错误:

Application.Run("bar", "Blue")

enter image description here

如果向其传递无法计算的不可能参数(例如无效的Range规范),则会收到1004错误:

Application.Run("foo", True, Range("A1:A-10"))

enter image description here

使用此方法时,可能会出现更多错误,上面的内容很容易说明,但我并不认为它们是详尽的清单。

当然,您可以通过这种方式调用大多数函数/子程序(需要注意的是:它必须在范围内,参数列表取决于函数为Run等),因此在这种意义上只要后续参数与函数签名匹配,您为Macro传递的内容就没有严格意义。