Dim tablo, resu(), d As Object, manag 'mémorise les variables
Sub Liste()
Dim i&, n&, nn&, s
tablo = [A2].CurrentRegion.Resize(, 3) 'matrice, plus rapide
ReDim resu(1 To UBound(tablo), 1 To 2)
Set d = CreateObject("Scripting.Dictionary")
For i = 3 To UBound(tablo)
manag = tablo(i, 1)
If d.exists(manag) Then
n = d(manag)
resu(n, 2) = resu(n, 2) & Chr(1) & tablo(i, 3)
Else
nn = nn + 1
d(manag) = nn 'mémorise la ligne
resu(nn, 1) = manag
resu(nn, 2) = tablo(i, 3)
End If
Recursive tablo(i, 2)
Next i
'---restitution---
Application.ScreenUpdating = False
With [E4]
If nn Then
.Resize(nn, 2) = resu
.Resize(nn, 2).Sort .Cells, xlAscending, Header:=xlNo 'tri sur 1 colonne
For i = 1 To nn
s = Split(.Cells(i, 2), Chr(1))
tri s, 0, UBound(s)
.Cells(i, 2) = Join(s, ", ") 'séparateur modifiable
Next i
End If
.Offset(nn).Resize(Rows.Count - nn - .Row + 1, 2).ClearContents 'RAZ en dessous
.CurrentRegion.Columns.AutoFit 'ajustement largeurs
End With
End Sub
Sub Recursive(colab)
Dim n&, i&
n = d(manag)
For i = 3 To UBound(tablo)
If tablo(i, 1) = colab Then
resu(n, 2) = resu(n, 2) & Chr(1) & tablo(i, 3)
Recursive tablo(i, 2)
End If
Next i
End Sub
Sub tri(a, gauc, droi) ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
Do While a(g) < ref: g = g + 1: Loop
Do While ref < a(d): d = d - 1: Loop
If g <= d Then
temp = a(g): a(g) = a(d): a(d) = temp
g = g + 1: d = d - 1
End If
Loop While g <= d
If g < droi Then Call tri(a, g, droi)
If gauc < d Then Call tri(a, gauc, d)
End Sub