Arrays VBA排序多列多键数组

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=我要

我想要一个可以对多个列和多个键数组进行排序的函数,并且它应该是动态的,即使是以牺牲性能为代价

此函数应具有3个参数:

  • 我们要排序的二维数组
  • 我们要排序的“列键”数字数组
  • 一个布尔数组,True=升序,False=降序
  • 最后,这个函数应该返回排序后的数组

    例如:

    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列为降序

    注:

  • 该函数不允许使用工作表,它应该是纯VBA逻辑
  • 无需处理单个阵列列场景,只需处理多个阵列列
  • 如果“MyArr”参数不是空的,则无需对输入(参数)进行验证
  • 空值或任何其他值的排序顺序应与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
    
    公共函数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对象