Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim DL As Integer 'déclare la variable DL (Dernière Ligne)
Dim PL As Range 'déclare la variable PL (PLage)
Dim D As Object 'déclare la variable D (DIctionnaire)
Dim CEL As Range 'déclare la variable CEL (CELlule)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
If Target.Column <> 2 Then Exit Sub 'si le changement a lieu aillerus que dans la colonne 2 (=B), sort de la procédure
DL = Cells(Application.Rows.Count, 2).End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne 2 (=B)
Set PL = Range("B2:B" & DL) 'définit la plage PL
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For Each CEL In PL 'boucle sur toutes les cellules CEL de la plage PL
If CEL.Value <> "" Then D(CEL.Value) = "" 'si la cellule n'est pas vide, alimente le dictionnaire DL
Next CEL 'prichaine cellule de la boucle
TMP = D.keys 'récupère dans le tableau temporaire TMP, les éléments uniques de la liste (sans doublon)
Range("E2").Resize(D.Count) = Application.Transpose(TMP) 'renvoie la liste des élément unique à partir de la cellule E2
'le reste est fait par la plage nommée "Liste" créée avec la formule : =DECALER(Feuil1!$E$2;;;NBVAL(Feuil1!$E:$E))
'via le Gestionnaire de noms. Voir "Gestionnaire de noms" dans le bandeau "Formules"
'la cellule H4 a la plage dynamique nommée "Liste" comme liste de validation de données...
'Chaque fois qu'un nom de faisant pas partie de la liste est tapé, il est automatiquement rajouté à la liste...
'en revanche, pour supprimer un nom de la liste déroulante, il faut le supprimer dans la plage de la colonne E
End Sub