如何在函数中指定多个可选参数而不考虑它们的给出顺序

问题描述 投票:0回答:2

下面的示例可选参数必须按顺序给出;因此 ShowHeaders 必须先于 ValueAdd 等等。如果我想指定 ValueAdd,我*必须*指定 ShowHeaders:

Function Example(Value1, Optional ShowHeaders = "Headers=N", Optional ValueAdd = "Sprd=0")

我希望能够指定一个或多个(相对)较大的可选参数列表:1)但不按顺序,2)不一定是全部。

对于1)我在想,也许可以制作一个通用的参数列表,例如而不是上面的:

Function Example(Value1, Optional Arg1, Optional Arg2)

然后检查Arg1最左边的部分是否=“Headers =”或“Sprd =”等,然后对Arg2执行相同的操作。这很很好,但似乎效率不是很高,我计划创建具有 > 10 个可选参数的 UDF。上面的解决方案也可以解决 2) 但我只是觉得它的编码不太好。

对于 2)我知道我们可以使用

If IsMissing(Arg) Then

但这并没有真正解决我们指定函数的顺序。

vba arguments user-defined-functions optional-arguments
2个回答
4
投票

您可以将 := 运算符与变量名称一起使用。这样,您只需发送特定于该调用的可选值。使用上面的示例,您可以使用:

Call Example(Value1, ValueAdd := "Sprd=0")

这样您就不必输入有关显示标题等的任何内容。

编辑:

我修改了您的示例来处理缺少的参数,以便它们可以用于数学,希望这有帮助。

Function Example(Value1, Optional ValueA, Optional ValueB)

    If IsMissing(ValueB) Then ValueB = 0
    If IsMissing(ValueA) Then ValueA = 0

    Example = (Value1 + ValueA) * ValueB)
    MsgBox (Example)

End Function

Sub TestExample()
    Call Example(2, ValueB:=1)
    Call Example(2, ValueB:=1, ValueA:=6)
End Sub

0
投票

我在最近的宏中尝试过这一点,这是在 VBA 代码中调用此类函数的方式。 您可以通过在调用中策略性地使用逗号 (,) 来跳过可选参数。 情况“不传递 ValueA”...=示例(2,,5) 情况“不传递 ValueB”... =Example(2,7) 由于仅存在两个参数,该函数将识别 ValueB 是可选的,并且将仅“看到”Value1 和 ValueA。 情况“不传递 ValueA 或 ValueB”...=示例(2) 请参阅“不传递 ValueB ...=示例(2,7)”的注释

© www.soinside.com 2019 - 2024. All rights reserved.