Sub Reformat()
Dim arr, d1, d2, arrOut(), r As Long, ub As Long
Dim r2 As Long, c As Long
arr = Selection.Value 'select the source data first
ub = UBound(arr, 1)
Set d1 = distinct(arr, 1)
Set d2 = distinct(arr, 2)
ReDim arrOut(1 To d1.Count, 1 To 1 + (d2.Count * 2))
For r = 1 To ub
r2 = d1(arr(r, 1))
c = 2 + (d2(arr(r, 2)) - 1) * 2
arrOut(r2, 1) = arr(r, 1)
arrOut(r2, c) = arr(r, 2)
arrOut(r2, c + 1) = arr(r, 3)
Next r
With ThisWorkbook.Sheets("out")
.Range("A2").Resize(UBound(arrOut, 1), UBound(arrOut, 2)).Value = arrOut
End With
End Sub
'get all distinct values in a "column" of a 2-d array
Function distinct(arr As Variant, colNum) As Object
Dim r As Long, ub As Long, i As Long, d
Set d = CreateObject("scripting.dictionary")
ub = UBound(arr, 1)
i = 1
For r = 1 To ub
If Not d.exists(arr(r, colNum)) Then
d.Add arr(r, colNum), i
i = i + 1
End If
Next r
Set distinct = d
End Function
Изменено ваша маркировка ... «pivot» - это то, что вы ищете. есть ли какой-либо верхний предел для количества предметов, которые может иметь M. – Twelfth
Спасибо за ваш комментарий. Как я уже говорил, это большая группа. Если вы запрашиваете количество строк в первом формате, число может превышать 10 000. Если во втором формате количество строк будет больше 800. – inori