使用可选变体运行快速测试,使用IsMissing 函数显示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 是一个特殊对象,而不是实际上是“无”。这就像 Excel 中空白单元格和没有数据的单元格之间的区别(例如 ="")
我怀疑您可能希望将 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
{编辑:在 cmets 中讨论之后} 这是一个函数,它使用 2 个数组来计算出哪个键(如果有)不是 Nothing: p>
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