Private Sub Worksheet_Change(ByVal Target As Range)
Dim o As Worksheet 'déclare la variable o (Onglet)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim pl As Range 'déclare la variable pl (PLage)
Dim no As Byte 'déclare la variable no (Nombre d'Occurrences)
Dim r As Range 'déclare la variable r (Recherche)
Dim pa As String 'déclare la variable pa (Première Adresse)
Dim tbo() As String 'déclare la variable tbo (TaBleau des Occurrences)
Dim x As Byte 'déclare la variable x (incrément)
Dim v As String 'déclare la variable v (Validation)
If Target.Column <> 9 Then Exit Sub 'si le changement a lieu ailleurs qu'en colonne 9 (I), sort de la procédure
'si la cellule est effacée, supprime la liste de validation, efface le contenu de la cellule de la colonne J
If Target.Value = "" Then Target.Offset(0, 1).Validation.Delete: Target.Offset(0, 1).ClearContents: Exit Sub
Set o = Sheets("Feuil2") 'définit la variable o
Set pl = o.Range("A1:A" & o.Cells(Application.Rows.Count, 1).End(xlUp).Row) 'définit la plage pl
no = Application.WorksheetFunction.CountIf(pl, Target.Value) 'définit la variable no
If no > 1 Then 'condition 1 : si il existe plus d'une occurence (plusieurs villes ayant le même code)
Set r = pl.Find(Target.Value, , xlValues, xlWhole) 'définit la variable
If Not r Is Nothing Then 'condition 2 : si il existe au moins une occurrence trouvée
pa = r.Address 'définit la première adresse trouvée
Do 'exécute
ReDim Preserve tbo(x) 'redimentionne le tableau des occurrences tbo
tbo(x) = r.Offset(0, 1).Value 'attribue une variable indéxée au tableau tbo
v = IIf(v = "", tbo(0), v & "," & tbo(x)) 'définit la variable v
x = x + 1 'incrémente x
Set r = pl.FindNext(r) 'redéfinit r (recherche suivante)
Loop While Not r Is Nothing And r.Address <> pa 'boucle tant qu'il existe des occurrences ailleurs qu'en pa
End If 'fin de la condition 2
With Target.Offset(0, 1).Validation 'prend en compte la validation de la cellule de la colonne J
.Delete 'supprime
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:=v 'ajoute une liste de validation
End With 'fin de la prise en compte de ...
Else 'sinon (condition 1)
On Error Resume Next 'gestion des erreurs (si une erreur est générée, passe à la ligne suivante)
'place en colonne J la ville correspondante (si aucune ville ne correspond au code une erreur est générée)
Target.Offset(0, 1).Value = pl.Find(Target.Value, , xlValues, xlWhole).Offset(0, 1).Value
If Err <> 0 Then 'Condition 3 : si une erreur a été générée
Err = 0 'supprime l'erreur
MsgBox "Numéro de code invalide !" 'message
Target.ClearContents 'efface le contenu de la celluel
Target.Select 'sélectionne la cellule
Exit Sub 'sort de la prcédure
End If 'fin de la condition 3
End If 'fin de la condition 1
Target.Offset(0, 1).Select 'sélectionne la cellule de la colonne J
End Sub