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 :

CheckBox - Valeur=false si Visible=false


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Superviseur de Hotline

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut CheckBox - Valeur=false si Visible=false
    Bonjour,

    Je cherche à créer un configurateur. Le but, répondre à une serie de questions concernant les options vouluent dans notre aplication afin de créer un fichier qui resume les options choisi.

    Certaines options sont liées à d'autres et donc, si une option n'est pas selectionnée une ou plusieurs sous-options ne seront pas proposées.

    Pour ce faire, j'utilise des Checkboxes ainsi que des Optionbuttons.

    Mon problème est le suivant:
    Dans le cas ou on a 2 options (Option1 et Option2) et que Option2 a 3 sous-options qui sont dans un premier temps non visible (Option2.SousOption1, Option2.SousOption2 et Option2.SousOption3)

    Nom : image1.png
Affichages : 1196
Taille : 4,2 Ko

    l'opérateur selectionne l'option2. Les sous-options apparaissent, et il selectionne la sous-option2

    Nom : image2.png
Affichages : 1185
Taille : 6,3 Ko

    Ensuite, il réalise qu'il ne voulais pas Option2 mais Option1. Il décocoche uniquement Option2 et selection Option1

    Nom : image3.png
Affichages : 1566
Taille : 5,4 Ko

    Le résultat qu'il s'attend a avoir:
    Option1=1
    Option2=0
    SousOption1=0
    SousOption2=0
    SousOption3=0

    Nom : image3.png
Affichages : 1566
Taille : 5,4 Ko

    Le résultat qu'il obtien:
    Option1=1
    Option2=0
    SousOption1=0
    SousOption2=1
    SousOption3=0

    Ma question: Existe-t-il un moyen simple de dire que si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CheckBox.Visible = False Then CheckBox.Value = False
    ?

    Il faut savoir que j'ai dans mon code 270 Options différentes je chercherais donc une autres solution que celle de recopier la ligne de code que j'ai mis dans ma question

    J'ai regardé dans la liste des events de checkbox mais visible et unvisible n'existe pas.

    Merci d'avance pour vos réponses

  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,
    Ma question: Existe-t-il un moyen simple de dire que si
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CheckBox.Visible = False Then CheckBox.Value = False
    Rien de plus simple que ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CheckBox.Visible = CheckBox.Value
    mais le problème c'est qu'ensuite tu ne pourras plus rien faire puisque CheckBox ne sera plus visible mais Je suppose qu'ils portent des noms différents
    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
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    un petit exemple bien sympa

    3 checkbox maitres optionx(1,2,3)
    ces 3 checkbox ont 2 subcheckbox dont la visibilté depend de leur maitre respectif
    IMPORTANT !! ces subcheckboxs ont dans le tag le nom de leur maitre

    et en prime tu a le rollupdown(replacement des checkbox visible voir demo ci dessous)
    il te sera tres facile d'intégrer ca pourquoi pas dans un module classe afin d'integrer le nombre de checkbox que tu veux

    le nombre de subcheckboxs peut etre différent pour chaque maitre ca change rien pourvu seulement que leur tag soit duement renseigné


    exemple du code
    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 Sub optionx1_Click(): maitreclick optionx1: End Sub
    Private Sub optionx2_Click(): maitreclick optionx2: End Sub
    Private Sub optionx3_Click(): maitreclick optionx3: End Sub
    Private Sub maitreclick(check)
        Dim ctrl As Object, subctrl As Object, plus&, letop
        For Each ctrl In Me.Controls
            If ctrl.Tag = check.Name Then ctrl.Visible = check.Value: ctrl.Value = False
        Next
        letop = optionx1.Top
        plus = 0
        For Each ctrl In Me.Controls
            If ctrl.Name Like "optionx*" Then
                ctrl.Top = letop + plus
                plus = plus + 26
                For Each subctrl In Me.Controls
                    If subctrl.Tag = ctrl.Name And subctrl.Visible = True Then
                        subctrl.Top = letop + plus
                        plus = plus + 26
                    End If
                Next
            End If
        Next
    End Sub
    Private Sub UserForm_Activate()
    maitreclick optionx1
    End Sub
    apercu en mode edition VBE
    Nom : Capture.JPG
Affichages : 1186
Taille : 133,9 Ko

    apercu en fonctionnement
    Nom : demo.gif
Affichages : 1186
Taille : 150,3 Ko

    bonne soirrée
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  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,

    Avec 270 options, la gestion ne va pas être de la tarte mais une possibilité est d'utiliser la propriété Tag des CheckBox parents pour y inscrire les noms de CheckBox enfants soit dans la procédure "UserForm_Initialize()" soit en dur dans la fenêtre des propriété (ici, dans la proc). Il y a CheckBox1 qui n'a pas d'enfants et CheckBox2 qui en a 3 (CheckBox3, 4 et 5) :
    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
     
    Private Sub UserForm_Initialize()
     
        'dans la propriété Tag de la CheckBox parent, inscrire les noms des CheckBox enfants
        CheckBox2.Tag = "CheckBox3,CheckBox4,CheckBox5"
     
    End Sub
     
    Private Sub CheckBox1_Click()
     
        AfficherMasquer CheckBox1
     
    End Sub
     
    Private Sub CheckBox2_Click()
     
        AfficherMasquer CheckBox2
     
    End Sub
     
    Sub AfficherMasquer(Chk As MSForms.CheckBox)
     
        Dim T
        Dim I As Integer
     
        T = Split(Chk.Tag, ",")
     
        For I = 0 To UBound(T)
     
            Me.Controls(T(I)).Visible = Chk.Value 'Masque/Affiche
            If Chk.Value = False Then Me.Controls(T(I)).Value = False 'remet à False si cachée
     
        Next I
     
    End Sub

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour theze
    j'ai fait l'inverse
    les tags utilisés sont ceux des enfants qui contient le nom du parent
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

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

    Pour modifier la propriété Visible d'une série de contrôles lorsque l'on clique sur un autre contrôle, j'utilise des contrôles Frame ce qui permet de réduire fortement le code de mes procédures

    Exemple
    Dans un UserForm, nous avons deux OptionButton nommés respectivement optNeige et optSolei et à l'intérieur de deux contrôles Frame nommés respectivement frmNeige et frmSoleil à l'intérieur desquels nous avons une série d'autres contrôles comme illustrés ci-dessous

    Nom : VisibleInvisble_Init.png
Affichages : 1149
Taille : 21,8 Ko

    Dans le module du UserForm, j'ai une procédure que nous nommerons pour l'exemple StatusCheck qui modifiera la propriété des deux contrôle Frame en fonction de l'option sélectionnée et deux procédure événementielles optNeige_Click et optSoleil_Click qui invoquera la procédure StatusCheck

    Code de la procédure StatusCheck
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub StatusCheck()
      With Me
      .frmSoleil.Visible = Not optNeige.Value
      .frmNeige.Visible = Not optSoleil.Value
      End With
    End Sub
    Les deux procédures événementielles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub optNeige_Click()
      StatusCheck
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub optSoleil_Click()
      StatusCheck
    End Sub
    Nom : VisibleInvisble.png
Affichages : 1158
Taille : 8,1 Ko

    Rien n'empêche évidemment d'utiiliser la propriété Tag en écrivant le nom des Frame
    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

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    bien vu le coup des frame

    et pour en faire une sorte de menu rollupdown

    exemple
    j'ai mis des frames l'une sous l'autre,elles ont toutes le tag "menu" (IMPORTANT)
    a l'interieur de ces frames j'ai mis non seulement le checkbox maitre mais aussi ces enfants
    au click de chaque maitre le height de la frame parent change en fonction de sa valeur c'est tout
    j'ai ajouté une petite sub rollupdown pour les réalignement dynamique

    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
    Private Sub CheckBox1_Click()
        maitreclick CheckBox1
    End Sub
    Private Sub CheckBox5_Click()
        maitreclick CheckBox5
    End Sub
    Private Sub CheckBox9_Click()
        maitreclick CheckBox9
    End Sub
    Private Sub CheckBox13_Click()
        maitreclick CheckBox13
    End Sub
    Private Sub maitreclick(check)
        Dim ecart As Long
        With check
            ecart = .Parent.Controls(2).Top - .Parent.Controls(1).Top
            .Parent.Height = IIf(.Value = True, .Parent.Controls.Count * ecart, .Parent.Controls(1).Height)
        End With
        rollupdown
    End Sub
    'facultatif
    Private Sub rollupdown()
        Dim ctrl As Object, letop As Long
      letop = Frame1.Top    'recupération du top de la 1°frame
        For Each ctrl In Me.Controls
            If ctrl.Tag = "menu" Then
                ctrl.Top = letop
                letop = letop + ctrl.Height
            End If
        Next
    End Sub
    Private Sub UserForm_Activate()
       Dim ctrl
        For Each ctrl In Me.Controls
            If ctrl.Tag = "menu" Then ctrl.Height = ctrl.Controls(1).Height
        Next
        rollupdown
    End Sub
    vue dans l'editeur vbe
    Nom : Capture.JPG
Affichages : 1149
Taille : 84,6 Ko
    vue en fonctionnement
    Nom : demo.gif
Affichages : 1136
Taille : 94,0 Ko
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Membre régulier
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Superviseur de Hotline

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Merci beaucoup pour vos réponses,

    J'ai testé vos solutions et elles fonctionnent très bien avec les check boxes.

    Cependant, je ne vais pas encore dire que ce topic est résolu. Je le garde ouvert car (même si ma question parlait uniquement de checkbox) je suis en train de réfléchir sur comment adapter vos solutions à des OptionBoutons, des ComboBoxes et des CheckBoxes. Tous ces differents contrôles sont susceptibles d'être le parent d'un autre.

    Je me permettrais donc de réutiliser ce topic pour poser mes éventuelles questions (afin de ne pas créer plusieurs topics pour des sujets similaires).

    Encore une fois merci pour vos solutions qui m'ont déjà permis d'avancer dans mon code.

  9. #9
    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,
    N'ayant pas analysé en détail les réponses des autres contributeurs, je ne peux répondre à leur place mais dans la solution que j'ai proposée, tu peux placer tous les contrôles que tu souhaites à l'intérieur d'un Frame puisque c'est lui qui est soit visible, soit masqué. C'est d'ailleurs valable pour d'autres propriétés.
    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

  10. #10
    Membre régulier
    Homme Profil pro
    Superviseur de Hotline
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Superviseur de Hotline

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Effectivement, je me suis focalisé sur les contrôles alors que je n'avais qu'à regarder les frames.

    Alors de mon côté, c'est tout bon.

    Merci à tous

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

Discussions similaires

  1. Valeur d'un champ TextBox avec propriété visible = false
    Par mohamed301084 dans le forum VB.NET
    Réponses: 4
    Dernier message: 26/04/2010, 16h02
  2. Réponses: 5
    Dernier message: 06/01/2010, 21h28
  3. [GridView][datafield] récuperer un visible=false
    Par Mcfly123 dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/04/2007, 14h25
  4. [VBA-E] feuilles visibles = false sur le workbook open
    Par SpaceFrog dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/04/2007, 16h05
  5. Réponses: 6
    Dernier message: 26/07/2006, 11h00

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