'可以指定多列,并对指定的多列分别设定升、降序,,,
'数据量大可以改用快排
Option Explicit
Sub test()
Dim arr, i, j, k, order
arr = Range("a1:b" & Cells(Rows.Count, "a").End(xlUp).Row + 1)
order = Array(1, True, 2, False) '指定列,A升序、B降序
Call dsort(arr, 1, UBound(arr, 1) - 1, order(0), order(1)) '对主列先排序
For i = 0 To UBound(order) - 2 Step 2
For j = 1 To UBound(arr, 1) - 1
For k = j To UBound(arr, 1) - 1
If arr(k, order(i)) <> arr(k + 1, order(i)) Then
If k > j Then Call dsort(arr, j, k, order(i + 2), order(i + 3))
j = k: Exit For
End If
Next k, j, i
[d1].Resize(UBound(arr, 1) - 1, UBound(arr, 2)) = arr
End Sub
Function dsort(arr, first, last, key, order)
Dim i, j, k, t
For i = first To last - 1
For j = i + 1 To last
If arr(i, key) < arr(j, key) Xor order Then
For k = 1 To UBound(arr, 2)
t = arr(i, k): arr(i, k) = arr(j, k): arr(j, k) = t
Next
End If
Next j, i
End Function |