我在Excel工作簿的Sheet1上有一个名为ListBox1的列表框。
每次用户选择列表中的一个项目时,我需要将其名称复制到名为strLB的变量中。
所以,如果我有Value1,Value2,Value3,Value4并且用户选择了Value1和Value3,我需要我的strLB作为Value1,Value3。很简单。
我尝试使用
执行 post hocFor i = 1 To ActiveSheet.ListBoxes("ListBox1").ListCount
If ActiveSheet.ListBoxes("ListBox1").Selected(i) Then strLB = strLB & etc.etc.
Next i
但这很慢(我的列表框中实际上有15k值)。这就是为什么我需要在用户完成输入后实时记录选择而不是在循环中。
当然,我还需要一种方法来检查用户是否删除了之前的选择。
希望你们能帮忙!!
答案 0 :(得分:12)
不幸的是,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
答案 1 :(得分:8)
接受的答案并未删除,因为如果用户取消选择某行,则列表不会相应更新。
我建议改为:
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
答案 2 :(得分:0)
要获取列表框中所选项目的值,请使用以下内容。
对于单列ListBox:
ListBox1.List(ListBox1.ListIndex)
对于多列ListBox:
ListBox1.Column(column_number, ListBox1.ListIndex)
这可以避免循环并且效率更高。
答案 3 :(得分:0)
取所选值:
worksheet name = ordls
form control list box name = DEPDB1
selectvalue = ordls.Shapes("DEPDB1").ControlFormat.List(ordls.Shapes("DEPDB1").ControlFormat.Value)