我的印象是,如果已经使用某些可选参数定义了一个函数,那么您可以传递Nothing
,它将以与#34相同的方式处理;不会传递任何东西"。
然而,我无法做到这一点。如果所有" 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) _
)
有没有办法传递可选参数,还是应该制作难看的复制粘贴代码(" 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) _
)
答案 0 :(得分:2)
以下是带有可选参数的函数头的示例:
Function FunctionName(Optional ByVal X As String = "", Optional ByVal Y As Boolean = True)
您需要省略参数传递,因此默认值将启动
在您的示例中,您的默认值为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)) _
)
请注意,至少fdsKey1
和fdsSortOrders(0)
应该......好吧
或者,您可以为所有3个键和订单设置此条件并设置默认值
使用具有相同值的多个键排序范围不应以任何方式影响排序。
答案 1 :(得分:2)
使用IsMissing
函数运行使用Optional Variant的快速测试表明Nothing
与Missing
不同:
Option Explicit
Private Function IsItMissing(Optional vTMP As Variant) As Variant
IsItMissing = CVErr(xlErrNA)
On Error GoTo FuncErr
IsItMissing = IsMissing(vTMP)
FuncErr:
End Function
Public Sub TestValues()
MsgBox IsItMissing("Nope") 'False
MsgBox IsItMissing 'True
MsgBox IsItMissing(Nothing) 'False
End Sub
问题是Nothing
是一个特殊对象,而不是实际上没有什么'。这就像空白单元格与没有数据的单元格之间的差异(例如=""
)
我怀疑您希望将If
语句与Is Nothing
链接起来以创建您的排序:
If fdsKey2 Is Nothing Then
loFinalReport.DataBodyRange.Sort Header:=xlYes, _
Key1:=fdsKey1, Order1:=fdsSortOrders(0)
ElseIf fsdKey3 Is Nothing Then
loFinalReport.DataBodyRange.Sort Header:=xlYes, _
Key1:=fdsKey1, Order1:=fdsSortOrders(0), _
Key2:=fdsKey2, Order2:=fdsSortOrders(1)
Else
loFinalReport.DataBodyRange.Sort Header:=xlYes, _
Key1:=fdsKey1, Order1:=fdsSortOrders(0), _
Key2:=fdsKey2, Order2:=fdsSortOrders(1), _
Key3:=fdsKey3, Order3:=fdsSortOrders(2)
End If
{编辑:在评论中进行讨论} 这是一个使用2个数组来计算出哪些键(如果有的话)不是Nothing的函数:
Private Function SortNothing(Target As Range, Optional Key1 As Variant, Optional Order1 As XlSortOrder = xlAscending, Optional Key2 As Variant, Optional Order2 As XlSortOrder = xlAscending, Optional Key3 As Variant, Optional Order3 As XlSortOrder = xlAscending) As Boolean
Dim iArr As Integer, aKeys(1 To 3) As Variant, aOrders(1 To 3) As XlSortOrder
iArr = 0 'This pointer will track how many non-Nothing Keys we have
SortNothing = False
On Error GoTo FuncErr
If Not IsMissing(Key1) Then
If Not (Key1 Is Nothing) Then
iArr = iArr + 1
aKeys(iArr) = Key1
aOrders(iArr) = Order1
End If
End If
If Not IsMissing(Key2) Then
If Not (Key2 Is Nothing) Then
iArr = iArr + 1
aKeys(iArr) = Key2
aOrders(iArr) = Order2
End If
End If
If Not IsMissing(Key3) Then
If Not (Key3 Is Nothing) Then
iArr = iArr + 1
aKeys(iArr) = Key3
aOrders(iArr) = Order3
End If
End If
Select Case iArr
Case 3:
Target.Sort Key1:=aKeys(1), Order1:=aOrders(1), Key2:=aKeys(2), Order2:=aOrders(2), Key3:=aKeys(3), Order3:=aOrders(3), Header:=xlYes
Case 2:
Target.Sort Key1:=aKeys(1), Order1:=aOrders(1), Key2:=aKeys(2), Order2:=aOrders(2), Header:=xlYes
Case 1:
Target.Sort Key1:=aKeys(1), Order1:=aOrders(1), Header:=xlYes
End Select
SortNothing = True
FuncErr:
End Function
答案 2 :(得分:0)
Private Sub PassingVariables(ByRef strNotOptionalText As String, _
Optional ByRef strOptionalText As String = "Random or Null", _
Optional ByRef wbMainOptional As Workbook = Nothing)
' Statements
End Sub
Public Sub CallingSub()
' Here I'm passing just the required parameter (strNotOptionalText).
' strOptionalText will be "Random or Null" as default and wbMainOptional will be Nothing as default.
Call PassingVariables("Name")
' Here I'm actually passing personalized variabled and not using the default Optionals.
Call PassingVariables("Name", "My Personlalized Text", ThisWorkbook)
End Sub
这里有一个例子评论了如何使用代码可选参数。务必记住将可选参数放在所需参数之后。