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 тыс. значений в моем списке). Вот почему мне нужно записывать выбор в режиме реального времени, а не в цикле, после ввода пользователем ввода.
Конечно, мне также понадобится способ проверить, удалил ли пользователь какой-либо предыдущий выбор.
Надеюсь, вы, ребята, можете помочь!
Ответы
Ответ 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)