Private Sub Worksheet_Change(ByVal Target As Range)
Dim cel As Range 'déclare la variable cel (Cellule)
Dim lst As String 'déclare la variable lst (LiSTe de validation)
If Target.Address <> "$D$1" Then Exit Sub 'si le changement a lieu ailleurs qu'en D1, sort de la procédure
'***************************
'Liste de validation entière
'***************************
If Target.Value = "" Then 'condition : si D1 est effacée
With Target.Offset(1, 0).Validation 'prend en compte la validation de donnée en D2
.Delete 'supprime l'ancienne éventuelle validation de données
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=" & Range("liste").Address 'ajoute la plage nommée "liste" comme liste de validation
End With 'fin de la prise en compte de la liste de validation en D2
Exit Sub 'sort de la procédure
End If 'fin de la condition
'***************************************
'Liste de validation correspondante à D1
'***************************************
For Each cel In Range("liste") 'boucle sur toutes les cellule de la plage nommée "liste"
'condition : si les premières lettres (converties en majuscules) de cel sont égales la valeur éditée en D1 (convertie en majuscule)
If UCase(Left(cel.Value, Len(Target.Value))) = UCase(Target.Value) Then
lst = IIf(lst = "", cel.Value & ",", lst & cel.Value & ",") 'définit la variable lst
End If 'fin de la condition
Next cel 'prochaine cellule de la boucle
If lst = "" Then Exit Sub 'si lst est vide, sort de la procédure
With Target.Offset(1, 0).Validation 'prend en compte la validation de donnée en D2
.Delete 'supprime l'ancienne éventuelle validation de données
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=lst 'ajoute la variable lst comme liste de validation
End With 'fin de la prise en compte de la liste de validation en D2
End Sub