'后2列中间无空列,所以输出从最外列+1开始,连续。
Option Explicit
Sub test()
Dim arr, i, cnt, j, n, brr, t, m, k, crr, dic, key, pos, ii, offset
Set dic = CreateObject("scripting.dictionary")
arr = Range("a1:r" & Cells(Rows.Count, "a").End(xlUp).Row)
If UBound(arr, 1) Mod 9 > 0 Then MsgBox "!": Exit Sub
cnt = UBound(arr, 1) \ 9: pos = Array(11, 17, 18)
ReDim brr(1 To cnt, 1 To 3), crr(1 To UBound(arr, 1), 1 To 1)
For i = 1 To UBound(arr, 1): dic(arr(i, 1)) = vbNullString: Next
For i = 1 To cnt: brr(i, 3) = i: Next
For ii = 0 To UBound(pos)
For Each key In dic.keys
For i = 1 To 9
n = 0
For j = 1 To cnt
If arr((j - 1) * 9 + i, 1) = Val(key) Then
n = n + 1: brr(n, 1) = arr((j - 1) * 9 + i, pos(ii))
End If
Next
For j = 1 To n - 1
For k = j + 1 To n
If brr(j, 1) > brr(k, 1) Then
t = brr(j, 1): brr(j, 1) = brr(k, 1): brr(k, 1) = t
t = brr(j, 3): brr(j, 3) = brr(k, 3): brr(k, 3) = t
End If
Next k, j
m = IIf(brr(1, 1) = vbNullString, 0, 1): brr(1, 2) = m
For j = 2 To n
If brr(j, 1) <> brr(j - 1, 1) Then m = m + 1
brr(j, 2) = m
Next
For j = 1 To n - 1
For k = j + 1 To n
If brr(j, 3) > brr(k, 3) Then
t = brr(j, 3): brr(j, 3) = brr(k, 3): brr(k, 3) = t
t = brr(j, 2): brr(j, 2) = brr(k, 2): brr(k, 2) = t
End If
Next k, j
n = 0
For j = 1 To cnt
If arr((j - 1) * 9 + i, 1) = Val(key) Then
n = n + 1
crr((j - 1) * 9 + i, 1) = brr(n, 2)
End If
Next j, i
Next
offset = offset + 1
Cells(1, pos(UBound(pos)) + offset + 1).Resize(UBound(crr, 1), 1) = crr
Next
End Sub |