Я предполагаю, что вы хотите сделать это в коде, основанном на теге excel-vba в вашем посте.
Я также предполагаю, что данные отсортированы по имени, или вы согласны с сортировкой по имени до выполнения кода.
Источник находится на листе 1, цель - на листе 2. Код в Excel VBA.Я проверил с вашими примерами данных, поместив эту подпрограмму в раздел ThisWorkbook в коде Excel и нажав кнопку воспроизведения.
Целевой заголовок каждый раз переписывается, что не идеально с точки зрения производительности, но я не думаю, что это проблема в противном случае.Вы можете заключить его в оператор if, который проверяет целевой столбец index = 2, если это становится проблемой.
Sub ColumnsToRows()
Dim rowHeading
Dim previousRowHeading
Dim sourceRowIndex
Dim targetRowIndex
Dim targetColumnIndex
sourceRowIndex = 1
targetRowIndex = 1
targetColumnIndex = 2
rowHeading = Sheet1.Cells(sourceRowIndex, 1)
previousRowHeading = rowHeading
While Not rowHeading = ""
If Not previousRowHeading = rowHeading Then
targetRowIndex = targetRowIndex + 1
targetColumnIndex = 2
End If
Sheet2.Cells(targetRowIndex, 1) = rowHeading
Sheet2.Cells(targetRowIndex, targetColumnIndex) = Sheet1.Cells(sourceRowIndex, 2)
previousRowHeading = rowHeading
sourceRowIndex = sourceRowIndex + 1
targetColumnIndex = targetColumnIndex + 1
rowHeading = Sheet1.Cells(sourceRowIndex, 1)
Wend
End Sub
Я разработчик, а не гуру Excel.Там может быть какая-то функция Excel, сводная таблица или другая магия Excel, которая делает это автоматически.