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 :

Listbox : Sélectionner tout une listbox avec checkbox


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Mai 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 35
    Par défaut Listbox : Sélectionner tout une listbox avec checkbox
    Bonjour à tous,

    Je suis sur un problème que je n'arrive pas à solutionner.
    J'utilise une checkbox pour sélectionner / déselectionner toute une listbox.

    Cependant je veux lorsque je déselectionne dans ma listbox une donnée que la checkbox se désélectionne et inversement si je sélectionne toutes mes données de ma listbox que la checkbox se sélectionne.

    Et c'est la que ça bloque. J'ai mis un Sub sur un Click pour la checkbox et sur un Change pour la Listbox. Mais lorsque je change la valeur de la checkbox par le code, il considère que c'est un click.

    Avez vous une solution ?

    Voici mon 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    Dim update_Valeur as Boolean
    Private Sub CB_SELECTION_Click()
        Dim i As Integer
     
        update_Value = True
        LB_OPTION_Change
     
    End Sub
     
     
     
    Private Sub LB_OPTION_Change()
        Dim i As Integer
        Dim tout As Boolean
     
        If update_Value = True Then
            If CB_SELECTION.Value = True Then
                For i = 0 To LB_OPTION.ListCount - 1
                    If LB_OPTION.Selected(i) = False Then
                        LB_OPTION.Selected(i) = True
                    End If
                Next i
            Else
                For i = 0 To LB_OPTION.ListCount - 1
                    If LB_OPTION.Selected(i) = True Then
                        LB_OPTION.Selected(i) = False
                    End If
                Next i
            End If
        Else
            update_Value = False
            tout = True
            For i = 0 To LB_OPTION.ListCount - 1
                If LB_OPTION.Selected(i) = False Then
                    tout = False
                End If
            Next i
            If tout = False Then
                CB_SELECTION.Value = False
            Else
                CB_SELECTION.Value = True
            End If
        End If
    End Sub

  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,
    Je n'ai pas examiné votre code complètement mais je peux vous aider à alléger votre procédure.
    Plutôt que d'utiliser un If...Then...Else, pour modifier la valeur booléenne de la propriété d'un objet, il est plus simple de l'inverser par l'instruction Not

    Exemple pour masquer/afficher des colonnes d'une feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      With Columns("D:F").EntireColumn
      .Hidden = Not .Hidden
      End With
    A lire éventuellement mon billet titré VBA - De la mauvaise utilisation d'un If...Then...Else pour modifier une propriété Booléenne
    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
    Expert confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Juin 2012
    Messages
    3 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2012
    Messages : 3 432
    Par défaut
    Bonjour,

    Une façon de faire est de réagir à la fois sur CB_Selection_Change(), et sur CB_Selection_MouseUp() et CB_Selection_KeyUp():
    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
    Option Explicit
     
    Dim UpdateLB As Boolean
     
    Private Sub CB_Selection_Change()
        Debug.Print "CB_Selection_Change"
        LB_OPTION_Change
    End Sub
     
    Private Sub CB_Selection_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Debug.Print "CB_Selection_KeyUp"
        UpdateLB = True
    End Sub
     
    Private Sub CB_Selection_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        Debug.Print "CB_Selection_MouseUp"
        UpdateLB = True
    End Sub
     
    Private Sub LB_OPTION_Change()
        Dim i As Integer
        Dim Tout As Boolean
        If UpdateLB = True Then
            If CB_Selection.Value = True Then
                For i = 0 To LB_Option.ListCount - 1
                    If LB_Option.Selected(i) = False Then
                        LB_Option.Selected(i) = True
                    End If
                Next i
            Else
                For i = 0 To LB_Option.ListCount - 1
                    If LB_Option.Selected(i) = True Then
                        LB_Option.Selected(i) = False
                    End If
                Next i
            End If
        Else
            Tout = True
            For i = 0 To LB_Option.ListCount - 1
                If LB_Option.Selected(i) = False Then
                    Tout = False
                End If
            Next i
            If Tout = False Then
                CB_Selection.Value = False
            Else
                CB_Selection.Value = True
            End If
        End If
        UpdateLB = False
    End Sub
    Cordialement.

  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,
    Autre approche en utilisant simplement la valeur booléenne des deux contrôles

    Un UserForm avec
    • CheckBox nommé chk_Selection
    • ListBox nommé lst_Selection


    Procédure qui coche ou décoche tous les éléments de la liste en fonction de la propriété Value du CheckBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Select_Unselect()
      Dim e As Integer
      With Me
       With .lst_Selection
        For e = 0 To .ListCount - 1
         .Selected(e) = Me.chk_Selection.Value
        Next
       End With
      End With
    End Sub
    Procédure événementielle qui Invoque Select_Unselect
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub chk_Selection_Change()
      Select_Unselect
      ' With chk_Selection: .Caption = msg(Abs(.Value)): End With
    End Sub
    On pourrait prévoir également de définir la propriété Value du CheckBox à Null si les éléments sont partiellement coché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

Discussions similaires

  1. ListBox avec CheckBox
    Par rampage92 dans le forum Général VBA
    Réponses: 3
    Dernier message: 16/08/2018, 19h39
  2. Réponses: 6
    Dernier message: 08/12/2015, 22h47
  3. ListBox avec CheckBox: click sur un item
    Par yonpo dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 26/11/2010, 11h39
  4. [script.aculo.us] [Tutoriel] Modifier l'opacité des éléments sélectionnés d'une liste avec Script.aculo.us
    Par Kerod dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 13/01/2009, 21h31
  5. Réponses: 1
    Dernier message: 21/09/2007, 08h49

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