Eviter les doublons

Bonjour,

quelqu’un peut me dire ce qui ne va pas dans mon code svp ?

il m'affiche tout le temps ce message même quand y a pas de doublons : Ce matricule existe déjà. Merci

Public Flag As Boolean

Private Sub Worksheet_Change(ByVal Target As Range)

If Flag Then Exit Sub

If Not Application.Intersect(Target, Columns("E")) Is Nothing Then

If Target.Count > 1 Then Exit Sub

If Application.CountIf(Range("E:E"), Target) > 1 Then

Flag = True

MsgBox ("Ce matricule existe déjà !")

Target.ClearContents

Flag = False

End If

End If

End Sub

29classeur1.xlsm (33.77 Ko)

Bonjour Starr,

Je te retourne ton fichier modifié :

49classeur1.xlsm (30.74 Ko)

À l'ouverture du fichier, la cellule active est E5.

Si tu saisis A ou B (qui sont déjà au-dessus) : message « Ce matricule existe déjà ! » ; et quand tu cliques sur le bouton OK, ça efface la valeur saisie : prêt pour la saisie d'un autre matricule.

Si tu saisis D (ou autre chose que A et B), le message précédent n'apparaît pas et D n'est pas effacé : il est accepté.

dhany

Bonjour dhany ,

heuuu , ya pas moyen de corriger le beug ?

pour moi dans ce état, ca ne fonctionne pas ....

si ya une autre solution, je suis prenant.

Merci,

J'comprends pas : si tu suis les indications d'mon précédent message, y'a pas l'bug dont tu parles ! alors :

1) quand tu as écrit : « pour moi dans cet état » : est-ce que « état » est ton formulaire (ou c'est juste un état) ?

2) quand ça fonctionne pas : est-ce que c'est dans le code du formulaire ? erreur de compilation ou d'exécution ?

quel est le message d'erreur ? quelle ligne du code est mise en jaune ? quelle manip fais-tu qui fait le bug ?

dhany

Bonjour dhany ,

En fait rien de spécial, J'ai trouvé bizarre que ça fonctionne chez toi et pas chez moi, non pas que tu n'ais rien fait sur le programme. Le pour moi dans ce état, ca ne fonctionne pas .... C'est une pensée que j'ai exprimé tout haut mais ça n'était pas pour juger ton travail, mais pour me dire à moi même du genre zut ça ne fonctionnera pas si je le laisse dans cet état. Dsle si je m'eternise la dessus mais je ne veux juger personne et dsl je ne me suis pas relu du au faite que j'avais dormi très peu. Je me parlais surtout à moi même pour avoir passé du temps sur programme et le fait qu'il ne veuille pas fonctionner.

Pour répondre à la question, il ny a aucune erreur qui apparaît. Le programme fonctionne très bien c'est juste qu'il m'affiche ce message à chaque validation sur la touche save entry malgré qu'il nyait pas de doublons. On a l'impression que le programme à été fait pour afficher ce message qu'il y ait des doublons ou pas.

Merci,

Bonsoir Starr,

Je veux d'abord te rassurer : mon point 1) n'était pas du tout une critique ; et je n'ai pas pensé que tu cherchais à juger mon travail ! c'est seulement que j'avais vu dans ton fichier le formulaire nommé UserForm3 ; et comme certains appellent parfois un formulaire un état, j'ai pensé que ton erreur se produisait peut être quand tu utilisais UserForm3.

Or c'est justement lié à UserForm3 : je viens de voir que ta touche SAVE ENTRY est le bouton bleu foncé de ton formulaire UserForm3 ; et ce bouton est nommé : CommandButton38 ; voici le code VBA que tu as fait (tel que, sans aucun changement) :

Private Sub CommandButton38_Click()
   MsgBox "Save Entry": Exit Sub
0  Dim Ctrl As Control
   ' Initialisation du formulaire s'il n'a pas été chargé préalablement (Load) et affichage
   ' Insertion d'une nouvelle ligne (la ligne 2 descend en ligne 3)
1  Rows("2:2").Insert Shift:=x1Down, copyorigin:=x1FormatFromLeftOrAbove
   ' Effacement du contenu des TextBox
2  For Each Ctrl In Me.Controls
3     If TypeName(Ctrl) = "TextBox" Then Ctrl.Value = Empty
4  Next Ctrl
End Sub

et quand je clique sur ton bouton, je n'ai pas de message « Ce matricule existe déjà ! ».

(c'est bizarre, tes numéros 0 à 4 !)


À tout hasard, regarde cette option avancée :

screen

NB : c'est très mauvais de faire de la programmation VBA si tu es trop fatigué !!! il vaut mieux que tu reportes au lendemain et que tu ailles te reposer ! c'est dit très sérieusement, car c'est comme en ski : les accidents arrivent surtout quand le skieur est fatigué !

(en VBA, les accidents sont bien sûr des erreurs de programmation ; ou pire : suppression accidentelle du fichier !)

dhany

Bonsoir dhany,

j'ai fait comme tu m'as dit et là, le message n'apparait plus mais les doublons sont toujours acceptés.

je pense que le code n'est pas bon il ne doit pas fonctionner (avec l'userform).

J'ai même essayé ce code dans validation des données, rien a faire ça ne marche pas : =NB.SI($A$2:$A$24;A4)=1 INTERDIRE LES DOUBLONS.

je sais que je ne suis pas doué mais là c'est une tuerie. rien ne fonctionne.

si tu as un dernier recours je suis prenant.

Lorsque je supprime l'userform et que je rentre les informations directement sur la feuille excel, la par contre ça fonctionne très bien même lorsque je ne décoche pas "décaler la sélection...."

Merci,

Bonjour,

Quelqu'un peut t'il m’aider à résoudre ce problème svp ?

je souhaite juste éviter les doublons en colonne E lorsque j’appuie sur "Save Entry"

Ça fait des jours que je sèche la dessus et toujours pas de solution en vue. c'est désespérant

Merci par avance de votre aide,

le premier code utilisé était :

Private Sub Worksheet_Change(ByVal Target As Range)
If Flag Then Exit Sub
    If Not Application.Intersect(Target, Columns("e")) Is Nothing Then
        If Target.Count > 1 Then Exit Sub
        If Application.CountIf(Range("f:g"), Target) > 1 Then
            Flag = True
                MsgBox ("Ce matricule existe déjà !")
                Target.ClearContents
            Flag = False
        End If
    End If
End Sub

et avec ce nouveau code ci-dessous, le problème est le même. le message du MsgBox "Ce matricule est déjà inscrit dans la liste" apparait a chaque validation.

Private Sub CommandButton38_Click()
Application.Sheets("VEHICULES").Activate
Dim DerLig As Long
    With Worksheets("VEHICULES")
        DerLig = .Range("E" & Rows.Count).End(xlUp).Row
        If Application.CountIf(.Range("E2:E" & DerLig), Me.TextBox1.Text) = 0 Then
            .Rows("2:2").Insert Shift:=x1Down, CopyOrigin:=x1FormatfromLeftOrAbove 'insère une ligne
    [C2] = TextBox18.Text
    [B2] = TextBox19.Text
    [E2] = TextBox20.Text
    [G2] = TextBox21.Text
    [L2] = TextBox23.Text
    [J2] = TextBox24.Text
    [K2] = TextBox25.Text
        Else
            MsgBox "Ce matricule est déjà inscrit dans la liste"
        End If
For Each Ctrl In Me.Controls
If TypeName(Ctrl) = "TextBox" Then Ctrl.Value = Empty
Next Ctrl
        End With
End Sub
17classeur1.xlsm (31.81 Ko)

Bonjour Starr,

C'est pas bien du tout, ta façon d'expliquer ton problème !!!

Dans tes messages précédents, tu parles du message « Ce matricule existe déjà ! », oui, mais à aucun moment tu expliques ce que tu fais pour arriver à c'problème gênant ! tu as écrit aussi : « Le programme fonctionne très bien c'est juste qu'il m'affiche ce message à chaque validation sur la touche save entry » ; pour moi, touche = touche du clavier, et sur le clavier : y'a bien une touche Entrée, mais pas de touche save entry ! je te fais ces critiques pour que tu comprennes que c'est très difficile de t'aider si tu as mal expliqué ton problème ! comme j'ai finalement réussi à comprendre, voici ce que tu aurais dû dire dès le départ (et j'aurais pu t'aider bien plus vite !) :

J'ai ouvert mon formulaire UserForm3 ; je saisis un matricule dans le champ Matricule (nommé "TextBox20") ; et c'est là que le message « Ce matricule existe déjà ! » apparaît ; ou aussi quand je clique sur le bouton « Save Entry » (nommé CommandButton38).

Eh oui, car en fait, la « touche save entry » n'est pas une touche mais un bouton du formulaire ! dis-toi bien que seul toi connais bien ton classeur, et quand tu le fournis sans aucune explication, c'est vraiment pas évident !!!


Bon, ne désespère plus car j'ai une super nouvelle pour toi ! ayant compris la cause du problème, j'ai réussi à l'résoudre...

du moins je crois : à l'ouverture du fichier, fais d'abord Ctrl e, puis à toi d'faire tous les tests ! bonne chance !

J'ai fait aussi de nombreuses autres améliorations, dont j'te laisse la surprise ! (j'suis même pas sûr que t'arriveras à toutes les voir, car y'en a de très subtiles ! si t'arrives à toutes les mettre dans ton vrai fichier, alors bravo !)

23classeur1.xlsm (31.30 Ko)

À te lire pour avoir ton avis.

dhany

Bonjour dhany ,

je ne peux que retrouver mon état naturel de sourire.

c'est tout simplement formidable.

On a de la chance d'avoir des gens comme vous. Franchement très grand merci pour tous.

Je comprends à quel point ce n'est pas évident de nous faire comprendre mais aussi pour vous de nous comprendre.

Une chose est sur, j'ai fait un grand pas vers la VBA.......enfin j’espère .

C'est tout ce moment de difficulté qui donne un sens au bonheur lorsque ça marche.

Mille merci à vous tous,

Si ça peut aider d'autres, je mets le fichier en ligne.

Bonjour toutes et tous et bonne semaine,

@Starr merci de tes compliments pour toutes celles ou ceux qui ont pu t'aider

par contre, je viens de voir si, j'effectue un clic sur le bouton Données de l'userform (Tableau de bord) et les autres userforms avec les boutons Données

Données est un onglet caché (Hidden) d'ou tu auras une erreur il restera juste à ne rien mettre sur ce bouton uniquement

ou pourquoi pas grisé le bouton de commande CommandButton8 en mettant dans ses options CommandButton8==> Enabled à False et/ou Locked à True<==

Private Sub CommandButton8_Click() 
' onglet Données caché
end sub

idem pour les 2 autres boutons CommandButton53 et CommandButton44:

Private Sub CommandButton53_Click()
' DONNEES
 ' Sheets("DONNEES").Select
End Sub

crdlt,

André

C'est cool.

Merci pour l'info.

Rechercher des sujets similaires à "eviter doublons"