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 :

Bloquer un CommandButton Valider et questions sur OptionButton


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 Bloquer un CommandButton Valider et questions sur OptionButton
    Bonjour,

    Je reviens à vous car je n'arrive pas à me sortir d'une situation. Je ne sais pas si ce sera possible.

    J'ai écrit un code qui permet de dire à l'utilisateur attention tel ou tel champs est vide. Je clique sur ok de ma message box , mais je peux quand même valider ma saisie alors que je n'ai pas rempli les champs.
    Dois-je utiliser Enabled et le relier par un code ?

    De plus dans ce code j'ai 3 optionbuttons, j'en coche un et ma message box m'avertie d'en sélectionner un. Est-ce parce qu'il y en a 3, il faudrait que les 3 soit cochés pour ne pas avoir un message ?
    Un autre problème se pose aussi : si je relance mon programme à la suite (sans le fermer, pour le moment j'ai mis unload me donc cela ferme) le dernier optionbutton reste sélectionné. Par conséquent, je ne peux pas le valider pour avoir l'inscription de mes valeurs.
    Existe-t-il une propriété ou solution ?

    Voici le code de mon test si les champs sont vides :

    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
    Sub TestSiVide()
     
    Dim VariTexte
    Dim Compt01
    Dim optb
     
    VariTexte = ""
    Compt01 = 0
    '---------------------------------------
    If TextBox1.Text = "" Then VariTexte = VariTexte & Chr(10) & "Saisir la Date"
    If TextBox2.Text = "" Then VariTexte = VariTexte & Chr(10) & "Saisir le N° de Charge"
    If TextBox3.Text = "" Then VariTexte = VariTexte & Chr(10) & "Saisir le N° OF"
    If TextBox4.Text = "" Then VariTexte = VariTexte & Chr(10) & "Saisir le N° OP"
     
    If ListBox1.Text = "" Then VariTexte = VariTexte & Chr(10) & "Sélectionner le nombre de pièces"
    If ComboBox1.ListIndex = -1 Then VariTexte = VariTexte & Chr(10) & "Sélectionner votre Visa"
    '---------------------------------------
    For Each optb In UserFormA.Controls
        If Left(optb.Name, 7) = "OptionB" Then
            If optb.Value = True Then Compt01 = 1
        End If
    Next
     
    If Compt01 = 0 Then VariTexte = VariTexte & Chr(10) & "Choisir entre trempe, revenu ou autre" ' OptionButton
     
    '---------------------------------------
    If VariTexte <> "" Then MsgBox VariTexte: Exit Sub
     
    If Compt01 = 0 Then MsgBox VariTexte: Exit Sub
     
     
     
    End Sub
    Et celui de mon code Valider :

    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
    Private Sub CommandButton1_Click() 'valider
    Dim DateChargement As String, NumeroDeCharge As String, NumeroDOp As String, NumeroOF As String, Nombredepieces As Variant, _
    Visa As String
     
     
    '----------------------------------------------------------------------------------------------------
    TestSiVide
    '----------------------------------------------------------------------------------------------------
     
    'Appelle de la méthode du module1 pour insérer les valeurs
    Call InsererLesDonneesDansLaFeuille(DateChargement, NumeroDeCharge, NumeroOF, NumeroDOp, ListBox1.Value, ComboBox1.Text)
    '----------------------------------------------------------------------------------------------------
    Unload Me
     
    End Sub
    Je vous remercie par avance de vos futures pistes.

    Cordialement

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Le plus simple il me semble est de transformer ta procédure TestSiVide en une fonction booléenne
    Exemple de test sur trois contrôles TextBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Function TestSiVide() As Boolean
     Dim ctrl As Control, r As Long
     For Each ctrl In Me.Controls
      If TypeOf ctrl Is MSForms.TextBox And Len(ctrl.Value) = 0 Then
       Exit Function
      End If
     Next
     TestSiVide = True
    End Function
    Et ainsi tu peux transformer la valeur de la propriété Enable du contrôle CommandButton en appelant la fonction
    Exemple pour un CommandButton nommé cmdOK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.cmdOK.Enabled = TestSiVide
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  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 Philippe,

    J'ai une erreur sur la ligne If type of. Je n'ai pas du comprendre ce qu'il fallait faire.
    Cette formule prends tous les textbox, si je comprends bien (à faire de même pour combobox et listbox) ?

    Le problème : il faut que je garde mes messages box pour l'utilisateur. Sinon il ne va pas comprendre ce qu'est textbox 1 ou 3 ou etc.
    J'ai voulu contourner le système avec MSForms qui ne me convient pas je pense.

    Je me souviens déjà l'avoir utilisé et il me nommait tous mes contrôles comme je l'avais fait sur VBA alors qu'il faudrait les noms que j'ai écrit dans les labels de mon Userform. D'où la formule MsgBox.

    Merci pour cette proposition.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'ai une erreur sur la ligne If type of. Je n'ai pas du comprendre ce qu'il fallait faire.
    Exact, il fallait placer le test sur deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      If TypeOf ctrl Is MSForms.TextBox Then
       If Len(ctrl.Value) = 0 Then Exit Function
      End If
    Le problème : il faut que je garde mes messages box pour l'utilisateur. Sinon il ne va pas comprendre ce qu'est textbox 1 ou 3 ou etc.
    Si le bouton OK n'est pas actif, l'utilisateur ne comprendra t'il pas qu'il doit encore remplir les textbox ?
    Cependant, rien ne t'empêche d'ajouter les lignes à afficher. Il faut adapter le code.
    Mon but était de te montrer comment modifier la propriété Enable du contrôle CommandButton à l'aide d'une fonction de test
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  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
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,

    Si le bouton OK n'est pas actif, l'utilisateur ne comprendra t'il pas qu'il doit encore remplir les textbox ?
    Cependant, rien ne t'empêche d'ajouter les lignes à afficher. Il faut adapter le code.
    Mon but était de te montrer comment modifier la propriété Enable du contrôle CommandButton à l'aide d'une fonction de test
    J'essaye de comprendre exactement ce qu'il faut faire et de compiler avec ce que vous me dîtes. Je ne cherche pas un code tout fait, loin de là. J'ai commencé VBA seulement depuis 2 mois et je ne suis pas du tout au point.
    Il me faut assimiler ce que vous m'expliquez.

    Dans mon programme, je me mets à la place de l'utilisateur le plus bête.

    Je sais utiliser la propriété Enabled, je l'ai déjà fait pour des checkbox que j'ai abandonné pour des optionbutton mais pour le coup je ne sais pas si j'ai eu raison car j'ai encore plus de mal.

    J'ai donc fait votre code comme ceci et supprimé le mien si j'ai bien compris :

    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
    Option Base 1
    Private Function TestSiVide() As Boolean
     
    '---------------------------------------------------------
     Dim ctrl As Control, r As Long
     For Each ctrl In Me.Controls
      If TypeOf ctrl Is MSForms.TextBox Then
       If Len(ctrl.Value) = 0 Then Exit Function
      End If
      Next
     For Each ctrl In Me.Controls
       If TypeOf ctrl Is MSForms.ComboBox Then
        If Len(ctrl.Value) = 0 Then Exit Function
       End If
       Next
    '---------------------------------------------------------
     For Each ctrl In Me.Controls
       If TypeOf ctrl Is MSForms.ListBox Then
        If Len(ctrl.Value) = 0 Then Exit Function
       End If
       Next
    '---------------------------------------------------------
     For Each ctrl In Me.Controls
       If TypeOf ctrl Is MSForms.OptionButton Then
        If Len(ctrl.Value) = 0 Then Exit Function
       End If
       Next
     
     TestSiVide = True
    End Function
    Puis j'ai ajouté votre phrase au commandbutton "valider":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.CommandButton1.Enabled = TestSiVide
    Est-ce comme ceci qu'il faut procéder ? Car en faisant ceci mon bouton valider n'est en aucun cas grisé.
    J'essaie vraiment de comprendre et non de copier.
    En ajoutant mes morceaux de codes du poste #1 des messages box rien ne se passe non plus.

    Je n'ai jamais utilisé Function malgré avoir lu certains tutoriaux.

    Par conséquent, j'aurai besoin d'un tutoriel très explicatif (alors que j'en ai déjà lu beaucoup) ou que vous preniez un peu de votre temps pour m'expliquer. Sans vouloir abuser.

    Je vous remercie

  6. #6
    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,

    tu n'es pas obligé de reboucler sur chacun des contrôles, tu peux mettres des If...End if les uns à la suites des autres :

    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
    Private Function TestSiVide() As Boolean
     
    TestSiVide = False
     
    '---------------------------------------------------------
     Dim ctrl As Control, r As Long
     For Each ctrl In Me.Controls
       If TypeOf ctrl Is MSForms.TextBox Then
         If Len(ctrl.Value) = 0 Then Exit Function
       End If
    '---------------------------------------------------------
       If TypeOf ctrl Is MSForms.ComboBox Then
         If Len(ctrl.Value) = 0 Then Exit Function
       End If
    '---------------------------------------------------------
       If TypeOf ctrl Is MSForms.ListBox Then
         If Len(ctrl.Value) = 0 Then Exit Function
       End If
    '---------------------------------------------------------
       If TypeOf ctrl Is MSForms.OptionButton Then
         If Len(ctrl.Value) = 0 Then Exit Function
       End If
     Next
     
    TestSiVide = True
    End Function
    Le Code de Phillipe est a adapté suivant tes besoins. Ceci dit, je pense qu'il faut ajouter un bout de code dans la fonction, au dessus de la boucle
    Ensuite, une fonction c'est un peu comme en math.

    Nous avons la fonction f(x) = 4x + 3. Cette fonction a un paramètre (x), et renvoie une valeurs, en l’occurrence, le résultat de l'opération 4x+3.
    Une fonction en programmation c'est pareille, mais un peu plus étendue.

    Cette fonction TestSiVide() ne prend pas de paramètre, mais va effectuer une opération. En l’occurrence, un simple test sur les différents contrôles de ton userform. Et elle va alors prendre une valeurs de type booléenne, donc "True" ou "False", en fonction des test.

    Et Phillipe se sert justement du résultat de cette fonction pour continuer son programme.

Discussions similaires

  1. Question sur le processus de validation d'un article.
    Par Christophe dans le forum Contribuez
    Réponses: 1
    Dernier message: 23/04/2014, 22h26
  2. Petite question sur les validations
    Par chris81 dans le forum Silverlight
    Réponses: 2
    Dernier message: 10/09/2010, 17h29
  3. [SAX] Question sur la validation d'un doc XML
    Par nahr_Elk dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 19/10/2009, 11h28
  4. Encore une question sur le Validator Plugin
    Par vny dans le forum Struts 1
    Réponses: 10
    Dernier message: 26/07/2007, 14h34
  5. [Struts-layout] question sur la validation
    Par romdelf dans le forum Struts 1
    Réponses: 2
    Dernier message: 11/05/2006, 16h30

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