Я предлагаю вам сделать это так:
Sub test()
''''Declarations'''''''''''''''''''''''''''
Dim lb As ListBox '
Dim sht As Worksheet '
Dim rng As Range '
Dim cell As Range '
Dim i As Long '
'''''''''''''''''''''''''''''''''''''''''''''
Set sht = ThisWorkbook.Worksheets("Name of your worksheet")
For i = 1 To 10
With sht
Set rng = .Range(.Cells(1, i), .Cells(.Rows.Count, i).End(xlUp))
Set lb = sht.ListBoxes.Add(100 * i, 10, 100, 100) 'just an indicative way to create the List boxes without them overlapping
End With
lb.Name = "ListBox" & i
lb.MultiSelect = 2
For Each cell In rng
lb.AddItem cell.Value
Next cell
Next i
End Sub
ОБНОВЛЕНИЕ (для покрытия сделанного комментария)
Я обновил код выше, чтобы присвоить имена спискамкак «ListBox1», «ListBox2» и т. д. вместо «List Box 1» и т. д.
Чтобы обратиться к одному из списков, вам нужно использовать ссылку на коллекцию ListBoxes
.Эта коллекция принадлежит листу, на котором расположены списки.Например, чтобы обратиться к «ListBoxi», где i = 1,2 ... n, вам нужно сделать это так:
sht.ListBoxes("ListBox" & i)
К сожалению, нет .SelectedItems.Count
или подобного метода, который язнать, что вы можете использовать со списком управления формой.
Имея это в виду, вы можете найти количество выбранных элементов "ListBox1", например, так:
Dim selectedItems As Long
selectedItems = 0
Set lb = sht.ListBoxes("ListBox" & 1)
For i = 1 To lb.ListCount Step 1
If lb.Selected(i) Then
selectedItems = selectedItems + 1
End If
Next i
If selectedItems = 0 Then
MsgBox "No user selected"
End If
Несколько вещей, о которых следует помнить:
- Индекс первого элемента варьируется от
0
до 1
в зависимости от того, находится ли список в пользовательской форме или нет - Чтобы ссылаться на список со своим именем, например
Listbox1.DoSomething
, он должен быть элементом управления ActiveX
, а не элементом формы.