在VBA中对多列多键数组进行排序



我想创建一个函数,可以排序数组与多个列(和多个升序/降序键)。这个函数需要是动态的(即使是以性能为代价)。

这个函数应该有3个参数:

  1. 要排序的二维数组
  2. 包含"列键"的数组。要排序的数字。
  3. 一个布尔数组,True =升序,False =降序

最后这个函数应该返回排序后的数组。

例如:

Dim SortedArray as Variant
SortedArray = MySuperSortArrayFnc(MyArr, Array(4,1,7), Array(True, False, False))

MyArr =我想要排序的2维源数组。

Array(4,1,7) =排序的顺序/级别。

Array(True, False, False) =它应该与前一个数组参数平行,因此第4列是升序,第1列是降序,第7列是降序。

指出:

  1. 函数不允许使用工作表,它应该是纯VBA逻辑。
  2. 无需处理单列数组场景,只需处理多列数组。
  3. 不需要处理输入(参数)的验证,如" myar& quot;参数不为空。
  4. 空值或任何其他值应该排序顺序像excel排序顺序,如果excel发送空值底部,它对我很好。

我解决了它,如果将来有人需要它,这里是代码:

Public Function SortArr2DM(Arr2D As Variant, aColArr As Variant, IsAscendingArr As Variant) As Variant
Dim I As Long
Dim J As Long
Dim C As Long
Dim X As Byte
'
Dim aCol As Long
Dim TmpValue As Variant
Dim tmpArr As Variant
Dim IsSwitch As Boolean
Dim IsAscending As Boolean

tmpArr = Arr2D

For I = LBound(tmpArr) To UBound(tmpArr)
For J = I + 1 To UBound(tmpArr)

For X = 0 To UBound(aColArr)
aCol = aColArr(X)
IsAscending = IsAscendingArr(X)

If IsAscending Then
If tmpArr(I, aCol) > tmpArr(J, aCol) Then
IsSwitch = True
Exit For
ElseIf tmpArr(I, aCol) < tmpArr(J, aCol) Then
IsSwitch = False
Exit For
End If
Else
If tmpArr(I, aCol) < tmpArr(J, aCol) Then
IsSwitch = True
Exit For
ElseIf tmpArr(I, aCol) > tmpArr(J, aCol) Then
IsSwitch = False
Exit For
End If
End If

Next

If IsSwitch Then
For C = LBound(tmpArr, 2) To UBound(tmpArr, 2)
TmpValue = tmpArr(I, C)
tmpArr(I, C) = tmpArr(J, C)
tmpArr(J, C) = TmpValue
Next
IsSwitch = False
End If

Next
Next

SortArr2DM = tmpArr
End Function

最新更新