Bonjour à tous,
Existe-t-il une façon de bloquer/limiter le nombre de sélections que l'utilisateur peut faire dans un listbox multiselect ?
Merci pour votre aide !
Blord
Version imprimable
Bonjour à tous,
Existe-t-il une façon de bloquer/limiter le nombre de sélections que l'utilisateur peut faire dans un listbox multiselect ?
Merci pour votre aide !
Blord
Bonjour.
Voici ce que je propose :
Dans cet exemple, si l'utilisateur choisit plus de 3 items dans le formulaire que j'ai appelé UserForm1, alors un message d'erreur s'affiche et il ne peut poursuivre.
J'espère avoir pu un peu t'aider.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Private Sub CommandButton1_Click() With UserForm1.ListBox1 a = 0 For I = 0 To .ListCount - 1 If .Selected(I) = True Then a = a + 1 End If Next I If a > 3 Then MsgBox "Vous ne pouvez pas sélectionner autant d'items" Else MsgBox "OK" ' et suite du code... End If End With End Sub
Bonjour,
dans ListBox_clik tester le nombre de ListBox.selected(i).
A+
Edit:
Désolé Nanou28, je n'avais pas eu l'occasion de lire ton poste et tu à tout à fait raison.
Edit2 : sauf que ce devrait être dans..
Code:Private Sub ListBox1_Click()
Bonjour à vous 2,
J'ai testé le code, mais ça ne fonctionne pas... Merci quand même de votre aide...
Blord
Bonsoir, Blord,
ça "ne fonctionne pas", probablement parce que l'essentiel t'a échappé (rendre False la sélection si > max)
Je t'aurais volontiers dit comment corriger/compléter ton propre code sur la base de ce qui t'a été dit, mais je ne suis pas non plus d'accord avec le principe d'une boucle "vérificatrrice" du nombre de lignes déjà sélectionnées avant d'en sélectionner une nouvelle. Un tel principe est d'une gourmandise proportionnelle au nombre d'articles de ta listbox !
VB est quand même capable de compter et de savoir où il en est, non ?...
Essaye ceci, sans en changer le moindre petit iota , même si certains aspects t'échapperont peut-être :
Voilà ! pas la moindre boucle.Code:
1
2
3
4
5
6
7
8
9 Private Sub ListBox1_Click() Static nb As Integer Dim choisi As Integer, max As Integer max = 2 ' tu mets ici la valeur que tu veux (nombre maxi de sélmections autorisées) choisi = ListBox1.ListIndex If ListBox1.Selected(choisi) = False Then nb = nb - 1: Exit Sub If nb >= max Then ListBox1.Selected(choisi) = False nb = nb + 1 End Sub
Bonjour ucfoutu, le forum,
Je veux bien ne pas comprendre le code, c'est effectivement de moindre importance si j'arrive à le faire fonctionner .... :-)
(Il est par contre souvent utile de comprendre le code afin de toujours progresser en VBA...)
Voir le fichier exemple ci-joint ou j'ai créé un userform avec un listbox multiselect avec le code...
On peut sélectionner le nombre d'items que l'on veut ???
Merci de m'aider....
Blord
Désolé, mais je n'ouvre (comme de nombreux autres) jamais un fichier xls non créé par moi-même (surtout sur la machine depuis laquelle je te réponds).
Tout problème peut faire l'objet de son exposé et des quelques lignes de code qui le concernent. ;)
bonjour Blord Nanou28 LeForestier l' ami ucfoutu le forum
peut etre un truc comme ca limiter a 3 select..
Option Explicit
Code:
1
2
3
4
5
6 Private Sub ListBox1_Change() Dim i As Long, c As Byte For i = 0 To ListBox1.ListCount - 1: If ListBox1.Selected(i) Then c = c + 1 Next i If c > 3 Then ListBox1.Selected(ListBox1.ListIndex) = False: MsgBox "3 select max..." End Sub
Bonjour,
Je ne vais pas me permettre d’expliciter le code d’ucfoutou, mais t’en donner un mode d’emploi pour sa compréhension. Si ce n’est acquis, profites en au passage pour identifier pourquoi telles ou telles choses sont des Propriétés, Méthodes ou Évènements, ça te fera gagner énormément de temps dans l’avenir…
Ensuite tu auras quelque chose qui marche et plus important que tu auras compris et que tu sauras refaire ou adapter ce joli morceau de code ;)
Ligne à ligne : tu regardes les mots clefs et l’aide vba (et les exemples liés)
Listbox (contrôle) => Evènements => Clic
Listbox (contrôle) => Propriétés => Listindex
Listbox (contrôle) => Propriétés => Selected
Et aussi l’aide à True ou False qui te conduira à Boolean (type de données) qui est la clef de la réponse si question il y a à ce niveau.
PS : je n’ouvre pas non plus les fichiers…
Cordialement,
Didier
Bonjour à tous,
Ce que veut dire Blord c'est qu'il peut sélectionner autant de lignes qu'il le désire sur la Listbox, rien ne se passe.
Comme si l'évènement Click ne se produisait pas. D'ailleurs si on place un point d'arrêt, cela n'a aucun effet. Il y a peut-être une subtilité qui m'échappe, mais je n'ai pas trouvé.
Voici le code qu'il a affecté au formulaire :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 Private Sub UserForm_Initialize() ListBox1.AddItem "Projet 1" ListBox1.AddItem "Projet 2" ListBox1.AddItem "Projet 3" ListBox1.AddItem "Projet 4" ListBox1.AddItem "Projet 5" ListBox1.AddItem "Projet 6" End Sub Private Sub ListBox1_Click() Static nb As Integer Dim choisi As Integer, max As Integer max = 2 ' tu mets ici la valeur que tu veux (nombre maxi de sélmections autorisées) choisi = Me.ListBox1.ListIndex If Me.ListBox1.Selected(choisi) = False Then nb = nb - 1: Exit Sub If nb >= max Then Me.ListBox1.Selected(choisi) = False nb = nb + 1 End Sub
Re,
Quelle valeur a été assignée à la propriété Multiselect de la listbox ?
re, le fil j ai teste le code de l ami ucfoutu ca marche tres bien a condition de mettre le code dans change et non dans click multi select bien sur
Ucfoutu : la propriété est "1 FmMultiselectMulti"
Laetitia :
avec :
on sort de la procédure à chaque changement, non ?Code:Private Sub ListBox1_Change()
Oups ! :ave:
Merci Jacques Jean ;)
Pour une sélection multiple, la propriété Multiselect n'est forcément pas à Single, donc l'évènement clic ne se déclenche pas..
il faut donc passer par une CommandButton annexe de validation des choix faits du genre :
comme quoi il vaut mieux tout lire ;)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Private Sub cmd1_Click() Dim I As Integer Dim choisi As Integer, max As Integer max = 2 ' tu mets ici la valeur que tu veux (nombre maxi de sélmections autorisées) For I = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(I) = True Then choisi = choisi + 1 If choisi > max Then MsgBox "Oups ! ": Exit Sub End If End If Next I If choisi > 0 Then MsgBox "lancer le traitement voulu" End Sub
cordialement,
Didier
Bonjour à tous,
Nous oublions une chose... C'est que chaque fois que l'ont modifie une propriété de la ListBox il y a un effet récursif dans les événements de la ListBox, ce qui fausse toutes modifications faites dans l'un de ces événement.
d'où la solution que j'ai employer dans ce topic qui est un peu lourde mais qui fonctionne parfaitement.
Il y a probablement d'autres solutions mais personnelement j'ai pas trouver.
A+
Bonjour Ormonth,
Merci également pour votre réponse, mais ici je répondais en fonction du code donné par Ucfoutu puis par Laetitia.
Cette procédure devait permettre de traiter immédiatement le cas du dépassement de lignes choisies sans passer par une validation.
Cordialement.
C'est sur qu'il faut dire en clair à l'utilisateur ce qui se passe et remettre la sélection vierge et un message "Essaie encore !", sinon utiliser des EnableEvents true/false permet d'éviter les évènementiels indésirables....
PS : pas vu le 13h ;), euh j'étais à côté de la plaque n'ayant pas lu suffisamment :roll:
cordialement,
Didier
bonjour,
Savez pourquoi les evenements "click" "KeyDown" "KeyPress" "KeyUp" sont inhibés lors la propriété Multiselect = fmMultiSelectMulti ou fmMultiSelectExtended.
Par contre les évenements "mouse" fonctionnent eux.
=> Mettre la procédure d ' ucfoutu dans l ' êvenement "mousedown " par exemple.
:roll: Exact, c'est le jour... dans ce contexte, j'utilise en effet une variable drapeau (Boolean)...Citation:
EnableEvents n'est valable que pour les événements "feuille" ou WorkBooks mais pas pour des élément ActiveX
cordialement,
Didier