IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Eviter saisie doublon dans textBox [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Points : 35
    Points
    35
    Par défaut Eviter saisie doublon dans textBox
    Bonjour à tous,

    J'ai un gros souci que je n'arrive pas à trouver par moi-même et je n'ai pas trouvé de discussion sur ce problème.
    Dans un classeur j'ai 3 feuilles :
    - client (tableau regroupant tous mes clients)
    -contact (tableau regroupant les contact liés à mes clients)
    -devis => il y a un bouton de commande me permettant d'ouvrir un formulaire afin de saisir un nouveau client+contact.

    Voici le code attribué au bouton ajouter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    Private Sub cmdajouter_Click()
    Dim numLigneVide As Integer
       'On active la feuille "client"
       Worksheets("Client").Activate
       'On trouve la dernière ligne vide du tableau et on enregistre le numéro de la ligne dans la variable numLigneVide
       numLigneVide = ActiveSheet.Columns(1).Find("").Row
       'On remplit les données dans notre tableau
          ActiveSheet.Cells(numLigneVide, 9) = TxtEcheance.Text
          ActiveSheet.Cells(numLigneVide, 8) = UCase(TxtModedereglement.Text)
          ActiveSheet.Cells(numLigneVide, 7) = UCase(TxtPays.Text)
          ActiveSheet.Cells(numLigneVide, 6) = UCase(TxtVille.Text)
          ActiveSheet.Cells(numLigneVide, 5) = TxtCodepostal.Text
          ActiveSheet.Cells(numLigneVide, 4) = TxtAdresse2.Text
          ActiveSheet.Cells(numLigneVide, 3) = TxtAdresse1.Text
          ActiveSheet.Cells(numLigneVide, 2) = UCase(TxtRaisonsociale.Text)
          ActiveSheet.Cells(numLigneVide, 1) = UCase(TxtCode.Text)
       'On active la feuille "contact"
       Worksheets("Contact").Activate
       'On trouve la dernière ligne vide du tableau et on enregistre le numéro de la ligne dans la variable numLigneVide
       numLigneVide = ActiveSheet.Columns(1).Find("").Row
       'On remplit les données dans notre tableau
       ActiveSheet.Cells(numLigneVide, 7) = TxtSiteweb.Text
       ActiveSheet.Cells(numLigneVide, 6) = TxtMail.Text
       ActiveSheet.Cells(numLigneVide, 5) = Format(TxtFax.Text, "00"" ""00"" ""00"" ""00"" ""00")
       ActiveSheet.Cells(numLigneVide, 4) = Format(TxtPortable.Text, "00"" ""00"" ""00"" ""00"" ""00")
       ActiveSheet.Cells(numLigneVide, 3) = Format(TxtTel.Text, "00"" ""00"" ""00"" ""00"" ""00")
       ActiveSheet.Cells(numLigneVide, 2) = TxtNom.Text
       ActiveSheet.Cells(numLigneVide, 1) = UCase(TxtCode.Text)
       'On efface le formulaire et on replace le curseur sur le premier champs (Code)
       TxtCode.Text = ""
       TxtRaisonsociale.Text = ""
       TxtAdresse1.Text = ""
       TxtAdresse2.Text = ""
       TxtCodepostal.Text = ""
       TxtVille.Text = ""
       TxtPays.Text = ""
       TxtModedereglement.Text = ""
       TxtEcheance.Text = ""
       TxtNom.Text = ""
       TxtTel.Text = ""
       TxtPortable.Text = ""
       TxtFax.Text = ""
       TxtMail.Text = ""
       TxtSiteweb.Text = ""
       TxtCode.SetFocus
       'Enregistre le fichier
    ActiveWorkbook.Save
     
    End Sub
    J'ai placé sur le TxtCode le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub TxtCode_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Select Case KeyAscii
    Case 32 To 47, 58 To 64, 91 To 96, 123 To 126, 160 To 255
    KeyAscii = 0
    MsgBox "Caractères interdits !"
    End Select
    End Sub
    Par contre je n'arrive pas à faire :
    Juste après la saisie dans le TxtCode je voudrais qu'il me fasse une recherche dans ma feuille client pour voir si ce code n'existe pas déjà et dans ce cas me dire Code existant.

    Je tourne en boucle depuis plusieurs jours. J'espère que quelqu'un pourra m'aider.

    Laetitia

  2. #2
    Expert éminent Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Points : 9 548
    Points
    9 548
    Par défaut
    Bonjour,
    Si tu veux une réponse plus facilement, commences déjà à intéger les balises code :
    1 - tu édites ton message
    2 - tu selectionnes ton premier code
    3 - tu cliques sur "#" juste au-dessus de ton message
    et tu fais pareil pour le deuxième code
    tu valides les corrections

    bonne journée

  3. #3
    Membre éprouvé
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Points : 1 141
    Points
    1 141
    Par défaut
    Bonjour,

    Tout à fait d'accord avec casefayere. L'ajout de balises de codes rendrait votre post beaucoup plus lisible.

    Pour résoudre votre problème, vous pouvez essayer d'ajouter le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub TxtCode_AfterUpdate()
        Dim CodeExiste As Boolean
        On Error Resume Next
        If IsNumeric(Application.WorksheetFunction.Match(UCase(TxtCode.Text), Range(Worksheets("client").Cells(1, 1), _
                        Worksheets("client").Cells(1, 1).End(xlDown)), 0)) Then CodeExiste = True
        If CodeExiste And Err.Number = 0 Then MsgBox "Code existant"
        On Error GoTo 0
    End Sub
    Cdt

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Points : 35
    Points
    35
    Par défaut
    Re,

    Merci pour votre aide.

    casefayere : je comprends qu'avec des balises de codes ma demande serait claire. Mais je n'y arrive pas même avec vos indications. Je débute, je dois oublier une étape.

    Ben L : Je suppose quand on utilise dans une expression IsNumeric cela concerne des chiffres. Or ma TxtCode accepte tous les caractères sauf les caractères spéciaux (éèçà./*...)

    Laetitia

  5. #5
    Membre éprouvé
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Points : 1 141
    Points
    1 141
    Par défaut
    Higguins,

    La fonction IsNumeric n'est pas appliquée au texte de ton champs mais au résultat de la fonction Match (équivalent VBA de la fonction Excel EQUIV en français).
    Dis nous ce que tu obtiens lorsque tu testes ce bout de code.

    PS: pour les balises de code, rien de plus simple. Va voir .

    Cdt

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Points : 35
    Points
    35
    Par défaut
    Merci,

    Maintenant j'ai compris comment on faisait pour mettre un code en évidence.

    Je commence à retrouver le sourire. Si je saisie un doublon dans ma TxtCode il avertie mais je peux continuer à saisir et enregistrer ce doublon. Or je ne voudrai pas.

    Laetitia

  7. #7
    Membre éprouvé
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Points : 1 141
    Points
    1 141
    Par défaut
    Tu peux essayer quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub TxtCode_AfterUpdate()
        Dim CodeExiste As Boolean
        On Error Resume Next
        If IsNumeric(Application.WorksheetFunction.Match(UCase(TxtCode.Text), Range(Worksheets("client").Cells(1, 1), _
                        Worksheets("client").Cells(1, 1).End(xlDown)), 0)) Then CodeExiste = True
        If CodeExiste And Err.Number = 0 Then
            MsgBox "Code existant"
            cmdajouter.Enabled = False
        Else
            cmdajouter.Enabled = True
        End If
        On Error GoTo 0
    End Sub
    Lorsqu'un code existant sera rentré, le bouton de validation ne sera plus disponible. Et ce jusqu'à ce qu'un code inexistant soit fourni.

    Une autre solution serait de supprimer le texte entré dans TxtCode si le code existe déjà.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Points : 35
    Points
    35
    Par défaut
    Merci Ben L ca marche (obligé ). Ta deuxième solution est aussi bien. En cherchant j'ai trouvé ce bout de code qui me semblait intéressant car il m'indique ou ce trouve mon premier enregistrement sur ma feuille client mais je n'arrive pas à l'exécuter après saisie sur la TxtCode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub TxtCode_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Dim x As Range
    If TxtCode <> "" Then
        Set x = Range("A:A").Find(TxtCode, , xlValues, xlWhole, , , False)
        If Not x Is Nothing Then
            MsgBox "Ce code est déjà en : " & x.Address & vbLf & "Saisir un nouveau code client"
            TxtCode = ""
            Cancel = True
        End If
    End If
    End Sub

  9. #9
    Membre éprouvé
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Points : 1 141
    Points
    1 141
    Par défaut
    Tu peux modifier le texte de cette façon pour obtenir l'adresse de la cellule qui contient le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub TxtCode_AfterUpdate()
        Dim Ligne as Long
        On Error Resume Next
        Ligne = Application.WorksheetFunction.Match(UCase(TxtCode.Text), Range(Worksheets("client").Cells(1, 1), _
                        Worksheets("client").Cells(1, 1).End(xlDown)), 0)
        If Err.Number = 0 Then
            MsgBox "Ce code est déjà en : " & Worksheets("client").Cells(Ligne, 1).Address & vbLf & "Saisir un nouveau code client"
            cmdajouter.Enabled = False
        Else
            cmdajouter.Enabled = True
        End If
        On Error GoTo 0
    End Sub
    EDIT: Le code ci-dessus a été édité suite au commentaire de HIGGUINS

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 55
    Points : 35
    Points
    35
    Par défaut
    Ca marche. Merci beaucoup

    Par contre dans à la fin du code ....End(xlDown)), 0)) => il y a une parenthèse en trop car il me marque erreur de compilation. J'ai effacé une dès dernière parenthèse. J'espère que c'est la bonne. En tout cas ça marche.

    Laetitia

  11. #11
    Membre éprouvé
    Homme Profil pro
    ingénieur d'étude
    Inscrit en
    Juin 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ingénieur d'étude
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2013
    Messages : 563
    Points : 1 141
    Points
    1 141
    Par défaut
    En effet

    C'est corrigé !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Eviter les doublons dans une requête.
    Par Smint dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 22/03/2017, 16h17
  2. Saisie réglementée dans TextBox
    Par etorria dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/04/2008, 17h17
  3. Eviter les doublons dans les aléatoires
    Par Gunner4902 dans le forum Langage
    Réponses: 4
    Dernier message: 13/12/2007, 12h49
  4. Eviter les doublons dans une requete ?
    Par DrySs dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/03/2006, 05h24
  5. comment eviter des doublons dans un sous formulaire ??
    Par azde7015 dans le forum Access
    Réponses: 2
    Dernier message: 21/02/2006, 09h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo