par , 22/03/2022 à 11h13 (7849 Affichages)
Préambule
Question souvent posée sur les forums, "Comment obtenir une chaîne de caractères contenant l'ensemble des éléments sélectionnés dans un ListBox séparés par un ; ?"
Rappel
Pour pouvoir effectuer de la multi-sélection dans un contrôle ListBox, il y a lieu de le définir dans la propriété MultiSelect
La propriété MultiSelect peut prendre l'une des trois valeurs qui suivent
Constante |
Valeur |
Description |
fmMultiSelectSingle |
0 |
Un seul élément peut être sélectionné (valeur par défaut) |
fmMultiSelectMulti |
1 |
Un clic ou un appui sur la barre d’espacement permet de sélectionner ou de désélectionner un élément de la liste |
fmMultiSelectExtended |
2 |
Combinaison de la touche Shift (Maj) ou Ctrl avec le clic de la souris.
Shift + Clic permet d’étendre la sélection de l’élément précédemment sélectionné jusqu’à l’élément en cours
Ctrl + Clic permet de sélectionner ou de désélectionner un élément |
Important : Lorsque la propriété MultiSelect est définie sur Étendue ou Multi, nous devons utiliser la propriété Selected de la zone de liste pour déterminer les éléments sélectionnés. De plus, la propriété Value du contrôle est toujours Null
La propriété LifeStyle : Dans un ListBox, en mettant 1 (fmListStyleOption) comme valeur à cette propriété on affiche des boutons "Options" ou des "Cases à cocher" pour une liste à sélections multiples (Voir l'illustration ci-dessus)
Code de la procédure
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Function GetSelectedValues(oListBox As MSForms.ListBox) As String
' Renvoie une chaîne de caractères contenant tous les éléments sélectionnés dans un ListBox MultiSelected
' Philippe Tulliez https://magicoffice.be
' Argument
' oListBox Contrôle ListBox concerné
Dim Elem As Integer, Count As Integer
Dim tbl As Variant
' Charge les éléments sélectionnés dans une table
With oListBox
For Elem = 0 To .ListCount - 1
If .Selected(Elem) Then
If Count Then ReDim Preserve tbl(Count) Else ReDim tbl(Count)
tbl(Count) = .List(Elem)
Count = Count + 1
End If
Next
End With
If IsArray(tbl) Then GetSelectedValues = Join(tbl, ";")
End Function |
Les contrôles utilisés
Contrôle |
Nom |
UserForm |
usf_MultiSelect |
ListBox |
ListBox1 |
CommandButton |
cmdOk |
CommandButton |
cmdCancel |
Le code du UserForm
1 2 3 4 5 6 7 8 9
| Option Explicit
Private Sub cmdCancel_Click()
Me.Hide
End Sub
Private Sub cmdOk_Click()
Me.Hide
End Sub |
Comment l'invoquer ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| Sub Main_Select()
Const TableName As String = "t_Fruit" ' Nom de la table utilisée comme liste
Const LinkedCellName As String = "LinkedCell" ' Nom de la cellule cible
Dim rng As Range
Dim msg As String
Set rng = Range(TableName)
With usf_MultiSelect
With .ListBox1
.ColumnWidths = mUserForm_Manager.GetColumnWidths(rng)
.ColumnCount = rng.Columns.Count
.List = rng.Value
.MultiSelect = fmMultiSelectMulti ' Définit la multisélection
.ListStyle = fmListStyleOption ' Style Case à cocher
End With
.Show
msg = GetSelectedValues(.ListBox1)
MsgBox IIf(Len(msg), msg, "Pas de sélection"), Title:="Résultat de la sélection"
End With
Unload usf_MultiSelect
Set rng = Nothing
End Sub |
Ressources
Voici une liste de tutoriels ou billets en rapport avec cet article.