Function Concatene(critere, colrecherche As Range, colconcat As Range, separ As String) As String
Dim d As Object, i&
Set colrecherche = Intersect(colrecherche.EntireColumn, colrecherche.Parent.UsedRange.EntireRow)
Set colconcat = Intersect(colconcat.EntireColumn, colconcat.Parent.UsedRange.EntireRow)
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To colrecherche.Rows.Count
If colrecherche(i) = critere Then
If colconcat(i) <> "" And Not d.exists(colconcat(i).Value) Then
d(colconcat(i).Value) = ""
Concatene = Concatene & separ & colconcat(i)
End If
End If
Next
Concatene = Mid(Concatene, Len(separ) + 1)
End Function
Function Concatene(critere, colrecherche As Range, colconcat As Range, separ As String) As String
Dim R As Range, tablo1, tablo2, d As Object, i&, x$
Set R = colrecherche.Parent.UsedRange.EntireRow
tablo1 = Intersect(colrecherche.EntireColumn, R).Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
tablo2 = Intersect(colconcat.EntireColumn, R).Resize(, 2) 'matrice, plus rapide, au moins 2 éléments
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(tablo1)
If tablo1(i, 1) = critere Then
x = tablo2(i, 1)
If x <> "" And Not d.exists(x) Then
d(x) = ""
Concatene = Concatene & separ & x
End If
End If
Next
Concatene = Mid(Concatene, Len(separ) + 1)
End Function