Listbox multiselect si choix1 déselectionne les autres

Bonjour le fofo,

Je suis en train d'élaborer du code pour que dans une listebox multi-sélections, pour que quand je fais un choix ça désactive tous les autres. Un exemple, dans la liste j'ai "Tous", "France", "Canada", Etats-Unis", etc. En multi-sélections, donc je peux par défaut tous les choisir, ou seulement certain. Je voudrais que si le "Tous" est sélectionné, que tous les autres choix se désélectionnés.

Premier constat l’évènement click ne fonctionne pas sur un liste multi, seulement sur une simple sélection (MultiSelect option 0- dans la listBox), donc je passe par l'évènement change, sauf que les évènements ListBox.Selected(0) = False, qui désactive le choix, fait aussi appel à l'event change, donc l'event fait un changement qui fait de nouveau appel à event, soit à lui-même, donc boucle infini !!

J'arrive à contrôler si je fais un DoEvents, ça à l'air de casser cette boucle infini, sauf que je n'arrive qu'à gérer deux choix, au troisième ça à l'air de nouveau d'être une boucle infini.

Private Sub ListBox_Change()
    If ListBox.Selected(0) Then
        ListBox.Selected(1) = False
        DoEvents
    ElseIf ListBox.Selected(1) Then
        ListBox.Selected(0) = False
        DoEvents
    End If

'    If ListBox.Selected(0) Then
'        For i = 1 To ListBox.ListCount - 1
'            ListBox.Selected(i) = False
'
'        Next i
'    End If
'    DoEvents
End Sub

Private Sub ListBox_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    If ListBox.Selected(0) Then
        For i = 1 To ListBox.ListCount - 1
            MsgBox "double ok" & i
        Next i
    End If
End Sub

Sub UserForm_Initialize()
    ListBox.AddItem "All"
    ListBox.AddItem "Regions File"
    ListBox.AddItem "Test"

    ListBox.Selected(0) = True
End Sub
Private Sub OK_Click()

    End

End Sub

Bonsoir BartOon, bonsoir le forum,

Peut-être comme ça :

Private Test As Boolean 'déclare la variable TEST

Sub UserForm_Initialize()
    ListBox.AddItem "All"
    ListBox.AddItem "Regions File"
    ListBox.AddItem "Test"
    'ListBox.Selected(0) = True'obligera à désélectionner pour choisir un autre...
End Sub

Private Sub ListBox_Change()
Dim I As Integer 'déclare la variable I

If Test = True Then Exit Sub 'di test est "VRAI", sort de la procédure
If Me.ListBox.Selected(0) = True Then 'condition 1 : si "All" est sélectionné
    Test = True 'définit la variable TEST
    For I = 1 To Me.ListBox.ListCount - 1 'boucle sur tous les éléments de la ListBox à partir du second
        Me.ListBox.Selected(I) = False 'désélectionne l'élément
    Next I 'prochain élément de la boucle
    Test = False 'redéfinit la variable Test
    Exit Sub 'sort de la procédure
End If 'fin de la condition 1
For I = 1 To Me.ListBox.ListCount - 1 'boucle sur tous les éléments de la ListBox à partir du second
    If Me.ListBox.Selected(I) = True Then 'condition 2 : si l'élément est sélectionné
        Test = True 'redéfinit la variable TEST
        Me.ListBox.Selected(0) = False 'désélectionne "All"
        Test = False 'redéfinit la variable TEST
        Exit For 'sort de la boucle
    End If 'fin de la condition2
Next I 'prochain élément de la boucle
End Sub

J'ai commenté la dernière ligne de la procédure d'initialisation car avec le code proposé, si tu veux sélectionner autre chose que All il faudrait commencer par désélectionner All en cliquant dessus...

Merci ThauThème

Effectivement j'ai l'impression que ça réponds à mon besoin. Le fait de devoir désélectionner le "All" pour pouvoir faire la sélection des autres est le point qui me chicote, mais je me rends bien compte que l'event change est bloqué dans le premier if si "All" est actif.

Je vais me creuser la tête un peu la dessus.

Sinon j'ai une alternative que j'ai trouvée avec mes recherches Google, le besoin est légèrement différent de celui que j'ai exprimé dans ce thread, mais il rend plus naturel la désélection du "All", et le code utilise aussi un booléen comme stoppeur de l'event.

En fait, le "All" sélectionne tous les autres choix, et quand on le désélectionne ça désélectionne tous les autres choix, si on veut faire un petit nombre de choix, on les sélectionne directement, si au contraire on veut en faire un "gros" et avoir deux ou trois en moins, on sélectionne le "All", puis on désélectionne ceux qu'on ne veut pas.

Je marque le topic résolu mais si vous avez des suggestions pour la désactivation dynamique du "All" quand il est sélectionné par la sélection d'un autre, je suis preneur.

51classeur1.xlsm (20.22 Ko)

Bonsoir BartOon, bonsoir le forum,

En pièce jointe une autre approche avec une CheckBox :

66bartoon-v02.xlsm (20.73 Ko)

Yhaahhaah !! 8)

C'est de la logique pure en faite, mais je dois avouer que je ne suis pas à 100% sûr d'en avoir la maitrise, seule chose à comprendre c'est que j'ai rajouté un autre breaker Test2 pour que le code puisse se déplacer dans un GoTo pour le cas où le "All" est sélectionné et qu'on sélectionne ensuite un autre choix.

Je pense que mon code est un peu cochon, mais il fonctionne (Yoouuuhouu), avis au refactoring est ouvert.

J'aime bien aussi l'idée du checkbox externe à la listbox, ça permettrais de faire des groupes de choix, merci bien.

Private Test As Boolean 'déclare la variable TEST
Private Test2 As Boolean

Sub UserForm_Initialize()
        ListBox.AddItem "All"
        ListBox.AddItem "Choix 1"
        ListBox.AddItem "Choix 2"
        ListBox.AddItem "Choix 3"
        'ListBox.Selected(0) = True 'obligera à désélectionner pour choisir un autre...
End Sub

Private Sub ListBox_Change()

    Dim I As Integer 'déclare la variable I

    If Test = True Then
        Exit Sub 'di test est "VRAI", sort de la procédure
    End If

    If Me.ListBox.Selected(0) = True Then 'condition 1 : si "All" est sélectionné
       If Test2 Then
            GoTo jmp
       Else
            Test = True 'définit la variable TEST

            For I = 1 To Me.ListBox.ListCount - 1 'boucle sur tous les éléments de la ListBox à partir du second
                Me.ListBox.Selected(I) = False 'désélectionne l'élément
            Next I 'prochain élément de la boucle

            Test = False 'redéfinit la variable Test
            Test2 = True
            Exit Sub 'sort de la procédure
       End If

    End If 'fin de la condition 1
jmp:
    For I = 1 To Me.ListBox.ListCount - 1 'boucle sur tous les éléments de la ListBox à partir du second
       If Me.ListBox.Selected(I) = True Then 'condition 2 : si l'élément est sélectionné
           Test = True 'redéfinit la variable TEST
           Me.ListBox.Selected(0) = False 'désélectionne "All"
           Test = False 'redéfinit la variable TEST
           Test2 = False
           Exit For 'sort de la boucle
       End If 'fin de la condition2
    Next I 'prochain élément de la boucle

End Sub
93classeur1final.xlsm (21.73 Ko)
BartOon a écrit :

J'aime bien aussi l'idée du checkbox externe à la listbox, ça permettrais de faire des groupes de choix, merci bien.

Mais pour plusieurs groupes de choix je le ferais avec un option button

Rechercher des sujets similaires à "listbox multiselect choix1 deselectionne"