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 :

Verification controle option bouton


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 441
    Par défaut Verification controle option bouton
    Bonjour

    dans mon usf j'ai plusieurs frames comportant des boutons options et un bouton valider qui doit être grisé à l'ouverture de l'usf (enabled=false)

    ce bouton doit passer à enabled=true quand dans chaque frame un bouton option est coché.

    je me heurte à l'écriture de ce test

    si vous avez des idées

    cordialement

  2. #2
    Expert confirmé

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 169
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    sans passer par une classe personnalisée (que je ne maîtrise pas), voici une solution :

    1) Une fonction qui teste dans un frame si au moins un optionbutton est coché

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Function ChoixFait(MonFrame As MSForms.Frame) As Boolean
    Dim MonOptionButton As Control
        For Each MonOptionButton In MonFrame.Controls
            If TypeOf MonOptionButton Is MSForms.OptionButton Then
                If MonOptionButton Then
                    ChoixFait = True
                    Exit Function
                End If
            End If
        Next MonOptionButton
    End Function
    2) Une procédure qui va boucler sur chaque Frame du Userform et appeler la fonction précédente, pour vérifier si on active le bouton ou non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub Action()
        Dim MonControl As Control
        Me.CommandButton1.Enabled = True
        For Each MonControl In Me.Controls
            If TypeOf MonControl Is MSForms.Frame Then
                If Not ChoixFait(MonControl) Then
                    Me.CommandButton1.Enabled = False
                    Exit Sub
                End If
            End If
        Next MonControl
    End Sub

    3) Dans le Userform_Initialize, on lance la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub UserForm_Initialize()
        Action
    End Sub
    4) Dans CHAQUE procédure _Click des OptionButton, on lance également la procédure
    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 OptionButton1_Click()
        Action
    End Sub
     
    Private Sub OptionButton2_Click()
        Action
    End Sub
     
    Private Sub OptionButton3_Click()
        Action
    End Sub
     
    Private Sub OptionButton4_Click()
        Action
    End Sub

    La classe personnalisée éviterait l'étape 4 qui peut être fastidieuse si tu as 50 frames et 500 optionbutton ...

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 441
    Par défaut
    Merci Joel

    je vais tester cela

  4. #4
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Je ne vois pas la structure du formulaire de notre ami.
    En complément de joe.levrai (que je salue au passage)

    Exemple simplifié à adapter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Explicit
     
    Private Sub UserForm_Initialize()
    Btn_Valide.Enabled = False
    End Sub
     
    Private Sub Opt_1_Click()
    Btn_Valide.Enabled = ((Opt_1 = True) And (Opt_2 = True))
    End Sub
     
    Private Sub Opt_2_Click()
    Btn_Valide.Enabled = ((Opt_1 = True) And (Opt_2 = True))
    End Sub

    Remarque : Ici, pas d'utilisation de condition explicite (If) mais utilisation de valeurs booléennes.
    Méthode qui, à mon humble avis, n'est pas assez utilisée.

    En effet, pour illustrer sur un autre exemple,on peut très bien écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monbouton.Visible = (macellule.Value = 2)
    plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    monbouton.Visible = Iif(macellule.Value =2,True,False)
    Ce n'est qu'un exemple, mais, dans bien des cas, le code s'en trouve bien simplifié.

    Par ailleurs, comme le signale Joe, au bout de 3 évènements identiques, mieux vaut passer par un module de classe.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 441
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Opt_1_Click()
    Btn_Valide.Enabled = ((Opt_1 = True) And (Opt_2 = True))
    End Sub
    opt_1 et opt_2 ne peuvent pas être à true en même temps c'est le principe des boutons option non ?
    @+

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bien sûr!

    C'était juste un cas qu'il faut adapter.
    Dans mon cas, les 2 boutons d'option appartenaient à 2 Frame différents.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 441
    Par défaut
    donc dans ton cas
    je devrais répéter cette ligne dans sub opt_2_click

  8. #8
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Oui.
    Je reviens avec un exemple de module de classe

  9. #9
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Voilà! Voilà!

    (Je me répète : Opt_1 et Opt_2 appartiennent ici à 2 Frame différents)

    Juste pour le fun.

    Création du module de classe nommé "Classe_bouton"

    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
    Option Explicit
     
    Public WithEvents lebtn As MSForms.OptionButton
     
    'Gestion des évènements affectés aux objets
     
    Private Sub lebtn_click()
     
    Dim i As Byte, j As Byte
     
    With Usf_Test
            For i = 1 To 2
                    If .Controls("Opt_" & i) = True Then j = j + 1
            Next i
            .Btn_Valide.Enabled = (j = 2)
    End With
     
    End Sub
     
    Private Sub lebtn_Change()
     
    With Usf_Test
        .Btn_Valide.Enabled = lebtn
    End With
     
    End Sub
    Code affecté au formulaire Usf_Test

    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
    Option Explicit
     
    'Nouvelle classe d'Objets
    Dim classopt() As New Classe_bouton
     
    Private Sub UserForm_Initialize()
     
    Btn_Valide.Enabled = False
     
    Dim i As Byte
     
    'Affectation de chaque objet à la classe créée
    For i = 1 To 2
            ReDim Preserve classopt(1 To i)
            Set classopt(i).lebtn = Controls("Opt_" & i)
    Next i
     
    End Sub
    Attention à la nomenclature des objets.

    C'est, du moins en ce qui me concerne, la grande majorité des utilisations de modules de classe.
    Il y en a d'autres, beaucoup plus compliqués.

    La grande utilité : éviter la redondance des évènements pour un même type d'objet.

    Sauf erreur, Pierre Fauconnier a écrit un tutoriel à ce sujet.

Discussions similaires

  1. Comment copier des option boutons d'une feuille à une autre en vba?
    Par muska78 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 11/06/2008, 16h50
  2. Réponses: 23
    Dernier message: 24/08/2007, 09h53
  3. Controller le bouton "Back"
    Par Prosis dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/11/2006, 16h18
  4. Réponses: 6
    Dernier message: 07/02/2006, 21h06
  5. Controle option bouton
    Par krfa1 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/10/2005, 14h48

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