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

Noter ce billet
par , 22/03/2022 à 11h13 (8557 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 : 8799
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.