'la macro "_Change" de la feuille se déclanche à chaque changement d'une (ou plusieurs)
'cellule de la feuille.
'"Target" représente cette (ces) cellule(s) venant(s) de changer
Private Sub Worksheet_Change(ByVal Target As Range)
'si la cellule venant de changer n'est pas dans la zone couverte par la validation (A2:A20), quitter la macro
If Application.Intersect(Range("A2:A20"), Target(1, 1)) Is Nothing Then Exit Sub
'si la cellule qui vient de changer est vide, quitter la macro
If Target(1, 1).Text = "" Then Exit Sub
'si ce qui vient d'être saisi n'est pas dans "liste", quitter la macro
If Application.Evaluate("ISNA(MATCH(""" & Target(1, 1).Text & """,liste,0))") = True Then Exit Sub
'effacer la validation de la cellule
Target.Validation.Delete
'désactiver les évènements (affin de ne pas re-rentrer dans la macro)
Application.EnableEvents = False
'modifier la valeur de la cellule qui vient de changer (mettre l'équivalent du choix qui vient d'être fait)
Target.Value = Application.Evaluate("=INDEX(OFFSET(liste,,1),MATCH(""" & Target(1, 1).Text & """,liste,0))")
'réactiver les évènements
Application.EnableEvents = True
'remettre la validation de la cellule
Target.Validation.Add xlValidateList, , , "=liste"
End Sub