Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] Comment s'assurer que valeur entrée dans colonne est unique

17 réponses
Avatar
Nemroth
Bonjour à toutes et à tous.

Je souhaiterais faire la chose suivante en VBA :

Lorsque l'utilisateur entre une donnée dans la colonne A, le programme
vérifie si la donnée est unique dans la colonne (dès qu'il a quitté la
cellule)

Si ce n'est pas le cas, un message s'affiche l'informant que la donnée
est déjà utilisée et la cellule qu'il a quitté passe à nouveau en mode
édition.

Si la valeur est unique, rien ne se passe.

Par avance merci

10 réponses

1 2
Avatar
FFO
Salut à toi

Mets dans le VBA de la feuille ce code :

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target <> "" Then
Ligne = Columns("A:A").Find(What:=Target, After:=Range("A1"),
LookIn:=xlValues, _
LookAt:=xlWhole).Row
If Ligne <> Target.Row Then
MsgBox ("Donnée déjà saisie")
Target = ""
Target.Activate
End If
End If
End Sub

Celà devrait convenir

Dis moi !!!!
Avatar
Nemroth
Je ne sais pas pourquoi, mais les lignes

Ligne = Columns("A:A").Find(What:=Target, After:=Range("A1"),
LookIn:=xlValues, _
LookAt:=xlWhole).Row

sont en rouge dans l'éditeur et lorsque j'insère une valeur, le débogeur
se bloque sur la première de ces lignes. Je suis sous Excel 2002.

FFO a écrit :
Salut à toi

Mets dans le VBA de la feuille ce code :

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target <> "" Then
Ligne = Columns("A:A").Find(What:=Target, After:=Range("A1"),
LookIn:=xlValues, _
LookAt:=xlWhole).Row
If Ligne <> Target.Row Then
MsgBox ("Donnée déjà saisie")
Target = ""
Target.Activate
End If
End If
End Sub

Celà devrait convenir

Dis moi !!!!



Avatar
Nemroth
Autant pour moi !!! Ces trois lignes n'en faisaient qu'une !!!
Depuis ça fonctionne super bien.
merci beaucoup FFO

Nemroth a écrit :
Je ne sais pas pourquoi, mais les lignes

Ligne = Columns("A:A").Find(What:=Target, After:=Range("A1"),
LookIn:=xlValues, _
LookAt:=xlWhole).Row

sont en rouge dans l'éditeur et lorsque j'insère une valeur, le débogeur
se bloque sur la première de ces lignes. Je suis sous Excel 2002.

FFO a écrit :
Salut à toi

Mets dans le VBA de la feuille ce code :

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target <> "" Then
Ligne = Columns("A:A").Find(What:=Target, After:=Range("A1"),
LookIn:=xlValues, _
LookAt:=xlWhole).Row
If Ligne <> Target.Row Then
MsgBox ("Donnée déjà saisie")
Target = ""
Target.Activate
End If
End If
End Sub

Celà devrait convenir

Dis moi !!!!





Avatar
LSteph
Bonjour,

Dans le code de la feuille (prévoit l'entrée ou collage sur plusieurs
cellules):

Private Sub Worksheet_Change(ByVal Target As Range)
Dim isect As Range, i As Long
Set isect = Intersect([a:a], Target)
If isect Is Nothing Then Exit Sub
With isect
For i = 1 To .Cells.Count
If .Cells(i) <> "" Then
If WorksheetFunction.CountIf([a1:a65536], .Cells(i).Value) > 1 Then
Application.EnableEvents = False
isect.ClearContents
MsgBox "entrée multiple"
.Cells(i).Activate
Application.EnableEvents = True
Exit For
End If
End If
Next
End With
End Sub

'lSteph

On 16 juil, 16:45, Nemroth wrote:
Bonjour à toutes et à tous.

Je souhaiterais faire la chose suivante en VBA :

Lorsque l'utilisateur entre une donnée dans la colonne A, le programme
vérifie si la donnée est unique dans la colonne (dès qu'il a quitt é la
cellule)

Si ce n'est pas le cas, un message s'affiche l'informant que la donnée
est déjà utilisée et la cellule qu'il a quitté passe à nouveau en mode
édition.

Si la valeur est unique, rien ne se passe.

Par avance merci


Avatar
FFO
Rebonjour à toi

Mets ces lignes bout à bout :

Ligne = Columns("A:A").Find(What:=Target, After:=Range("A1"),
LookIn:=xlValues, _

en une seule

Pour celà mets le curseur en bout de la première et fait un "Suppr"

Celà devrait convenir

Dis moi !!!!!
Avatar
Caetera
> Je souhaiterais faire la chose suivante en VBA :

Lorsque l'utilisateur entre une donnée dans la colonne A, le programme vérifie
si la donnée est unique dans la colonne (dès qu'il a quitté la cellule)



**********
Quel intérêt d'utiliser le vba et de plomber par là même le Worksheet_Change ?
Connais-tu Données > Validation .....?
Exemple....
=NB.SI(A:A;A1)=1


Etc
Avatar
Nemroth
Merci LSteph.

Votre code fonctionne très bien également. Entre les deux mon coeur
balance !!!

Merci beaucoup

LSteph a écrit :
Bonjour,

Dans le code de la feuille (prévoit l'entrée ou collage sur plusieurs
cellules):

Private Sub Worksheet_Change(ByVal Target As Range)
Dim isect As Range, i As Long
Set isect = Intersect([a:a], Target)
If isect Is Nothing Then Exit Sub
With isect
For i = 1 To .Cells.Count
If .Cells(i) <> "" Then
If WorksheetFunction.CountIf([a1:a65536], .Cells(i).Value) > 1 Then
Application.EnableEvents = False
isect.ClearContents
MsgBox "entrée multiple"
.Cells(i).Activate
Application.EnableEvents = True
Exit For
End If
End If
Next
End With
End Sub

'lSteph

On 16 juil, 16:45, Nemroth wrote:
Bonjour à toutes et à tous.

Je souhaiterais faire la chose suivante en VBA :

Lorsque l'utilisateur entre une donnée dans la colonne A, le programme
vérifie si la donnée est unique dans la colonne (dès qu'il a quitté la
cellule)

Si ce n'est pas le cas, un message s'affiche l'informant que la donnée
est déjà utilisée et la cellule qu'il a quitté passe à nouveau en mode
édition.

Si la valeur est unique, rien ne se passe.

Par avance merci





Avatar
LSteph
Bonjour FFO,

Si j'entre qqchose dans trois cellules..??? Erreur13 mais ca rentre qd
même

Cordialement.

--
lSteph

On 16 juil, 17:03, FFO wrote:
Salut à toi

Mets dans le VBA de la feuille ce code :

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target <> "" Then
Ligne = Columns("A:A").Find(What:=Target, After:=Range("A1"),
LookIn:=xlValues, _
LookAt:=xlWhole).Row
If Ligne <> Target.Row Then
MsgBox ("Donnée déjà saisie")
Target = ""
Target.Activate
End If
End If
End Sub

Celà devrait convenir

Dis moi !!!!


Avatar
LSteph
Re,

Cela aurait été mieux et la 1ère idée qui viendrait mais ça ne t ient
pas sitot que l'on
fait un coller.

Cordialement.

--
lSteph

On 16 juil, 17:38, "Caetera" <EtiennePloufCahé@wanadoo.fr> wrote:
> Je souhaiterais faire la chose suivante en VBA :

> Lorsque l'utilisateur entre une donnée dans la colonne A, le programm e vérifie
> si la donnée est unique dans la colonne (dès qu'il a quitté la ce llule)

**********
Quel intérêt d'utiliser le vba et de plomber par là même le Works heet_Change ?
Connais-tu Données > Validation .....?
Exemple....
=NB.SI(A:A;A1)=1

Etc


Avatar
Nemroth
Je ne connaissais pas Données > Validation
J'ai essayé, et j'ai un message d'alerte quand les valeurs sont
différentes alors que je souhaite le contraire.
Peut-être n'ais-je pas fait ce/comme il fallait.
Ceci-dit, dans la mesure où il va s'agir d'une feuille de données, avec
les intitulés en ligne 1 et les enregistrements sur les lignes
suivantes, ça ne me pose pas de problème d'utiliser le Worksheet_Change
car il n'y aura pas d'autre VBA dans la feuille.

Caetera a écrit :
Je souhaiterais faire la chose suivante en VBA :

Lorsque l'utilisateur entre une donnée dans la colonne A, le programme vérifie
si la donnée est unique dans la colonne (dès qu'il a quitté la cellule)



**********
Quel intérêt d'utiliser le vba et de plomber par là même le Worksheet_Change ?
Connais-tu Données > Validation .....?
Exemple....
=NB.SI(A:A;A1)=1


Etc




1 2