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 |
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
Code VBA : | Sélectionner tout |
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 |
Code VBA : | Sélectionner tout |
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 ?
Code VBA : | Sélectionner tout |
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.