如何处理生成的列表框并在 VBA 中动态添加项目?
How to address generated ListBoxes and add Items dynamically in VBA?
我成功地动态生成了列表框。但我现在正在努力解决和填充那些生成的列表框。此外,我不知道如何激活这些列表框的 MultiSelect 属性。只有 ActiveX 才有可能吗?
我首先尝试了 ActiveX - 用户窗体上的列表框。现在我切换回 WorkSheet 上的 "normal" 列表框。 "FS" 是我正在处理的工作表的名称。为了便于理解:我正在遍历工作表 FS 上的列并为每列创建一个 ListBox。在每个列表框中,将添加相应列的条目。
For i = 1 To 10
LastRow = FS.Cells(Rows.Count, i).End(xlUp).Row
With FS
Set lb = FS.Shapes.AddFormControl(xlListBox, 100, 10, 100, 100)
lb.ControlFormat.MultiSelect = 2
For Each cell In FS.Range(Cells(1, i), Cells(LastRow,i)).Cells
lb.ControlFormat.AddItem cell.Value 'This is the problematic line
Next cell
End With
Next i
改为使用 .ControlFormat.ListFillRange,并将 MultiSelect 设置为 3。这样的设置应该适合您:
Sub tgr()
Dim FS As Worksheet
Dim lb As Shape
Dim i As Long
Set FS = ActiveWorkbook.Worksheets("FS")
For i = FS.Columns("A").Column To FS.Cells(1, FS.Columns.Count).End(xlToLeft).Column
Set lb = FS.Shapes.AddFormControl(xlListBox, (i - 1) * 100 + 10, 10, 100, 100)
With lb
.ControlFormat.MultiSelect = 3
.ControlFormat.ListFillRange = FS.Range(FS.Cells(1, i), FS.Cells(FS.Rows.Count, i).End(xlUp)).Address(External:=True)
End With
Next i
End Sub
我建议你这样做:
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
集合的引用。此集合属于列表框所在的 sheet。例如,要引用 "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
控件而不是表单控件。
我成功地动态生成了列表框。但我现在正在努力解决和填充那些生成的列表框。此外,我不知道如何激活这些列表框的 MultiSelect 属性。只有 ActiveX 才有可能吗?
我首先尝试了 ActiveX - 用户窗体上的列表框。现在我切换回 WorkSheet 上的 "normal" 列表框。 "FS" 是我正在处理的工作表的名称。为了便于理解:我正在遍历工作表 FS 上的列并为每列创建一个 ListBox。在每个列表框中,将添加相应列的条目。
For i = 1 To 10
LastRow = FS.Cells(Rows.Count, i).End(xlUp).Row
With FS
Set lb = FS.Shapes.AddFormControl(xlListBox, 100, 10, 100, 100)
lb.ControlFormat.MultiSelect = 2
For Each cell In FS.Range(Cells(1, i), Cells(LastRow,i)).Cells
lb.ControlFormat.AddItem cell.Value 'This is the problematic line
Next cell
End With
Next i
改为使用 .ControlFormat.ListFillRange,并将 MultiSelect 设置为 3。这样的设置应该适合您:
Sub tgr()
Dim FS As Worksheet
Dim lb As Shape
Dim i As Long
Set FS = ActiveWorkbook.Worksheets("FS")
For i = FS.Columns("A").Column To FS.Cells(1, FS.Columns.Count).End(xlToLeft).Column
Set lb = FS.Shapes.AddFormControl(xlListBox, (i - 1) * 100 + 10, 10, 100, 100)
With lb
.ControlFormat.MultiSelect = 3
.ControlFormat.ListFillRange = FS.Range(FS.Cells(1, i), FS.Cells(FS.Rows.Count, i).End(xlUp)).Address(External:=True)
End With
Next i
End Sub
我建议你这样做:
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
集合的引用。此集合属于列表框所在的 sheet。例如,要引用 "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
控件而不是表单控件。