1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| Private Sub Worksheet_Change(ByVal Target As Range)
'l'événement Change se produit en quittant la cellule que l'on vient de renseigner
Dim firstAddress As String, c As Range
'Target correspond à la cellule active avant d'en sortir
'si la cellule est vide, on sort sans rien faire
If Target = "" Then Exit Sub
'La recherche de la donnée saisie se fait dans la colonne de Target
With ActiveSheet.Columns(Target.Column)
'Si la donnée est trouvée, c la contient
'Cette donnée, c'est celle qui se trouve dans la cellule active (Target)... donc
Set c = .Find(Target.Value, LookIn:=xlValues)
'c n'est pas "rien" si la donnée a été trouvée
If Not c Is Nothing Then
'on mémorise l'adresse de la donnée trouvée afin d'éviter une boucle sans fin
firstAddress = c.Address
'La donnée existe forcément puisqu'on vient de la saisir
'mais on ignore si ce n'est pas une donnée pré-existante
Do
'Donc, si l'adresse de cette donnée est différente de celle de Target
'on sait que target est un doublon
If c.Address <> Target.Address Then
MsgBox "Le cadre " & Target & " existe déjà"
'On retourne alors sur Target
Target.Select
'... et on efface la donnée
Target = ""
Exit Do
End If
Set c = .FindNext(c)
'Tant que la boucle ne nous replace pas sur la première donnée trouvée
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With
End Sub |