将空/可选参数传递给VBA函数

Ale*_*der 5 excel vba excel-vba

我的印象是,如果已使用一些可选参数定义了函数,则可以通过Nothing它,并且将其与“完全不传递任何东西”一样对待。

但是,我无法做到这一点。如果所有“ fds ...”变量都不为空,则以下代码片段可以很好地运行,但是如果有任何参数,则抛出“无效的过程调用或参数”Nothing

Dim fdsSortOrders(2) As Variant
Dim fdsKey1 As Variant
Dim fdsKey2 As Variant
Dim fdsKey3 As Variant

' ...skipped...

Call loFinalReport.DataBodyRange.Sort( _
    Header:=xlYes, _
    Key1:=fdsKey1, Order1:=fdsSortOrders(0), _
    Key2:=fdsKey2, Order2:=fdsSortOrders(1), _
    Key3:=fdsKey3, Order3:=fdsSortOrders(2) _
)
Run Code Online (Sandbox Code Playgroud)

有没有办法传递Optional参数,或者我应该制作难看的复制粘贴代码(“ if fdskey2 is nothing and fdskey3 is Nothing Then SortUsingKey1Only)?

更新

这将起作用,因为Key2 / Key3和Order2 / Order3是可选的,但是我不想编写过程调用的三个版本:

Call loFinalReport.DataBodyRange.Sort( _
    Header:=xlYes, _
    Key1:=fdsKey1, Order1:=fdsSortOrders(0) _
)
Run Code Online (Sandbox Code Playgroud)

Ant*_*ert 2

以下是带有可选参数的函数头示例:

Function FunctionName(Optional ByVal X As String = "", Optional ByVal Y As Boolean = True)
Run Code Online (Sandbox Code Playgroud)

您需要省略参数传递,以便默认值生效。
在您的示例中,您的默认值将为 和fdsKey1fdsSortOrders(0)因此它将按相同的键和相同的顺序对其进行排序。


除了这个之外想不出其他任何东西:

Call loFinalReport.DataBodyRange.Sort( _
    Header:=xlYes, _
    Key1:=fdsKey1, Order1:=fdsSortOrders(0), _
    Key2:=IIf(IsNothing(fdsKey2), fdsKey1, fdsKey2), _
    Order2:=IIf(IsNothing(fdsSortOrders(1)), fdsSortOrders(0), fdsSortOrders(1)), _
    Key3:=IIf(IsNothing(fdsKey3), fdsKey1, fdsKey3), _
    Order3:=IIf(IsNothing(fdsSortOrders(2)), fdsSortOrders(0), fdsSortOrders(2)) _
)
Run Code Online (Sandbox Code Playgroud)

请注意,至少fdsKey1并且fdsSortOrders(0)应该......好吧,某事。
或者,您可以为所有 3 个键和订单设置此条件并设置默认值。
按具有相同值的多个键对范围进行排序不应以任何方式影响排序。