Подтвердить что ты не робот

VBA для получения значений из списка в электронной таблице в Excel

У меня есть список с именем ListBox1 на Sheet1 книги 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

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

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

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

4b9b3361

Ответ 1

К сожалению, для списка форм 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

Ответ 2

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

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

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

Ответ 3

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

Для Single Column ListBox: ListBox1.List(ListBox1.ListIndex)

Для Multi Column ListBox: ListBox1.Column(column_number, ListBox1.ListIndex)

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

Ответ 4

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

worksheet name = ordls
form control list box name = DEPDB1

selectvalue = ordls.Shapes("DEPDB1").ControlFormat.List(ordls.Shapes("DEPDB1").ControlFormat.Value)