Private Sub Worksheet_Change(ByVal Target As Range)
Dim xrg As Range, x, n&
Dim ts1 As ListObject, ts2 As ListObject
Set ts1 = Worksheets("Source").Range("a1").ListObject ' Tableau source situé en cellule A1 de la feuille "Source"
Set ts2 = Worksheets("Data").Range("c1").ListObject ' Tableau des couleurs situé en cellule C1 de la feuille "Data"
On Error Resume Next ' au cas où l'intersection serait vide
Set xrg = Intersect(ts1.DataBodyRange, Target) ' intersection de la plage du tableau source et des cellules modifiées
On Error GoTo 0 ' on intercepte à nouveau les erreurs
If xrg Is Nothing Then Exit Sub ' si l'intersection est vide, on quitte la procédure
For Each x In xrg ' Pour chaque cellule de l'intersection
' on recherche le rang du texte dans le tableau des couleurs (avec application.Match - correspond à un EQUIV() dans Excel)
' si le texte n'y est pas, on renvoie 0 (avec application.IfError - correspond à un SIERREUR() dans Excel)
n = Application.IfError(Application.Match(x.Value, ts2.DataBodyRange, 0), 0)
If n = 0 Then
' n = 0 => le texte est de la couleur par défaut du texte
x.Font.ColorIndex = xlColorIndexAutomatic
Else
' n <> 0 => la couleur du texte est celle de la cellule du texte dans le tableau des couleurs
x.Font.Color = ts2.DataBodyRange(n).Font.Color
End If
Next x