Private Sub Worksheet_Change(ByVal Target As Range)
Dim tablo, d As Object, i&, s, j%
With [A1].CurrentRegion
tablo = .Resize(, 4) 'matrice, plus rapide
'---liste des libellés---:end
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
For i = 2 To UBound(tablo)
If tablo(i, 3) <> "" Then d(tablo(i, 3)) = tablo(i, 4) 'mémorise le numéro
Next
'---analyse des mots des relevés---
For i = 2 To UBound(tablo)
s = Split(tablo(i, 1))
tablo(i, 2) = "" 'RAZ
For j = 0 To UBound(s)
If d.exists(s(j)) Then tablo(i, 2) = d(s(j)): Exit For
Next j, i
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
Application.EnableEvents = False 'désactive les évènements
.Columns(2) = Application.Index(tablo, , 2)
Application.EnableEvents = True 'réactive les évènements
End With
End Sub