Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 14 sur 14
  1. #1
    Invité régulier
    Inscrit en
    juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : juin 2013
    Messages : 38
    Points : 9
    Points
    9

    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 Confirmé Sénior
    Homme Profil pro Daniel
    aucune
    Inscrit en
    septembre 2011
    Messages
    6 664
    Détails du profil
    Informations personnelles :
    Nom : Homme Daniel
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : septembre 2011
    Messages : 6 664
    Points : 12 648
    Points
    12 648

    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
    Invité régulier
    Inscrit en
    juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : juin 2013
    Messages : 38
    Points : 9
    Points
    9

    Par défaut

    Cela suffit-il ?

    Code :
    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
    Expert Confirmé Sénior Avatar de rdurupt
    Homme Profil pro Robert Durupt
    Développeur .NET
    Inscrit en
    avril 2012
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Nom : Homme Robert Durupt
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2012
    Messages : 2 373
    Points : 4 644
    Points
    4 644

    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 :
    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
    Une question bien formulée c’est 100% de la solution (rdurupt) !

  5. #5
    Expert Confirmé Sénior
    Homme Profil pro Hervé Silve
    Inscrit en
    août 2010
    Messages
    1 680
    Détails du profil
    Informations personnelles :
    Nom : Homme Hervé Silve
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 1 680
    Points : 4 058
    Points
    4 058

    Par défaut

    Bonjour,

    Si tes Textbox ne doivent avoir que des valeurs numériques, il te suffit de contrôler la saisie :
    Code :
    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
    Invité régulier
    Inscrit en
    juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : juin 2013
    Messages : 38
    Points : 9
    Points
    9

    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 Confirmé Sénior
    Homme Profil pro Hervé Silve
    Inscrit en
    août 2010
    Messages
    1 680
    Détails du profil
    Informations personnelles :
    Nom : Homme Hervé Silve
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 1 680
    Points : 4 058
    Points
    4 058

    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 Expert
    Homme Profil pro Paul
    retraité
    Inscrit en
    mars 2013
    Messages
    879
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul
    Localisation : France

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2013
    Messages : 879
    Points : 1 452
    Points
    1 452

    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 :
    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
    Invité régulier
    Inscrit en
    juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : juin 2013
    Messages : 38
    Points : 9
    Points
    9

    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
    Expert Confirmé Sénior Avatar de rdurupt
    Homme Profil pro Robert Durupt
    Développeur .NET
    Inscrit en
    avril 2012
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Nom : Homme Robert Durupt
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2012
    Messages : 2 373
    Points : 4 644
    Points
    4 644

    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 !
    Une question bien formulée c’est 100% de la solution (rdurupt) !

  11. #11
    Invité régulier
    Inscrit en
    juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : juin 2013
    Messages : 38
    Points : 9
    Points
    9

    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
    Expert Confirmé Sénior Avatar de rdurupt
    Homme Profil pro Robert Durupt
    Développeur .NET
    Inscrit en
    avril 2012
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Nom : Homme Robert Durupt
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2012
    Messages : 2 373
    Points : 4 644
    Points
    4 644

    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.
    Une question bien formulée c’est 100% de la solution (rdurupt) !

  13. #13
    Expert Confirmé Sénior
    Homme Profil pro Hervé Silve
    Inscrit en
    août 2010
    Messages
    1 680
    Détails du profil
    Informations personnelles :
    Nom : Homme Hervé Silve
    Localisation : France

    Informations forums :
    Inscription : août 2010
    Messages : 1 680
    Points : 4 058
    Points
    4 058

    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
    Invité régulier
    Inscrit en
    juin 2013
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : juin 2013
    Messages : 38
    Points : 9
    Points
    9

    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •