Вы можете использовать VBA с объектом словаря, вы также можете использовать Power Query
aka Get&Transform
, который был доступен с Excel 2010
В 2016 году перейдите на вкладку «Данные» и выберите «Из таблицы / диапазона» (может отличаться в более ранних версиях).
Когда откроется PQ UI, выберите
- Группировка по: Оборудование
- Добавить пользовательский столбец, используя формулу:
=Table.Column([Grouped],"Properties")
- Извлечение значений с использованием пользовательского разделителя (перевод строки)
- Закрыть и загрузить
- В первый раз вам нужно установить свойство
Wrap Text
, а также автоматически подогнать столбец. После этого вы можете обновить запрос при необходимости, и эти свойства сохранятся.
Результаты по вашим данным:
![enter image description here](https://i.stack.imgur.com/ciWHX.png)
Или вы можете использовать VBA:
'Set Reference to Microsoft Scripting Runtime
' or use late-binding to `Scripting.Dictionary`
Option Explicit
Sub Connect()
Dim wsSrc As Worksheet, wsRes As Worksheet, rRes As Range
Dim vSrc As Variant, vRes As Variant
Dim D As Dictionary, COL As Collection, Key As Variant
Dim I As Long, V As Variant
Dim S As String
'Set source and results worksheets and ranges
Set wsSrc = Worksheets("Source")
Set wsRes = Worksheets("Results")
Set rRes = wsRes.Cells(1, 1)
'read source data into VBA array for fastest processing
With wsSrc
vSrc = .Range(.Cells(1, 1), .Cells(.Rows.Count, 2).End(xlUp))
End With
'Collect properties into dictionary item keyed to Equipment
Set D = New Dictionary
D.CompareMode = TextCompare
For I = 2 To UBound(vSrc, 1)
Key = vSrc(I, 1)
If Not D.Exists(Key) Then
Set COL = New Collection
COL.Add Item:=vSrc(I, 2)
D.Add Key:=Key, Item:=COL
Else
D(Key).Add vSrc(I, 2)
End If
Next I
'Write new stuff into VBA results array
ReDim vRes(0 To D.Count, 1 To 2)
'Headers
vRes(0, 1) = "Equipment"
vRes(0, 2) = "Properties"
'Populate
I = 0
For Each Key In D.Keys
I = I + 1
S = ""
vRes(I, 1) = Key
For Each V In D(Key) 'iterate through the collection
S = S & vbLf & V
Next V
vRes(I, 2) = Mid(S, 2) 'remove the leading LF
Next Key
'write results to worksheet and format
Application.ScreenUpdating = False
Set rRes = rRes.Resize(UBound(vRes, 1) + 1, UBound(vRes, 2))
With rRes
.EntireColumn.Clear
.Value = vRes
.ColumnWidth = 255
With .Rows(1)
.Font.Bold = True
.HorizontalAlignment = xlCenter
End With
.Columns(2).WrapText = True
.Columns(1).VerticalAlignment = xlCenter
.EntireColumn.AutoFit
.EntireRow.AutoFit
.Style = "Output"
End With
End Sub