Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Vérifier et/ou empêcher la saisie de doublon

1,170 views
Skip to first unread message

JMM21

unread,
Dec 7, 2009, 2:10:01 AM12/7/09
to
Bonjour,
La demande :
je souhaite vérifier et/ou empêcher la saisie de doublon dans les cellules
d'une colonne présent dans une colonne d'une autre feuille.

Mes recherches :
J'ai bien sûr cherché sur la toile et j'ai trouvé pas mal de choses s'y
rapportant, mais pas exactement ce que je voulais, forcément...

Les pistes :
Données/Validation/...=nb.si(A:A;A1)<2
Cela fonctionne bien pour les données d'une même colonne d'une même feuille.
Mais je n'y suis pas parvenu pour des données présentes dans une autre
colonne d'une autre feuille.
est-il possible d'utiler "nb.si" en se référant à des éléments d'une autre
feuille ?

Code VBA :
j'ai trouvé un super code :

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim Colonne As Integer
Dim Adresse As String
'On sort si plus d'une cellule a été modifiée
If Target.Count > 1 Then Exit Sub
'On sort si la cellule modifiée est vide
If Target.Value = "" Then Exit Sub
'Définit la colonne à vérifier (1=Colonne A, 2=colonne B ...etc...)
Colonne = 1
'Vérifie si c'est la colonne cible a été modifiée
If Target.Column = Colonne Then
'Recherche si la nouvelle donnée existe déjà dans la colonne.
Adresse = Columns(Colonne).Find(What:=Target.Value, After:=Target.Offset(1,
0), LookAt:=xlWhole, _
SearchDirection:=xlNext).Address
'Si l'adresse de cellule trouvée ne correspond pas à la cellule modifiée,
cela
'signifie qu'il y a un doublon dans la colonne.
If Adresse <> Target.Address Then

MsgBox "La donnée '" & Target & "' existe déjà dans la cellule " & Adresse
'Suppression de la donnée
Target.Value = ""
Target.Select
End If
End If
End Sub

Je n'ai pas réussi à le modifier pour changer l'adresse de la recherche avec
la propriété Worksheet ?

Un coup de main serait le bien venu

Merci d'avance

PS : j'ai déjà posté cette question samedi sur le forum de CodeS-SourceS.com
parceque je n'arrivais plus à accéder à ce forum bien plus "familial"... (pas
si facile d'y retourner quand on plus l'adresse en favori !!!???)

--
[Jmm21]
☺♂

FFO

unread,
Dec 7, 2009, 3:28:01 AM12/7/09
to
Salut à toi

je suppose que tu souhaites adapter cette ligne à une autre feuille :

Adresse = Columns(Colonne).Find(What:=Target.Value, After:=Target.Offset(1,
0), LookAt:=xlWhole, _
SearchDirection:=xlNext).Address

Mets la comme ceci :

Adresse = Sheets("MaFeuille").Columns(Colonne).Find(What:=Target.Value,
After:=Sheets("MaFeuille").Range(Target.Address).Offset(1,

0), LookAt:=xlWhole, _
SearchDirection:=xlNext).Address

Celà devrait fonctionner

Dis moi !!!!!

JMM21

unread,
Dec 7, 2009, 4:24:01 AM12/7/09
to
FFO a rapidement répondu :

> Mets la comme ceci :
>
> Adresse = Sheets("MaFeuille").Columns(Colonne).Find(What:=Target.Value,
> After:=Sheets("MaFeuille").Range(Target.Address).Offset(1,
> 0), LookAt:=xlWhole, _
> SearchDirection:=xlNext).Address
>
"> Celà devrait fonctionner
>
> Dis moi !!!!!

Je m'en empresse !!!
Hélas non, j'avais tenté ce rajout mais sans succès.

"erreur d'éxécution 9"
l'indice n'appartient pas à la selection"

oui mais encore...

Cordialement

FFO

unread,
Dec 7, 2009, 7:20:01 AM12/7/09
to
Rebonjour à toi

As tu remplacé :

("MaFeuille")

par le nom de l'Onglet dont tu parles là :

"Mais je n'y suis pas parvenu pour des données présentes dans une autre
colonne d'une autre feuille."

Tiens moi informé !!!!!


JMM21

unread,
Dec 7, 2009, 8:15:01 AM12/7/09
to
re-re-bonjour,

> "FFO" a écrit ;as-tu remplacé ("MaFeuille") par le nom de l'Onglet ?

oui, oui bien sûr, enfin je pense...

Soit je fais une erreur de syntaxe, soit il manque quelques chose.

Je te joins le fichier d'essai avec la macro

http://cjoint.com/data/mhohuKBJzY_saisie_doublon.xls

Encore et toujours merci de prendre du temps


--
[Jmm21]
☺♂

FdeCourt

unread,
Dec 7, 2009, 8:39:57 AM12/7/09
to
Salut,
Pourquoi passer par une macro ?
Si tu ne souhaite pas pouvoir saisir dans la colonne A de Feuil1 une
valeur qui est déjà présente dans la colonne A de Feuil2, alors
- Créer un nom que tu appelera "data" : =DECALER(Feuil2!$A$1;;;NBVAL
(Feuil2!$A:$A))
- Dans la cellule A1 de Feuil1, avec outils>Validation, tu choisis
personnalisé, puis cette formule : =NB.SI(data;A1)=0

Et voilà !

Cordialement,

F.

FFO

unread,
Dec 7, 2009, 9:23:01 AM12/7/09
to
Rebonjour à toi

Dans cette ligne de code tu n'as pas tout mis à jour concernant le nom te
ton onglet :

Adresse = Sheets("Feuil2").Columns(Colonne).Find(What:=Target.Value, _


After:=Sheets("MaFeuille").Range(Target.Address).Offset(1, 0),
LookAt:=xlWhole, _
SearchDirection:=xlNext).Address

Ce bout de code reste à actualiser : After:=Sheets("MaFeuille")

Mettre : After:=Sheets("Feuil2").

Celà devrait mieux fonctionner

Dis moi !!!!!

JMM21

unread,
Dec 7, 2009, 10:43:01 AM12/7/09
to
Bonjour,

"FdeCourt" a posé une question :


> Pourquoi passer par une macro ?

Je ne suis pas un "accro" de la macro, d'ailleurs au début de mon post la
piste "Données/Validation" avait été évoquée. Sauf que j'ignorais l'astuce de
l'affectation d'un nom avec la formule "décaler..."

Un grand merci pour ta solution qui fonctionne parfaitement.

Bonne soirée
Cordialement
--
[Jmm21]
☺♂

JMM21

unread,
Dec 7, 2009, 10:53:02 AM12/7/09
to
Effectivement FFO, j'ai oublié... (manque de concentration)

> Ce bout de code reste à actualiser : After:=Sheets("MaFeuille")

> Celà devrait mieux fonctionner Dis moi !!!!!

oui !!!
et non...
je m'explique :
Effectivement le code va bien à la bonne adresse pour vérifier la présence
d'un doublon.
Sauf que la macro se plante quand il n'y a pas de doublon et elle ne
fonctionne pas avec 1 !!!???

Fdecourt m'a proposé une autre solution alternative qui fonctionne.
Le plus de la macro étant l'effacement de la donnée et c'est aussi
inétressant pour l'aspect pédagogique en VB.

Si tu as le temps...

merci et bonne soirée
Cordialement

--
[Jmm21]
☺♂

FFO

unread,
Dec 7, 2009, 11:21:01 AM12/7/09
to
Rebonjour à toi

Il suffisait de rajouter cette ligne en début de code :

On Error Resume Next

Et le tour était joué

Je me suis cantonné à te donner la solution pour rechercher une valeur dans
une autre feuille mais pas attaché au fonctionnement global de ta macro

Fais des essais avec cette ligne par exemple juste avant la recherche dans
la Feuil2 ainsi :

On Error Resume Next


Adresse = Sheets("Feuil2").Columns(Colonne).Find(What:=Target.Value, _

After:=Sheets("Feuil2").Range(Target.Address).Offset(1, 0),

LookAt:=xlWhole, _
SearchDirection:=xlNext).Address

Donnes moi des nouvelles !!!!!

JMM21

unread,
Dec 7, 2009, 2:38:02 PM12/7/09
to
Bonsoir, maintenant...
"FFO" a écrit :

> Donnes moi des nouvelles !!!!!

Le résultat est curieux, il (le code) voit des doublons partout...

http://www.cijoint.fr/cjlink.php?file=cj200912/cijtuF4fI5.xls

Je ne sais plus quoi penser...

Bonne nuit
--
[Jmm21]
☺♂


>

FFO

unread,
Dec 8, 2009, 2:19:01 AM12/8/09
to
Rebonjour à toi

Le but si j'ai bien compris dans ton exemple fourni est de détecter la
présence de la valeur saisie en colonne 1 dans cette même colonne en feuille
"Mafeuille"

Dans cet esprit tu trouveras ci-joint ton exemple adapté

En colonne 1 Feuil1 si tu saisis un chiffre de 1 à 21 présent dans la
feuille "Mafeuille" même colonne une boîte de dialogue te le signal et efface
la saisie

A partir de 22 plus aucune alerte et la saisie est maintenue

Fais des essais et dis moi !!!!

Sur ce lien ton exemple avec commentaires adaptés dans le codes sur les
corrections apportées

http://www.cijoint.fr/cjlink.php?file=cj200912/cijGTdm8wb.xls


JMM21

unread,
Dec 8, 2009, 3:43:01 AM12/8/09
to
Bonjour,

"FFO" a tout fait et cela fonctionne parfaitement !!!
Merci pour tout !!!
Pour ma gouverne, le problème était où ?
Il fallait réinitialiser la ligne à 0 ?

Bonne et belle journée

Cordialement

--
[Jmm21]
☺♂

FFO

unread,
Dec 8, 2009, 4:12:01 AM12/8/09
to
Rebonjour à toi

Le souci venait de la manière d'aborder la problématique

La tienne était de :

"Si l'adresse de cellule trouvée ne correspond pas à la cellule modifiée, cela
'signifie qu'il y a un doublon dans la colonne."

Tu peux trés bien être sur cellule modifiée à une adresse et avoir une
cellule trouvée à une autre adresse comme être entre la celulle modifiée et
celle trouvée à la même adresse

Je ne vois pas donc ce que cette condition peut amener pour discerner si il
y a doublon ou pas

Tansdisque la mienne :

'Si la Ligne est supérieur à 0 celà signifie que la donnée est présente
dans la colonne.'

en ramenant systématiquement la variable "Ligne" à 0 en préambule le fait de
la retrouver avec une valeur supérieure ensuite aprés l'exécution de la ligne
de code de recherche signifie obligatoirement la présence de la valeur donc
présence du doublon

et donc la condition :

If Ligne > 0 Then

étant vérifié lors de la détection du doublon engendre le message et
l'effacement de la saisie


Espérant t'avoir apporté les éclaircissements attendus


JMM21

unread,
Dec 8, 2009, 4:30:01 AM12/8/09
to
Re-Bonjour,

il me faudra du temps pour assimiler tes explications.
je vais éditer, lire et relire, pour bien comprendre...

Encore merci
--
[Jmm21]
☺♂

0 new messages