par , 22/03/2022 � 11h13 (9583 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.