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 :

UserForm, TextBox & Controle de saisie


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Points : 25
    Points
    25
    Par défaut UserForm, TextBox & Controle de saisie
    yo

    Je suis en train de creer un formulaire (UserForm) en vba pour Excel. J'ai mis en forme celui-ci et inserer des controles de saisie pour chacun des champs avec l'evenement Exit.
    J'observe que mes trois premieres textbox(es) sont bien controlees comme escompte et qu'un message d'erreur s'affiche si le formalisme n'est pas respecte, puis impose une nouvelle saisie dans ces memes textbox(es).

    Cependant, mes deux dernieres textbox(es) - j'en ai cinq en tout- ne sont controlees qu'apres la pression sur mon bouton Ok (ferme le formulaire). Les messages d'erreur s'affichent a la suite de la fermeture, les uns apres les autres.
    Ainsi, on ne boucle pas sur les saisies erronees pour correction.

    Je dois preciser que trois ComboBox(es) suivent mes premieres TextBox(es) et precedent les deux dernieres, controlees a posteriori.

    J'ai bien essaye d'imposer un retour a la textbox erronee au sein de mon code a l'aide de .SetFocus et de .Accelerator, mais pour le premier, ca ne marche, et c'est impossible pour le second...

    Arrivez-vous a cerner le probleme ?

    Merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 202
    Points : 14 353
    Points
    14 353
    Par défaut
    Bonjour,

    Ça serait bien de voir ton code.
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Points : 25
    Points
    25
    Par défaut
    Cela suffit-il ?

    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
     
    Private Sub TextBoxNumFunk_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        If TextBoxNumFunk.Value = "" Then
           Exit Sub
        Else
            If False = IsNumeric(TextBoxNumFunk.Value) Then
                msg = MsgBox("Attendu: nombre", vbExclamation, "Erreur saisie")
                TextBoxNumFunk.Value = ""
                Cancel = True
            End If
        End If
    End Sub
     
    Private Sub TextBoxQuantiteCommandee_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        If TextBoxQuantiteCommandee.Value = "" Then
            Exit Sub
        Else
            If False = IsNumeric(TextBoxQuantiteCommandee.Value) Then
                msg = MsgBox("Attendu: nombre", vbExclamation, "Erreur saisie")
                TextBoxQuantiteCommandee.Value = ""
                Cancel = True
            End If
        End If
    End Sub

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour voila ce que j’ai proposé sur un autre post du forum tu peux t’en inspiré si tu veux.
    Citation Envoyé par rdurupt Voir le message
    Bonjour,
    Tous les contrôles dispos d’une propriété TAG.
    Il sufis de l’utiliser pour afficher ton message d’erreur.
    Si un contrôle à un TAG= "" c’est qu’il n’est pas obligatoire si non on test le texte.
    Attention au liste et check (value).
    Vérifier le type de contrôle.
    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
    Private Sub Valider_Click()
     
    If ChampObligatoir = True Then Exit Sub
    'Code si validé
    End Sub
     
    Function ChampObligatoir() As Boolean
    Dim i As Long
     
    For i = 0 To Me.Controls.Count - 1
    Debug.Print TypeName(Me.Controls(i))
        If Trim("" & Me.Controls(i).Tag) <> "" Then
            Select Case TypeName(Me.Controls(i))
                Case "TextBox"
                    If Trim(Me.Controls(i).Text) = "" Then
                    MsgBox Me.Controls(i).Tag
                    Me.Controls(i).SetFocus
                    ChampObligatoir = True
                End If
                Case "ComboBox"
                    If Trim(Me.Controls(i).Text) = "" Then
                    MsgBox Me.Controls(i).Tag
                    Me.Controls(i).SetFocus
                    ChampObligatoir = True
                End If
                 Case "ListBox"
                    If Trim(Me.Controls(i).Text) = "" Then
                    MsgBox Me.Controls(i).Tag
                    Me.Controls(i).SetFocus
                    ChampObligatoir = True
                End If
                Case "CheckBox"
                    If Trim(Me.Controls(i).Value) = False Then
                    MsgBox Me.Controls(i).Tag
                    Me.Controls(i).SetFocus
                    ChampObligatoir = True
                End If
                 Case "OptionButton"
                    If Trim(Me.Controls(i).Value) = False Then
                    MsgBox Me.Controls(i).Tag
                    Me.Controls(i).SetFocus
                    ChampObligatoir = True
                End If
            End Select
        End If
        If ChampObligatoir = True Then Exit Function
    Next
    End Function
    Images attachées Images attachées  

  5. #5
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Si tes Textbox ne doivent avoir que des valeurs numériques, il te suffit de contrôler la saisie :
    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
     
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
     
        Select Case KeyAscii
     
            'seulement des chiffres
            Case 48 To 57
     
            'virgule et point, séparateur décimal
            Case 44, 46
     
                'seulement la virgule <-- adapter si nécessaire
                If KeyAscii = 46 Then KeyAscii = 44
     
                'seulement une fois
                If InStr(TextBox1.Text, Chr(KeyAscii)) <> 0 Then KeyAscii = 0
     
                'interdit le séparateur décimal en premier
                If TextBox1.Text = "" Then If KeyAscii = 44 Then KeyAscii = 0
     
     
            Case Else
     
                MsgBox "Seulement numérique !"
     
        End Select
     
    End Sub
    Hervé.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Points : 25
    Points
    25
    Par défaut
    Merci.

    C'est bien tout ca, mais qu'est-ce qui ne fonctionne pas dans mon code ?

    Je ne trouve pas d'explication a ce "phenomene"...

  7. #7
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Tu dis :
    Cependant, mes deux dernieres textbox(es) - j'en ai cinq en tout...
    Sur la Form je n'en compte que 4 ?
    ne sont controlees qu'apres la pression sur mon bouton Ok (ferme le formulaire)...
    Tu utilise l'évènement "Exit" des TextBox donc, pour le dernier, comme tu ne change pas de TextBox pour provoquer Exit, l'évènement ne se produit que quand le focus est donné au bouton de fermeture.

    Hervé.

  8. #8
    Membre expérimenté
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2013
    Messages
    885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 885
    Points : 1 499
    Points
    1 499
    Par défaut userform,textbox et controle saisie
    bonjour,

    je ne maitrise pas VBA mais il me semble, si j'ai bien compris le problème, que j'aurai écrit le code suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Private Sub TextBoxNumFunk_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     If TextBoxNumFunk.Value = "" Or Not IsNumeric(TextBoxNumFunk.Value) Then
        msg = MsgBox("Entrez une valeur numérique", vbExclamation, "Erreur saisie")
        TextBoxNumFunk.Value = ""
        TextBoxNumFunk.SetFocus
        Exit Sub  '  instruction à voir en fonction du contexte
     End If
    End Sub
    je ne sais pas ce qu'en pense les connaisseurs ?

    cordialement.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Points : 25
    Points
    25
    Par défaut
    Merci pour vos reponses.

    On economise des lignes avec ce que tu proposes nibledispo, mais en faisant ainsi, tu changes le comportement du programme: la ou je voulais forcer une saisie nulle ou uniquement numerique, ton code n'autorise que la saisie d'un nombre.

    Sous l'impulsion de plusieurs personnes, j'ai laisse de cote l'evenement Exit pour le remplacer par KeyPress. Le comportement est quasiment le meme que precedemment et le resultat satisfaisant.
    En revanche, mon probleme persiste: les deux premiers controles de saisie se font immediatement, mais pas pour les suivants, ceux-ci ne s'effectuent qu'a la sortie de mon UserForm. Je pense que cela a un rapport avec le passage TextBox vers ComboBox, car c'est a partir de cette transition que le probleme survient, mais je ne sais pas l'expliquer, ni le resoudre.

    Des idees ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour, je te suggère du regarder ma solution de plus près elle fonctionne très bien et je l’utilise depuis plusieurs années !

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Points : 25
    Points
    25
    Par défaut
    J'ai bien regarde le code propose. J'ai compris la propriete .Tag.

    De ce que j'ai compris de votre proposition, il y a verification de la saisie, puis on boucle sur le controle tant que celui-ci ne respecte pas le formalisme attendu et c'est la fonction .SetFocus qui s'en occupe. Ai-je bon sur ce dernier point ?
    Si oui, en quoi mon code ne convient-il pas ? J'ai deja utilise .SetFocus et pourtant le probleme survient malgre tout (on m'a d'ailleurs conseille sur un autre sujet d'utiliser la propriete Cancel).

    Aussi, il y a d'autres points obscurs:
    - le role de la procedure Valider_Click() ;
    - la presence de "If ChampObligatoir = True Then Exit Function" sert a quel endroit ? ;
    - a quoi sert la concatenation ligne 12 : " "" & Me.Controls(i).Tag" ?

    Merci.

  12. #12
    Invité
    Invité(e)
    Par défaut
    "If ChampObligatoir = True Then Exit Function" sert a quel endroit ? ; "
    "If ChampObligatoir = True Then " permet de quitter la fonction ou le sub [exit Sub] si un utilisateur n'a pas respecté les obligation de saisie dans mon cas les champs obligatoires dans le tien le format de saisie un texte pour un numérique.

  13. #13
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Supprime les TextBox qui ne fonctionnent pas et remplace-les par des nouveaux pour voir si le problème subsiste !

    Hervé

  14. #14
    Nouveau membre du Club
    Inscrit en
    Juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 38
    Points : 25
    Points
    25
    Par défaut
    Ok, j'ai trouve. En adaptant le code, j'ai reussi avec votre aide. Quand on a les outils et qu'on reflechit, cela marche mieux.
    Voila ce que ca donne:
    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
    Private Sub ButtonOk_Click()
        If False = checkFormCompleted Then
            Unload Me
        End If
    End Sub
     
    Private Function checkFormCompleted()
        Dim i As Integer
     
        For i = 0 To Me.Controls.Count - 1
            If TypeName(Me.Controls(i)) = "TextBox" Then
                If Trim("" & Me.Controls(i).Tag) <> "" And Trim(Me.Controls(i).Text) = "" Then
                    msg = MsgBox("xxx ne doit pas etre vide", vbCritical, "ERR")
                    Me.Controls(i).SetFocus
                    checkFormCompleted = True
                End If
            End If
            If True = checkFormCompleted Then
                Exit Function
            End If
        Next i
     
        checkFormCompleted = False
    End Function
    Merci a tous.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/01/2011, 20h09
  2. controles de saisi de textbox
    Par jbggg dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 10/11/2009, 14h50
  3. Controler la saisie dans des textbox
    Par Msysteme dans le forum ASP.NET
    Réponses: 20
    Dernier message: 25/02/2009, 14h56
  4. ptit probleme de controle de saisie de formulaire
    Par coachbob44 dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 24/03/2005, 14h09
  5. [LG]contrôle de saisie
    Par zetterberg_10 dans le forum Langage
    Réponses: 8
    Dernier message: 10/02/2005, 13h55

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