Private Sub Worksheet_Change(ByVal Target As Range) ' Procédure événementielle
'(le code s'exécutera chaque fois que le contenu d'une cellule de la feuille S16 est modifié)
'cette cellule modifiée correspond à la variable Target
'si la modif a lieu ailleurs qu'en colonne A ou sur la ligne 1, le code n'est pas exécuté
If Target.Column > 1 Or Target.Row < 2 Then Exit Sub
'si le contenu de la cellule modifiée a été effacé, on efface le contenu de la cellule à sa droite et on "sort"
If Target = "" Then Target.Offset(0, 1) = "": Exit Sub
'on crée une instance d'un objet dictionary
Set liste = CreateObject("scripting.dictionary")
With Sheets("GAT")
'on copie dans un tableau en mémoire, le contenu de la zone "autour" de la cellule A1 en feuille GAT
tablo = .[A1].CurrentRegion
'on parcourt ce tableau, de son premier élément au dernier
For i = 1 To UBound(tablo)
'on crée une entrée (key) dans le dico pour chaque CMD la valeur associée (item) est la concaténation
'de chaque "couleur" trouvée en colonne B pour le même CMD
liste(tablo(i, 1)) = liste(tablo(i, 1)) & " - " & tablo(i, 2)
Next i
End With
'si le dico ne contient pas la clé encodée en feuille S16, dans la cellule modifiée,
'une erreur serait générée par le Mid ci-dessous (équivalent de STXT)
On Error Resume Next
'l'item du dico, identifié par cette clé (Target) contient une chaîne de caractères qui se commence par
'la séquence espace-tiret-espace; on supprime donc les 3 premiers caractères et on inscrit le résultat
'dans la cellule à droite
Target.Offset(0, 1) = Mid(liste(Target.Value), 4, Len(liste(Target.Value)) - 3)
End Sub