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