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 : Résumé, Bloquer des commandes, Valider [XL-2013]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Par défaut Userform : Résumé, Bloquer des commandes, Valider
    Bonjour,

    Après 70 pages de recherche avec le mot "userform", je n'ai pas trouvé mon bonheur. Peut être que je suis passée à côté.

    J'aimerai avoir des pistes pour les mots à employer ou boucles pour :

    1) Ouvrir après la validation de mon userform une page de relecture pour vérifier si j'ai bien entré mes valeurs. Si malencontreusement j'ai fait une erreur, j'aimerai réouvrir mon userform avec mes données déjà saisies.
    Par la même occasion après ce code, pourrai-je laisser Userform Me ?

    2) Bloquer les CommandBox afin de ne pas pouvoir saisir d'autres mots que ceux marqués. J'ai essayé l'option Locked mais si je l'active je ne peux plus rien sélectionner, ni écrire.
    Je ne me suis pas servie de ListBox car je n'arrive pas à les employées, plein d'erreurs se mettent en place. Si vous avez des conseils, je les prends avec plaisir.

    3) Empêcher la validation de l'Userform si tout les champs ne sont pas saisis. J'aimerai éviter d'avoir des messages box tout le temps, je trouve ceci moins ergonomique pour un utilisateur qui la plupart du temps ne lira pas le message je pense. Un message général pour signaler que tel ou tel champ n'a pas été renseigné serait idéal.
    Après ce message d'erreur de saisie, le curseur devra retourner sur la case non saisie (si c'est possible).

    Je vous remercie de vos réponses, je ne cherche pas des codes tout fait car mon but c'est d'apprendre.

    Cordialement

  2. #2
    Membre émérite Avatar de keygen08
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 545
    Par défaut
    BBonjour
    1) Ouvrir après la validation de mon userform une page de relecture pour vérifier si j'ai bien entré mes valeurs. Si malencontreusement j'ai fait une erreur, j'aimerai réouvrir mon userform avec mes données déjà saisies.
    Utiliser userform1.hide au lieu et place de unload me

    2) Bloquer les CommandBox afin de ne pas pouvoir saisir d'autres mots que ceux marqués. J'ai essayé l'option Locked mais si je l'active je ne peux plus rien sélectionner, ni écrire.
    Je ne me suis pas servie de ListBox car je n'arrive pas à les employées, plein d'erreurs se mettent en place. Si vous avez des conseils, je les prends avec plaisir.
    mettre les proprieté du contrôle à true dans matchrequired


    3) Empêcher la validation de l'Userform si tout les champs ne sont pas saisis. En effet, en testant j'ai constaté que je pouvais valider sans rien avoir saisie. Dois-je utiliser une boucle avec if then ? J'aimerai éviter d'avoir des messages box tout le temps, je trouve ceci moins ergonomique pour un utilisateur qui la plupart du temps ne lira pas le message je pense.
    Après ce message d'erreur de saisie, le curseur devra retourner sur la case non saisie (si c'est possible).
    if then est bien la solution. On gagne du temps en nommant tous les controles ne devant pas etre vide du meme nom ex:combo1, combo2......
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Dim i As Integer
    For i = 1 To 12
        If UserForm1.Controls("combo" & i) = "" Then
        UserForm1.Controls("combo" & i).SetFocus
        Exit Sub
        End If
    Next i

  3. #3
    Membre averti
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Par défaut
    Bonjour Keygen,

    J'essaierai la solution 1 cet après-midi, voir si c'est ce que je souhaite.

    La solution 2 fonctionne, mais si je tape autre chose il me marque "la valeur de cette propriété n'est pas valable". Est-il possible de ne pas voir ce message ou d'en changer le message ?

    La solution 3 : Mon code ressemblait à ceci répéter autant de fois que de Textbox:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If TBDate.Text = "" Then
        MsgBox "Veuillez saisir une date S.V.P."
        Exit Sub
    End If
    C'est pour cela que je cherchais un message généralisé, qui résume toutes les TextBox d'un coup. Je pense que j'ai édité mon message pendant que vous étiez en train de répondre. Je testerai votre code cet après midi.

    Je vous remercie de votre réponse

  4. #4
    Expert confirmé
    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
    Par défaut
    Bonjour,

    Ouvrir après la validation de mon userform une page de relecture pour vérifier si j'ai bien entré mes valeurs. Si malencontreusement j'ai fait une erreur, j'aimerai réouvrir mon userform avec mes données déjà saisies.
    Tu n'es pas obligé de fermer la Form, tu peux utiliser un Label que tu cache et affiche en fonction des besoins. Pour le test, pose 3 TextBox, 1 ComboBox, 1 Label et un CommadButton sur une Form vierge sans modifier leurs nom par défaut puis tu colle le code ci-dessous dans le module de la Form. Le bouton doit être assez large pour afficher le Caption :
    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
    50
    51
    52
    53
    54
    55
    56
     
    Private Sub UserForm_Initialize()
     
        Dim I As Integer
     
        For I = 1 To 10
     
            ComboBox1.AddItem "Valeur " & I
     
        Next I
     
        CommandButton1.Caption = "Vérification des valeurs"
        Label1.Visible = False
     
    End Sub
     
    Private Sub CommandButton1_Click()
     
        Dim I As Integer
     
        For I = 0 To Me.Controls.Count - 1
     
            With Me.Controls(I)
     
                If InStr(Me.Controls(I).Name, "TextBox") <> 0 Then .Visible = Not .Visible
     
                If InStr(Me.Controls(I).Name, "ComboBox") <> 0 Then .Visible = Not .Visible
     
            End With
     
        Next I
     
        If CommandButton1.Caption = "Vérification des valeurs" Then
     
            CommandButton1.Caption = "Retour aux valeurs saisies"
     
        Else
     
            CommandButton1.Caption = "Vérification des valeurs"
     
        End If
     
        With Label1
     
            .Visible = Not .Visible
     
            .Caption = "Valeur saisie pour le TextBox1 : " & TextBox1.Text & vbCrLf & _
                       "Valeur saisie pour le TextBox2 : " & TextBox2.Text & vbCrLf & _
                       "Valeur saisie pour le TextBox3 : " & TextBox3.Text & vbCrLf & _
                       "Valeur saisie pour le ComboBox1 : " & ComboBox1.Text & vbCrLf & _
                       vbCrLf & _
                       "Veuillez vérifier que les valeurs entrées soient les bonnes !"
     
        End With
     
    End Sub
    Bloquer les CommandBox afin de ne pas pouvoir saisir d'autres mots que ceux marqués. J'ai essayé l'option Locked mais si je l'active je ne peux plus rien sélectionner, ni écrire.
    Si ce que tu désire c'est que les seules valeurs qui puissent être entrées dans le ComboBox sont les valeurs de la liste alors, utilise la propriété "Style" en la mettant sur "fmStyleDropDownList" (valeur 2)
    Empêcher la validation de l'Userform si tout les champs ne sont pas saisis. J'aimerai éviter d'avoir des messages box tout le temps, je trouve ceci moins ergonomique pour un utilisateur qui la plupart du temps ne lira pas le message je pense. Un message général pour signaler que tel ou tel champ n'a pas été renseigné serait idéal.
    Après ce message d'erreur de saisie, le curseur devra retourner sur la case non saisie (si c'est possible).
    Là, il te faut mettre en place une procédure de contrôle (avec des If Then Else, Select Case et autres) par exemple sur un bouton "Valider" et/ou guider l'utilisateur par un cheminement précis avec des activations/désactivations de contrôles (propriété Enabled) mais pour ça, tu es la seule qui sait les valeurs à contrôler !

    Hervé.

  5. #5
    Membre averti
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Par défaut
    Je vous remercie de vos réponses.

    Point N°1 : Ouvrir après la validation de mon userform une page de relecture

    Keygen
    La formule Unload.Hide ne me convient pas, car si je veux valider et que je réouvre à nouveau mon Userform, les valeurs sont encore là. C'est la raison pour laquelle je fais Unload Me. Je me suis peut être trompée en le plaçant dans le programme (sur Valider_click) et je n'ai pas saisi.

    Theze
    Votre façon est idéale. Si j'ajoute un bouton valider il me faut le cacher lors de ma saisie et l'afficher lors de ma relecture. C'est bien cela ?
    C'est un peu lourd comme Userform certes mais si c'est le seul moyen, je prends.
    Ma façon de penser était de faire une double validation : Je saisis (normalement je me relis) -> Je valide -> Je vérifie ma saisie -> Je confirme ma relecture.

    Point N°2 : Bloquer les CommandBox afin de ne pas pouvoir saisir d'autres mots que ceux marqués

    Quelle est la différence entre Matchrequired et Style ? Je ne comprends pas car les deux font exactement ce que je demandais.
    Mise à part Matchrequired qui m'affiche "la valeur de cette propriété n'est pas valable" et Style qui reste surligné sur la valeur.
    J'ai opté pour le moment sur Matchrequired car la valeur n'est pas surligné, même si le message me gêne. Il apparaît lorsque la boîte est vide, c'est-à-dire quand l'utilisateur n'a pas sélectionné de données.

    Point N°3 : Empêcher la validation de l'Userform si tout les champs ne sont pas saisis

    Keygen
    Je n'ai pas saisi. En fait je nomme tous mes contrôle comboXXX et en fait avec votre code va rechercher tous les contrôles commençant par ce nom ? Etant débutante je tiens à savoir de quoi je parle dans mes variables. S'il faut juste ajouter ce mot avant cela ne me dérange pas. Par exemple puis-je écrire combodate, combonuméro, combopieces ?

    Theze
    Je n'ai jamais étudié Enabled, je vais me pencher sur ce sujet pour savoir quel est son utilité.

  6. #6
    Membre émérite Avatar de keygen08
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2012
    Messages : 545
    Par défaut
    pour combo, c'est pas tout a fait cela, les controles doivent porter le meme nom suivi d'un numero
    ex: listbox1, listbox2, listbox3

    Sinon on liste tout les contrôle et on verifie qu'il commence par quelque chose de commun en changeant la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If UserForm1.Controls("combo" & i) = "" Then
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    par If UserForm1.Controls.name  like "C*" then
    auquel cas nos contrôle s'appelerait Cdate, Cnumero.....

    mais cette methode fonctionne (tout depend du nombre de contrôle a verifier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If TBDate.Text = "" Then
        MsgBox "Veuillez saisir une date S.V.P."
    Tbdate.setfocus
        Exit Sub
    End If
    mais il existe encore plein d'autre methode, a employer fonction du resultat à obtenir, de la manière dont l'utilisateur saisi les données, de la fainéantise du programmeur.....(On parle de moi).

  7. #7
    Membre averti
    Femme Profil pro
    technicien matériaux
    Inscrit en
    Septembre 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : technicien matériaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 39
    Par défaut
    D'accord, je vous remercie pour cette explication sur combo. Comme je l'ai dit il me faut un descriptif, comment dire... J'ai une mémoire de poisson rouge.
    Je vais rester sur mon code avec en plus le mot SetFocus. Le curseur va dans la case concernée, c'est super !

    Oui la méthode fonctionne je le sais, l'ayant testée avant de poster ce sujet. Seulement, je voulais un messagebox pour la totalité des champs non saisis et non un messagebox par contrôle. Je dois mal m'exprimer, mais je n'arrive pas à m'expliquer.

    Je vérifie six contrôles afin de savoir si tous les champs sont remplis donc non vide. 4 TextBox et 2 Combotext. J'ai dupliqué cette petite formule 6 fois donc. C'est un peu lourd mais ça fonctionne, je ne pense pas avoir fait au plus simple. Du coup, l'utilisateur devra cliquer à chaque fois sur OK avant de valider, tant qu'il n'aura pas tout rempli. Après tout cela lui apprendra de faire le fainéant.

    Par contre Matchrequired m'inquiète pour l'utilisateur. Une fenêtre "Valeur de propriété non valide" s'affiche si je ne tape pas la bonne lettre ou chiffre.
    J'utiliserai bien Style mais il surligne le chiffre et on voit mal ce qui est marqué. Une solution peut être trouvée pour l'un des deux ou non ?

  8. #8
    Membre émérite Avatar de Nico Chg
    Homme Profil pro
    Apprenti ingénieur Business Development
    Inscrit en
    Juillet 2014
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Apprenti ingénieur Business Development
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juillet 2014
    Messages : 352
    Par défaut
    Bonjour,

    Je vérifie six contrôles afin de savoir si tous les champs sont remplis donc non vide. 4 TextBox et 2 Combotext. J'ai dupliqué cette petite formule 6 fois donc. C'est un peu lourd mais ça fonctionne, je ne pense pas avoir fait au plus simple.
    Si tu as plus de 6 controles, ça peut devenir un peu lourd de dupliquer du code comme ça. Je te propose de parcourir les différents controles de ton formulaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim ObjControl As Object
    Dim ControlName as string
    ControlName = ""
     
    For Each ObjControl In Me.Controls
        If TypeOf ObjControl Is MSForms.Textbox And ObjControl.value = "" Then
            ControlName = ControlName + ObjControl.Name + "/n"
        End If
        If TypeOf ObjControl Is MSForms.Combobox and ObjControl.value = "" Then
            ControlName = ControlName + ObjControl.Name + "/n"
        End If
    Next
     
    Msgbox "Vous n'avez pas rempli les contrôles suivant : " & ControlName
    Si je ne me trompe pas, dans ce code tu parcours chacun des contrôles de ton Userform. S'il s'agit d'une textbox ET si elle est vide, le nom s'ajoute à la variable ControlName. Pareil pour les Combobox.

    Je ne me suis pas servie de ListBox car je n'arrive pas à les employées, plein d'erreurs se mettent en place. Si vous avez des conseils, je les prends avec plaisir.
    Je pense qu'une solution avec des Listbox est envisageable, mais quelles erreurs as tu eu ? Puis je voir ton code ?

    En espérant t'aider,
    Nicolas

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 11/11/2007, 15h18
  2. Transmettre des commandes à un process lancé par ksh
    Par jojolepabo dans le forum Linux
    Réponses: 3
    Dernier message: 19/10/2005, 16h05
  3. Réponses: 3
    Dernier message: 24/05/2004, 16h20
  4. Interception des commandes in et out
    Par KDD dans le forum x86 16-bits
    Réponses: 13
    Dernier message: 18/12/2002, 16h55
  5. Réponses: 3
    Dernier message: 02/09/2002, 18h49

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