Option Explicit
Sub test()
Dim arr, brr, crr, crr2, i&, j&, k, maxt, d As Object
Set d = CreateObject("Scripting.Dictionary")
arr = Sheets("用药收集表").Range("a2:e" & Cells(Rows.Count, 1).End(xlUp).Row)
ReDim brr(1 To UBound(arr) / 3, 1 To 5)
For i = 1 To UBound(arr)
If Not d.exists(arr(i, 1)) Then
k = k + 1
d(arr(i, 1)) = k
brr(d(arr(i, 1)), 1) = arr(i, 1)
brr(d(arr(i, 1)), 2) = 1
brr(d(arr(i, 1)), 3) = arr(i, 5)
Else
If brr(d(arr(i, 1)), 2) + 2 = UBound(brr, 2) Then
ReDim Preserve brr(1 To UBound(arr) / 3, 1 To brr(d(arr(i, 1)), 2) + 3)
End If
brr(d(arr(i, 1)), 2) = brr(d(arr(i, 1)), 2) + 1
brr(d(arr(i, 1)), 4 + brr(d(arr(i, 1)), 2) - 2) = arr(i, 5)
If brr(d(arr(i, 1)), 2) > brr(k - 1, 2) Then maxt = brr(d(arr(i, 1)), 2)
End If
Next
ReDim crr(1 To k, 1 To 12)
For i = 1 To UBound(crr)
crr(i, 1) = brr(i, 1)
crr(i, 9) = 1
If brr(i, 2) = 1 Then
crr(i, 2) = 1: crr(i, 3) = 0: crr(i, 4) = arr(UBound(arr), 5) - brr(i, 3): crr(i, 5) = 0: crr(i, 6) = 0: crr(i, 7) = 0
Else
For j = 3 To brr(i, 2) + 2
If j = brr(i, 2) + 2 Then
If brr(i, j) = brr(i, j - 1) Then
crr(i, 3) = brr(i, j) - brr(i, j - 1)
Else
crr(i, 3) = brr(i, j) - brr(i, j - 1) - 1
End If
If brr(i, j) = arr(UBound(arr), 5) Or brr(i, j) = brr(i, j - 1) Then
crr(i, 4) = arr(UBound(arr), 5) - brr(i, j)
Else
crr(i, 4) = arr(UBound(arr), 5) - brr(i, j) - 1
End If
If brr(i, j - 1) = crr(i, 10) Then
crr(i, 6) = crr(i, 5)
Else
crr(i, 6) = 1
End If
If brr(i, j) <> arr(UBound(arr), 5) Then
crr(i, 7) = 0
ElseIf brr(i, j) = arr(UBound(arr), 5) And brr(i, j) <> crr(i, 10) Then
crr(i, 7) = 1
Else
crr(i, 7) = crr(i, 5)
End If
End If
If j > brr(i, 2) + 1 Then Exit For
If (brr(i, j + 1) - brr(i, j) = 1 Or brr(i, j + 1) = brr(i, j)) And crr(i, 5) = Empty Then
crr(i, 11) = True
If crr(i, 11) And crr(i, 9) = 1 Then
crr(i, 12) = crr(i, 12) + 2
crr(i, 9) = crr(i, 9) + 1
crr(i, 5) = crr(i, 12)
crr(i, 10) = brr(i, j + 1)
End If
ElseIf (brr(i, j + 1) - brr(i, j) = 1 Or brr(i, j + 1) = brr(i, j)) And j = brr(i, 2) + 1 Then
crr(i, 2) = brr(i, j) - brr(i, j - 1) - 1
ElseIf brr(i, j + 1) - brr(i, j) > 1 And crr(i, 5) <> Empty Then
crr(i, 9) = 1: crr(i, 12) = Empty
ElseIf (brr(i, j + 1) - brr(i, j) = 1 Or brr(i, j + 1) = brr(i, j)) And crr(i, 5) <> Empty Then
crr(i, 11) = True
If crr(i, 11) And crr(i, 9) = 1 Then
crr(i, 12) = crr(i, 12) + 2
crr(i, 5) = crr(i, 12)
crr(i, 10) = brr(i, j + 1)
crr(i, 9) = crr(i, 9) + 1
ElseIf crr(i, 11) And crr(i, 9) > 1 Then
crr(i, 12) = crr(i, 12) + 1
If crr(i, 12) >= crr(i, 5) Then
crr(i, 5) = crr(i, 12)
crr(i, 10) = brr(i, j + 1)
End If
End If
ElseIf (brr(i, j + 1) - brr(i, j)) > 1 And crr(i, 2) = Empty Then
crr(i, 2) = brr(i, j + 1) - brr(i, j) - 1
ElseIf (brr(i, j + 1) - brr(i, j)) > 1 And crr(i, 2) <> Empty Then
If (brr(i, j + 1) - brr(i, j)) > crr(i, 2) Then
crr(i, 2) = brr(i, j + 1) - brr(i, j) - 1
End If
End If
Next
If crr(i, 5) = Empty Then crr(i, 5) = 0
End If
Next
Sheets("用药收集表").Range("j2").Resize(UBound(crr), 7) = crr
End Sub |