web-dev-qa-db-fra.com

VBA pour obtenir les valeurs d'une liste dans une feuille de calcul dans Excel

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!!

13
Bruder

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
12
Siddharth Rout

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

8

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.

0
matt2405

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)
0
Alex