VBA для получения значений из списка в электронной таблице в Excel - PullRequest
13 голосов
/ 22 марта 2012

У меня есть список с именем ListBox1 на Листе 1 книги Excel.

Каждый раз, когда пользователь выбирает один из элементов в списке, мне нужно скопировать его имя в переменную с именем strLB.

Итак, если у меня есть Value1, Value2, Value3, Value4 и пользователь выбирает Value1 и Value3, мне нужно, чтобы мой strLB получал значение Value1, Value3.Довольно просто.

Я пытался сделать это post hoc с:

For i = 1 To ActiveSheet.ListBoxes("ListBox1").ListCount
    If ActiveSheet.ListBoxes("ListBox1").Selected(i) Then strLB = strLB & etc.etc.
Next i

Но это очень медленно (у меня на самом деле есть 15k значений в моем списке).Вот почему мне нужно записывать выбор в реальном времени, а не в цикле, после того, как пользователь завершит ввод.

Конечно, мне также понадобится способ проверить, удалил ли пользователь какую-либо изпредыдущий выбор.

Надеюсь, вы, ребята, можете помочь !!

Ответы [ 4 ]

12 голосов
/ 22 марта 2012

К сожалению, для списка форм MSForms циклический просмотр элементов списка и проверка их свойства Selected - единственный способ.Однако здесь есть альтернатива.Я сохраняю / удаляю выбранный элемент в переменной, вы можете сделать это в некоторой удаленной ячейке и отслеживать это:)

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
7 голосов
/ 11 ноября 2013

Принятый ответ не сокращает его, потому что если пользователь отменяет выбор строки, список не обновляется соответствующим образом.

Вот что я предлагаю вместо этого:

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

Предоставленоиз http://www.ozgrid.com/VBA/multi-select-listbox.htm

0 голосов
/ 20 августа 2018

Примите выбранное значение:

worksheet name = ordls
form control list box name = DEPDB1

selectvalue = ordls.Shapes("DEPDB1").ControlFormat.List(ordls.Shapes("DEPDB1").ControlFormat.Value)
0 голосов
/ 14 ноября 2016

Чтобы получить значение для выбранного элемента списка, используйте следующее:

Для одностолбцбокого списка: ListBox1.List(ListBox1.ListIndex)

Для многостолбцбокса::

Это позволяет избежать зацикливания и является чрезвычайно более эффективным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...