Private Sub Worksheet_Change(ByVal Target As Range)
Dim d As Object, tablo, ncol%, i&, x$, lig&, j%
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
With [A1].CurrentRegion
ncol = .Columns.Count
If ncol = 1 Then ncol = 2 'pour avoir au moins 2 cellules
tablo = .Resize(, ncol) 'matrice, plus rapide
For i = 2 To UBound(tablo)
x = tablo(i, 1)
If d.exists(x) Then
lig = d(x)
For j = 2 To ncol
tablo(i, j) = tablo(lig, j)
Next j
Else
d(x) = i 'mémorise la ligne
End If
Next i
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
Application.EnableEvents = False 'désactive les évènements
.Value = tablo
Application.EnableEvents = True 'réactive les évènements
End With
End Sub