XL 2019 Récupérer multisélection d'une listbox dans des variables

SPGoder

XLDnaute Occasionnel
Bonjour
Encore une fois, je me tourne vers vous
J'ai besoin de récupérer la premier colonne d'une listbox en multi sélection dans dans des variables différentes, pour les utiliser dans un autre userform
Au début, je n'avais besoin que de 2 sélections, donc je verrouillais la multi sélection à 2 obligatoirement, et utilisais le code suivant (les variables Fact_1 et Fact_2 ont été déclarées en public dans un module)

VB:
    Dim i As Integer
    
    'récupération des N° de facture
        Fact_1 = ""
        Fact_2 = ""
        For i = 0 To ListBox3.ListCount - 1
            If ListBox3.Selected(i) = True Then
                If Fact_1 <> "" Then Fact_2 = ListBox3.List(i, 0)
                If Fact_1 = "" Then Fact_1 = ListBox3.List(i, 0)
            End If
        Next i

Mais mon projet avançant, j'ai maintenant besoin de récupérer une sélection entre 2 et 12, donc récupérer entre 2 et 12 variables
Et je n'arrive pas à adapter mon code....
Merci de votre aide, car je rame grave
 

patricktoulon

XLDnaute Barbatruc
RE
Bonjour il te faut une variable tableau(array) dynamique

un exemple vite fait
VB:
' cette variable si utilisée ailleurs que dans le commandbutton_click doit etre global module (déclarée en haut de module userform)
Dim Fact()
Private Sub CommandButton1_Click()
Dim i As Integer,e&
ReDim Fact(1 To 1)
'récupération des N° de facture
For i = 0 To ListBox3.ListCount - 1
    If ListBox3.Selected(i) = True Then
       e = e + 1: ReDim Preserve Fact(1 To e)
        Fact(UBound(Fact)) = ListBox3.List(i, 0)
    End If
Next i

MsgBox Join(Fact, vbCrLf)

End Sub

Private Sub UserForm_Activate()
ListBox3.List = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
End Sub
 

patricktoulon

XLDnaute Barbatruc
re
redimFadt(1 to 1)
c'est un dimensionnement de la variable de 1 item commençant en base 1 donc l'item (1) sera le 1
si j'avais fait redim fact(1) le 1er item serait l'item(0)
cela dit tu peut même le supprimer car je redim preserve pareillle(1 to...) dans la boucle selected


pour l'array c'est simple non? je met une liste de numéro dans la listbox pour les tests
 

Pièces jointes

  • exemple listbox multiselect .xlsm
    13.9 KB · Affichages: 22

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour,

Une autre méthode avec exemple d'utilisation des variables dans la procédure Afficher.
Le stockage des éléments sélectionnés inclut le cas ou aucun élément n'a été sélectionné.
Le code est commenté.
VB:
Option Explicit

' Le tableau des éléments sélectionnés s'appelle Choisis()
' Si vous voulez l'utiliser hors du Userfrom, déclarez Public Choisis() dans un module
' les variables sélectionnées sont dans les éléments 1 à Ubound(Choisis)
' le nombre d'éléments selectionnés est Ubound(Choisis)
' si Ubound(Choisis) est zéro, alors aucun élément n'a été sélectionnés
' pour parcourir tous les élément sélectionnés, on boucle sur le tableau Choisis()
'     entre les indices 1 à Ubound(Choisis) --> voir procédure affiche

Dim Choisis()

Private Sub CommandButton1_Click()     'stockage des élément sélectionnés
   Dim i As Long
   ReDim Choisis(0 To 0)  'on initialise le tableau avec une borne inférieure égale à zéro
   For i = 0 To ListBox1.ListCount - 1 'boucle sur la listbox
      If ListBox1.Selected(i) Then
         ReDim Preserve Choisis(0 To UBound(Choisis) + 1)    'on augmente d'une unité la taille du tableau Choisis()
         Choisis(UBound(Choisis)) = ListBox1.List(i, 0)    'place l'élément sélectionné dans le dernier élément du tableau
      End If
   Next i
   Afficher
End Sub

Sub Afficher()    'utilisation des éléments sélectionnés stockés dans Choisis()
Dim i As Long, s As String
   If UBound(Choisis) = 0 Then      'Le nombre d'élément sélectionné est Ubound(choisis)
      MsgBox "Aucun élément de la listbox n'a été sélectionné."
   Else
      For i = 1 To UBound(Choisis)     'boucle sur les éléments sélectionnés - à partir de l'indice 1 et pas zéro
         s = s & vbLf & Choisis(i)
      Next i
      MsgBox "Nombre d'élément sélectionné = " & UBound(Choisis) & s
   End If

End Sub
 

Pièces jointes

  • SPGoder- variables éléments sélectionnés- v1.xlsm
    21.3 KB · Affichages: 19
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
un simple s=join(choisis,vblf)ne suffit il pas ?
Bonjour Patrick :)

Oui mais Non car c'est un fichier "pédagogique". Je montre comment parcourir le tableau (de l'indice 1 à sa borne sup.).
Le join fonctionne mais ne contient pas d'information pertinente (selon moi) pour l'utilisation commune des éléments sélectionnés. Je préfère montrer l'utilisation de la boucle.

PS: petit effet de bord dans ton exemple. Une sélection de deux éléments dans ta liste (par exemple) puis appui sur ton bouton ==> on affiches bien les deux éléments.
Ensuite on sélectionne les deux éléments (il n'y a plus rien de sélectionné), un clique sur ton bouton affiche les deux éléments précédemment sélectionnés.
 

SPGoder

XLDnaute Occasionnel
Bonjour mapomme

Merci pour cette parti pédagogique fort appréciable
Grace a patrick, j'ai pu aussi découvrir le "Join" (façon de parler 😂)
J'essaye d'adapter l'utilisation de tableau a une autre partie du programme. Comment fait on (ou écrit on)
pour consulter le tableau une fois "enregistrer"?
pour mieux comprendre ma question
VB:
        Dim i As Integer
        ReDim Num_Fact_(0 To 0)
            If CheckBox_Facture_Fusionnée = True Then
                For i = WsFact.Range("A65536").End(xlUp).Row To 2 Step -1
                    ReDim Preserve Num_Fact_(0 To UBound(Num_Fact_) + 1)
                    If Cells(i, "A").Value = TextBox_Code_Facture.Value Then Num_Fact_(UBound(Num_Fact_)) = Cells(i, "AM")
                Next i
                For i = WsFact.Range("A65536").End(xlUp).Row To 2 Step -1               
                    If Cells(i, "A").Value = Num_Fact_1 Then Cells(i, "AL") = False
                    If Cells(i, "A").Value = Num_Fact_2 Then Cells(i, "AL") = False
                    etc....   'Code a modifier en utilisant le comparatif de contenu de tableau
                Next i
            End If
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

On pourrait le faire sans une 2ème boucle:
  • sep est un caractère improbable dans du texte
  • s est la concaténation des éléments de Choisis() avec le séparateur sep
VB:
Dim sep As String, s As String
   sep = Chr(1): s = sep & Join(choisis, sep) & sep
   For i = WsFact.Range("A65536").End(xlUp).Row To 2 Step -1
      If InStr(1, s, sep & Cells(i, "A") & sep, vbTextCompare) > 0 Then Cells(i, "AL") = False
   Next i
 
Dernière édition:

Discussions similaires

Réponses
4
Affichages
209
Réponses
5
Affichages
181
Réponses
17
Affichages
827

Statistiques des forums

Discussions
312 198
Messages
2 086 149
Membres
103 132
dernier inscrit
hedfahmi