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.
Bonsoir BartOon, bonsoir le forum,
En pièce jointe une autre approche avec une CheckBox :
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
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