分享

VBA二维数组排序

 药都之乡 2013-08-28
Sub tmp()
    Dim tmp
    tmp = [A1:C10]
    tmp = ArraySort(tmp, 1, DESCENDING_ORDER, 3, ASCENDING_ORDER)
    [I1].Resize(UBound(tmp, 1), UBound(tmp, 2)) = tmp
End Sub

Function ArraySort(tmp, ByVal Key1 As Integer, ByVal Order1 As eOrderType, ByVal Key2 As Integer, ByVal Order2 As eOrderType)
    Dim i As Integer, j As Integer, Nm As Integer, Nsorted As Integer, r As Integer, m As Double
    Dim tmp0, tmp1
    ReDim tmp0(LBound(tmp, 1) To UBound(tmp, 1), LBound(tmp, 2) To UBound(tmp, 2))
    ReDim tmp1(LBound(tmp, 1) To UBound(tmp, 1), LBound(tmp, 2) To UBound(tmp, 2))
    On Error Resume Next
    Nsorted = 0
    If Order1 = ASCENDING_ORDER Then
        Do While Nsorted < (UBound(tmp, 1) - LBound(tmp, 1) + 1)
            m = Application.Min(Application.Index(tmp, , Key1))
            Nm = 0
            For i = LBound(tmp, 1) To UBound(tmp, 1)
                If tmp(i, Key1) = m Then
                    Nm = Nm + 1
                    For j = LBound(tmp, 2) To UBound(tmp, 2)
                        tmp0(Nm, j) = tmp(i, j)
                        tmp(i, j) = ""
                    Next j
                End If
            Next i
            For i = 1 To Nm
                Nsorted = Nsorted + 1
                If Order2 = ASCENDING_ORDER Then
                    m = Application.Min(Application.Index(tmp0, , Key2))
                ElseIf Order2 = DESCENDING_ORDER Then
                    m = Application.Max(Application.Index(tmp0, , Key2))
                End If
                r = Application.WorksheetFunction.Match(m, Application.Index(tmp0, , Key2), 0)
                For j = LBound(tmp, 2) To UBound(tmp, 2)
                    tmp1(Nsorted, j) = tmp0(r, j)
                    tmp0(r, j) = ""
                Next j
            Next i
        Loop
    ElseIf Order1 = DESCENDING_ORDER Then
        Do While Nsorted < (UBound(tmp, 1) - LBound(tmp, 1) + 1)
            m = Application.Max(Application.Index(tmp, , Key1))
            Nm = 0
            For i = LBound(tmp, 1) To UBound(tmp, 1)
                If tmp(i, Key1) = m Then
                    Nm = Nm + 1
                    For j = LBound(tmp, 2) To UBound(tmp, 2)
                        tmp0(Nm, j) = tmp(i, j)
                        tmp(i, j) = ""
                    Next j
                End If
            Next i
            For i = 1 To Nm
                Nsorted = Nsorted + 1
                If Order2 = ASCENDING_ORDER Then
                    m = Application.Min(Application.Index(tmp0, , Key2))
                ElseIf Order2 = DESCENDING_ORDER Then
                    m = Application.Max(Application.Index(tmp0, , Key2))
                End If
                r = Application.WorksheetFunction.Match(m, Application.Index(tmp0, , Key2), 0)
                For j = LBound(tmp, 2) To UBound(tmp, 2)
                    tmp1(Nsorted, j) = tmp0(r, j)
                    tmp0(r, j) = ""
                Next j
            Next i
        Loop
    End If
    ArraySort = tmp1
End Function

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多