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)
以下是带有可选参数的函数头示例:
Function FunctionName(Optional ByVal X As String = "", Optional ByVal Y As Boolean = True)
Run Code Online (Sandbox Code Playgroud)
您需要省略参数传递,以便默认值生效。
在您的示例中,您的默认值将为 和fdsKey1
,fdsSortOrders(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 个键和订单设置此条件并设置默认值。
按具有相同值的多个键对范围进行排序不应以任何方式影响排序。