J'ai une zone de liste nommée ListBox1 sur la feuille Sheet1 d'un classeur Excel.
Chaque fois que l'utilisateur sélectionne l'un des éléments de la liste, je dois copier son nom dans une variable appelée strLB.
Donc, si j'ai Value1, Value2, Value3, Value4 et que l'utilisateur sélectionne Value1 et Value3, j'ai besoin que mon strLB soit publié en tant que Value1, Value3. Assez simple.
J'ai essayé de le faire post hoc avec:
For i = 1 To ActiveSheet.ListBoxes("ListBox1").ListCount
If ActiveSheet.ListBoxes("ListBox1").Selected(i) Then strLB = strLB & etc.etc.
Next i
Mais ceci est très lent (j'ai en fait 15k valeurs dans ma liste déroulante). C'est pourquoi je dois enregistrer la sélection en temps réel et non pas dans un cycle, une fois que l'utilisateur a terminé la saisie.
Bien sûr, je vais également avoir besoin d'un moyen de vérifier si l'utilisateur a supprimé l'une des sélections précédentes.
J'espère que vous pouvez aider!!
Malheureusement pour MSForms, la boîte de dialogue n'a pas d'autre solution que de parcourir les éléments de liste et de vérifier leur propriété Selected Cependant, voici une alternative. Je stocke/supprime l'élément sélectionné dans une variable, vous pouvez le faire dans une cellule distante et en garder une trace :)
Dim StrSelection As String
Private Sub ListBox1_Change()
If ListBox1.Selected(ListBox1.ListIndex) Then
If StrSelection = "" Then
StrSelection = ListBox1.List(ListBox1.ListIndex)
Else
StrSelection = StrSelection & "," & ListBox1.List(ListBox1.ListIndex)
End If
Else
StrSelection = Replace(StrSelection, "," & ListBox1.List(ListBox1.ListIndex), "")
End If
End Sub
La réponse acceptée ne la coupe pas, car si un utilisateur désélectionne une ligne, la liste n'est pas mise à jour en conséquence.
Voici ce que je suggère à la place:
Private Sub CommandButton2_Click()
Dim lItem As Long
For lItem = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(lItem) = True Then
MsgBox(ListBox1.List(lItem))
End If
Next
End Sub
Avec l'aimable autorisation de http://www.ozgrid.com/VBA/multi-select-listbox.htm
Pour obtenir la valeur de l’élément sélectionné d’une liste déroulante, utilisez ce qui suit.
Pour ListBox à colonne unique: ListBox1.List(ListBox1.ListIndex)
Pour la ListBox à plusieurs colonnes: ListBox1.Column(column_number, ListBox1.ListIndex)
Cela évite les boucles et est extrêmement plus efficace.
Prendre la valeur sélectionnée:
worksheet name = ordls
form control list box name = DEPDB1
selectvalue = ordls.Shapes("DEPDB1").ControlFormat.List(ordls.Shapes("DEPDB1").ControlFormat.Value)