'手工排序也用不了几秒。用冒泡按字符排序模拟了一个
Option Explicit
Sub test()
Dim arr, i, j, k, p, pos, order
pos = Array(7, 9, 8, 4) '数组中待排序的列
order = Array(1, 1, 1, 1) '对应的升降控制(1升序)
arr = [a1].CurrentRegion.Offset(1).Resize(, 9)
For i = 1 To UBound(arr, 1) - 1 '年龄预处理为字符类型
arr(i, 4) = Format(arr(i, 4), "000")
Next
Call bsort(arr, 1, UBound(arr, 1) - 1, 1, UBound(arr, 2), pos(0), order(0))
For i = 1 To UBound(pos)
p = 0
For j = 1 To UBound(arr, 1) - 1
For k = 0 To i - 1
If arr(j, pos(k)) <> arr(j + 1, pos(k)) Then
If j > p + 1 Then Call bsort(arr, p + 1, j, 1, UBound(arr, 2), pos(i), order(i))
p = j
End If
Next
Next
Next
[u2].Resize(UBound(arr, 1) - 1, UBound(arr, 2)) = arr
End Sub
Function bsort(arr, first, last, left, right, key, order)
Dim i As Long, j As Long, k As Long, t, flag As Boolean
For i = first To last - 1
For j = first To last + first - 1 - i
If arr(j, key) <> arr(j + 1, key) Then
If StrComp(arr(j, key), arr(j + 1, key), vbTextCompare) = order Then
flag = True
For k = left To right
t = arr(j, k): arr(j, k) = arr(j + 1, k): arr(j + 1, k) = t
Next
End If
End If
Next
If flag = False Then Exit For Else flag = False
Next
End Function |