Arrays VBA排序多列多键数组
我想要一个可以对多个列和多个键数组进行排序的函数,并且它应该是动态的,即使是以牺牲性能为代价 此函数应具有3个参数:Arrays VBA排序多列多键数组,arrays,excel,vba,sorting,Arrays,Excel,Vba,Sorting,我想要一个可以对多个列和多个键数组进行排序的函数,并且它应该是动态的,即使是以牺牲性能为代价 此函数应具有3个参数: 我们要排序的二维数组 我们要排序的“列键”数字数组 一个布尔数组,True=升序,False=降序 最后,这个函数应该返回排序后的数组 例如: Dim SortedArray as Variant SortedArray = MySuperSortArrayFnc(MyArr, Array(4,1,7), Array(True, False, False)) MyArr=我要
Dim SortedArray as Variant
SortedArray = MySuperSortArrayFnc(MyArr, Array(4,1,7), Array(True, False, False))
MyArr=我要排序的二维源数组
数组(4,1,7)=排序的顺序/级别
Array(True、False、False)=它应该与前一个数组参数平行,因此第4列为升序,第1列为降序,第7列为降序
注:
我解决了它,如果将来有人需要它,下面是代码:
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
公共函数SortArr2DM(Arr2D作为变量,acolar作为变量,IsAscendingArr作为变量)作为变量
我想我会坚持多久
Dim J尽可能长
尺寸C与长度相同
作为字节的Dim X
'
Dim aCol尽可能长
Dim TMP值作为变量
Dim tmpArr作为变体
Dim IsSwitch作为布尔值
Dim IsAscending为布尔值
tmpArr=Arr2D
对于I=LBound(tmpArr)到UBound(tmpArr)
对于J=I+1至UBound(tmpArr)
对于X=0至UBound(acolar)
aCol=acolar(X)
IsAscending=IsAscendingArr(X)
如果我在撒谎的话
如果tmpArr(I,aCol)>tmpArr(J,aCol),那么
IsSwitch=True
退出
ElseIf tmpArr(I,aCol)tmpArr(J,aCol)然后
IsSwitch=False
退出
如果结束
如果结束
下一个
如果是开关的话
对于C=LBound(tmpArr,2)到UBound(tmpArr,2)
TmpValue=tmpArr(I,C)
tmpArr(I,C)=tmpArr(J,C)
tmpArr(J,C)=TmpValue
下一个
IsSwitch=False
如果结束
下一个
下一个
SORTAR2dm=tmpArr
端函数
你不能只包装排序函数吗?@JohnnieL-不,它应该是排序函数,不使用excel对象