【发布时间】:2015-08-04 11:40:32
【问题描述】:
考虑一个带有多个可选参数的函数。例如:
Function foo(Optional a, Optional b, Optional c, Optional d)
如果我只想在参数不为空或其他测试的情况下调用特定函数(因为函数会引发错误,否则除非参数丢失)。
Collection 类就是一个例子。 Add 方法有 3 个可选参数。许多自定义类包装了这个类 - 例如创建一个“Person”自定义类的可索引类 Persons 或类似的东西。包装器必须处理 6 种组合:仅添加 Key,添加 Key 并指定 Before,添加 Key 并指定 After,不添加 Key 并指定 Before,不添加 Key 并指定 After,无 Key 且无 Before/后。如果为像 Workbook.Save 这样有十几个可选参数的东西编写一个包装器,情况会变得更糟。
我不知道可以替代一些乏味的结构,例如:
If a <> Null Then
If b <> Null Then
If c <> Null Then
If d <> Null Then
foo a, b, c, d
Else
foo a, b, c
End If
Else
If d <> Null Then
foo a, b, d
Else
foo a, b
End If
End If
Else
'... Etc ...
显然,对于每个附加的可选变量,嵌套 If 的数量和一般代码开销大约翻倍。
在 .NET 中有可以传入的类型 System.Type.Missing,让表达式更加简单。
就像在 C# 中一样,它可以像以下那样干净:
foo(a ?? Missing, b ?? Missing, c ?? Missing, d ?? Missing);
(这表示'如果 a 为空,则传入 Missing(或者可能在幕后重构调用本身),相当于不为可选参数 a 传入任何内容的调用,等等)
如果它被实现,在 VBA 中可以使用内联 iff ('IIF(boolean, true, false)') 实现等价物
是否有我缺少的 VBA 解决方法?
【问题讨论】:
-
你试过用
ParamArray吗? -
除非每个参数都有不同的类型(整数、布尔值、字符串等),你怎么想知道哪个参数是哪个?你想如何管理 Foo() 中的参数?
-
您已将每个参数定义为变体。因此,您可以使用
IsMissing(var)函数检查foo函数内部是否缺少参数。请参阅:msdn.microsoft.com/en-us/library/office/gg251721.aspx -
@MaciejLos 这是对外部函数的调用(即不是自定义函数)。我无法控制函数如何处理参数,只能控制传入的参数。丢失的参数很好,但如果指定了它,那么它不能是 null/nothing/任何我能想到的我可以使用的东西内联 if。
-
嗯 - 您可能可以通过使用按名称调用来解决问题
标签: vba