Private Sub Worksheet_Change(ByVal Target As Range)
Select Case True
Case Target.Count > 1 ' pas de contrôle si plus d'une cellule modifiée
Case Target.Column <> Columns("a").Column ' la colonne ne correspond pas à celle à contrôler
Case Target.Value = vbNullString ' la cellule est vide
Case Else
Set R = Columns(Target.Column).Find(Target.Value, Target, xlValues, xlWhole)
Select Case True
Case R Is Nothing ' La valeur n'a pas été trouvée
Case R.Address = Target.Address ' la cellule trouvée est celle qui a été saisie
Case Else
MsgBox "La cellule " & R.Address & " contient déjà cette valeur", vbCritical
Application.Undo
End Select
End Select
End Sub