IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Voir le flux RSS

Philippe Tulliez

[Actualit�] VBA - Fonction qui renvoie une cha�ne de caract�res des �l�ments s�lectionn�s dans un ListBox

Note : 2 votes pour une moyenne de 4,50.
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 ; ?"

Nom : ListBox - MultiSelect - Function GetSelectedValues.png
Affichages : 12761
Taille : 48,1 Ko

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

Code VBA : S�lectionner tout - Visualiser dans une fen�tre � part
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

Code VBA : S�lectionner tout - Visualiser dans une fen�tre � part
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 - Visualiser dans une fen�tre � part
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.

Envoyer le billet � VBA - Fonction qui renvoie une cha�ne de caract�res des �l�ments s�lectionn�s dans un ListBox � dans le blog Viadeo Envoyer le billet � VBA - Fonction qui renvoie une cha�ne de caract�res des �l�ments s�lectionn�s dans un ListBox � dans le blog Twitter Envoyer le billet � VBA - Fonction qui renvoie une cha�ne de caract�res des �l�ments s�lectionn�s dans un ListBox � dans le blog Google Envoyer le billet � VBA - Fonction qui renvoie une cha�ne de caract�res des �l�ments s�lectionn�s dans un ListBox � dans le blog Facebook Envoyer le billet � VBA - Fonction qui renvoie une cha�ne de caract�res des �l�ments s�lectionn�s dans un ListBox � dans le blog Digg Envoyer le billet � VBA - Fonction qui renvoie une cha�ne de caract�res des �l�ments s�lectionn�s dans un ListBox � dans le blog Delicious Envoyer le billet � VBA - Fonction qui renvoie une cha�ne de caract�res des �l�ments s�lectionn�s dans un ListBox � dans le blog MySpace Envoyer le billet � VBA - Fonction qui renvoie une cha�ne de caract�res des �l�ments s�lectionn�s dans un ListBox � dans le blog Yahoo

Mis � jour 23/04/2023 � 15h14 par Philippe Tulliez

Cat�gories
VBA Excel

Commentaires

  1. Avatar de cduigou
    • |
    • permalink
    Bonjour Philippe,

    Je ne vois pas trop l'int�r�t de passer par un tableau interm�diaire (tbl) sauf pour le plaisir de faire un Join apr�s peut-�tre :

    Celle-ci marche aussi tr�s bien :

    Function Fruits_s�lectionn�s(oListBox As MSForms.ListBox)
    ' oListBox Contr�le ListBox concern�
    Dim Elem As Integer

    With oListBox
    For Elem = 0 To .ListCount - 1
    If .Selected(Elem) Then
    Fruits_s�lectionn�s = Fruits_s�lectionn�s & VBA.IIf(Fruits_s�lectionn�s <> "", ";", "") & .List(Elem)
    End If
    Next
    End With
    End Function


    Amicalement

    Claude D.
  2. Avatar de Philippe Tulliez
    • |
    • permalink
    Bonjour Claude,
    Merci pour votre message
    Je n'avais pas envie de passer par une concat�nation et je n'avais pas penser � ce moment l� � utiliser la fonction IIF mais vous avez raison votre proc�dure est plus courte
    Belle journ�e
    Philippe
    Citation Envoy� par cduigou
    Bonjour Philippe,

    Je ne vois pas trop l'int�r�t de passer par un tableau interm�diaire (tbl) sauf pour le plaisir de faire un Join apr�s peut-�tre :

    Celle-ci marche aussi tr�s bien :

    Function Fruits_s�lectionn�s(oListBox As MSForms.ListBox)
    ' oListBox Contr�le ListBox concern�
    Dim Elem As Integer

    With oListBox
    For Elem = 0 To .ListCount - 1
    If .Selected(Elem) Then
    Fruits_s�lectionn�s = Fruits_s�lectionn�s & VBA.IIf(Fruits_s�lectionn�s <> "", ";", "") & .List(Elem)
    End If
    Next
    End With
    End Function


    Amicalement

    Claude D.