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 :

Hiérarchiser des checkbox [XL-365]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut Hiérarchiser des checkbox
    Bonjour,
    Recherche infructueuse sur l'ensemble du NET, je me retourne vers vous.
    J'ai un formulaire avec des questions simples (validé / non validé) structurées par chapitre. Je peux répondre à l'ensemble des questions mais je peux aussi valider le chapitre et alors l'ensemble des questions qui en dépendent sont automatiquement validées. Jusque là, j'ai su faire avec le code suivant (pour un exemple de chapitre de 8 checkbox):

    Private Sub CheckBox1_click()
    Dim i As Long
    With ActiveSheet
    If CheckBox1 = True Then
    For i = 2 To 9
    With .OLEObjects("CheckBox" & i)
    .Object.Value = True
    End With
    Next i
    Else
    For i = 2 To 9
    With .OLEObjects("CheckBox" & i)
    .Object.Value = False
    End With
    Next i
    End If
    End With
    End Sub

    Mon problème : si je valide le chapitre, je ne peux pas dévalider une question dépendante. Dans mon cas de 8 questions, si j'en ai 7 à valider, je souhaiterais pouvoir valider les 8 et en dévalider 1 - fonctionnalité qui me semble pouvoir être appréciable.
    Je suis preneur de tout conseil.

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Bonjour, voici une idée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub CheckBox1_Click()
        Dim i As Long
     
        ' Si CheckBox1 est cochée, coche toutes les autres ; sinon, décoche toutes les autres
        For i = 2 To 9
            Me.Controls("CheckBox" & i).Value = Me.Controls("CheckBox1").Value
        Next i
    End Sub

  3. #3
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 575
    Par défaut
    bonjour,
    pour info, on ne teste pas un Boolean pour mettre la même valeur à un autre Boolean

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub CheckBox1_click()
        Dim i As Long
        With ActiveSheet
            For i = 2 To 9
                .OLEObjects("CheckBox" & i).Object.Value = CheckBox1
            Next i
        End With
    pour le reste je ne vois pas pourquoi tu ne pourrais pas décocher la question 8

    Désolé franc mais de toute évidence j'écris moins vite que toi

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    bonjour,
    pour info, on ne teste pas un Boolean pour mettre la même valeur à un autre Boolean

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub CheckBox1_click()
        Dim i As Long
        With ActiveSheet
            For i = 2 To 9
                .OLEObjects("CheckBox" & i).Object.Value = CheckBox1
            Next i
        End With
    pour le reste je ne vois pas pourquoi tu ne pourrais pas décocher la question 8

    Désolé franc mais de toute évidence j'écris moins vite que toi
    Pas de souci, c'est toujours bien d'avoir le choix entre différentes solutions

  5. #5
    Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Merci pour la rapidité de vos retours.

    Malheureusement, le code est probablement plus propre mais le résultat est le même : la propriété Enabled de mes checkbox "filles" passe automatiquement sur "False" et je ne peux donc les décocher. J'ai essayé de forcer la propriété sans y parvenir.

  6. #6
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 575
    Par défaut
    La propriété Enabled ne peut pas passer automatiquement à False ou alors tu il faut nous montrer la partie de code qui le fait.

    Ou plus simplement la supprimer.

  7. #7
    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,
    Voici une proposition
    Dans une feuille plusieurs CheckBox nommés chk_Chap_1_0 ...chk_Chap_1_3 et chk_Chap_2_0 ...chk_Chap_2_3
    Chaque CheckBox se trouve dans un groupe Chap_1, Chap_2, etc.
    Dès que l'on clique sur un CheckBox suffixé 0, tous les CheckBox du groupe prennent la même valeur que celui-ci

    Une procédure UpdateGroupCheckboxState qui se charge de faire la modification de la propriété Value des CheckBox et autant de procédures événementielles qu'il n'y a de CheckBox suffixé "0"

    Code de l'une des procédures événementielles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub chk_Chap_1_0_Click()
      With Me.chk_Chap_1_0
        UpdateGroupCheckboxState .GroupName, .Value
      End With
    End Sub
    La procédure qui modifie la propriété Value des CheckBox du même groupe
    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
    Sub UpdateGroupCheckboxState(GroupName As String, Flag As Boolean)
        Dim oleObj As OLEObject
        Dim prefix As String
        Dim suffix As String
     
        ' Extrait le préfixe de nom de groupe
        prefix = GroupName & "_"
     
        ' Parcourir tous les OLEObjects de la feuille
        For Each oleObj In Me.OLEObjects
            If TypeName(oleObj.Object) = "CheckBox" Then
                With oleObj.Object
                    If InStr(1, oleObj.Name, prefix, vbTextCompare) Then
                        ' Extrait le suffixe
                        suffix = Mid(oleObj.Name, InStrRev(oleObj.Name, "_") + 1)
                        ' Exclure le contrôle principal (suffixe "0")
                        If suffix <> "0" Then
                            .Value = Flag
                        End If
                    End If
                End With
            End If
        Next
        Set oleObj = Nothing
    End Sub
    Illustration
    Nom : 231009 dvp CheckBox.png
Affichages : 77
Taille : 16,3 Ko
    Fichiers attachés Fichiers attaché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

  8. #8
    Membre du Club
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Nickel Philippe, c'est exactement ce que je cherchais et ton script va me permettre de m'adapter à la structure du questionnaire.

    Pour info, mon code fonctionnait aussi en fixant la propriété Enabled sur True mais j'avais laissé la procédure dans un module au lieu de la positionner sur la feuille.

    Merci à tous les 3 pour l'aide.

  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,
    Merci pour le retour
    Pour info, mon code fonctionnait aussi en fixant la propriété Enabled sur True mais j'avais laissé la procédure dans un module au lieu de la positionner sur la feuille.
    Il est parfaitement possible de déplacer la procédure UpdateGroupCheckboxState dans un module standard. C'est d'ailleurs comme cela que je pratique d'habitude mais alors je passe l'objet lui-même en paramètre, ce qui permet encore de réduire le nombre d'argument.

    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
    Sub UpdateGroupCheckboxState(oCheckBox As Msforms.CheckBox)
      ' Argument
      '   oCheckBox Objet CheckBox qui déclenche l'action
     
      Dim oleObj As OLEObject
      Dim prefix As String
      Dim suffix As String
     
      ' Extrait le préfixe de nom de groupe
      prefix = Left(oCheckBox.Name, InStrRev(oCheckBox.Name, "_") - 1) & "_"
     
      ' Parcourir tous les OLEObjects de la feuille
      For Each oleObj In oCheckBox.Parent.OLEObjects
        If TypeName(oleObj.Object) = TypeName(oCheckBox) Then
          With oleObj.Object
            If InStr(1, oleObj.Name, prefix, vbTextCompare) Then
              ' Extrait le suffixe
              suffix = Mid(oleObj.Name, InStrRev(oleObj.Name, "_") + 1)
              ' Exclure le contrôle principal (suffixe "0")
              If suffix <> "0" Then .Value = oCheckBox.Value
            End If
          End With
        End If
      Next oleObj
      Set oleObj = Nothing
    End Sub
    Dans ce cas, il y a lieu de modifier les procédures événementielles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub chk_Chap_1_0_Click()
      With Me
        UpdateGroupCheckboxState .chk_Chap_1_0
      End With
    End Sub
    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

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 10/05/2005, 11h35
  2. [VBA-E] Question à propos des checkbox
    Par Timfg dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/04/2005, 15h09
  3. [C#] Tableau généré contenant des checkbox
    Par la_muraille dans le forum ASP.NET
    Réponses: 3
    Dernier message: 04/04/2005, 12h16
  4. Cochage des checkbox d'un dbgrid
    Par kose dans le forum Bases de données
    Réponses: 1
    Dernier message: 25/01/2005, 16h26
  5. boucler sur des checkboxes
    Par El Saigneur dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 09/10/2004, 08h27

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