在VBA中重置列表框选择

7
我正在尝试在Excel VBA中当一个表单关闭时“重置”列表框。目前,当我使用userform1.hide函数时,表单会消失,但是当我使用.show函数再次打开它时,它仍然保留先前的选择。作为一个相对新手,有谁能帮忙吗?
列表框的代码如下:
Sub CommandButton1_Click()

'Filter by Country
Dim item As Long, dict As Object
Dim wsData As Worksheet

Set wsData = Sheets("TPID")
Set dict = CreateObject("Scripting.Dictionary")

With ListBox1
    For item = 0 To .ListCount - 1
        If .Selected(item) Then dict(.List(item)) = Empty
    Next item
End With

With wsData.ListObjects("Table_ExternalData_1").Range
    .AutoFilter Field:=1
    If dict.Count Then _
        .AutoFilter Field:=1, criteria1:=dict.keys, Operator:=xlFilterValues
End With
'Filter by Continent
Dim item1 As Long, dict1 As Object
Dim wsData1 As Worksheet

Set wsData1 = Sheets("TPID")
Set dict1 = CreateObject("Scripting.Dictionary")

With ListBox2
    For item1 = 0 To .ListCount - 1
        If .Selected(item1) Then dict1(.List(item1)) = Empty
    Next item1
End With

With wsData1.ListObjects("Table_ExternalData_1").Range
    .AutoFilter Field:=4
    If dict1.Count Then _
        .AutoFilter Field:=4, criteria1:=dict1.keys, Operator:=xlFilterValues
End With


End Sub

大家好,提前感谢您的帮助。

7个回答

7

如果你想要清除仅选择的内容(因为你正在使用hide,而不是unload),那么请使用:

me.listbox1.value = ""

如果是多选列表框,你需要使用:

Me.listbox1.MultiSelect = fmMultiSelectSingle
Me.listbox1.Value = ""
Me.listbox1.MultiSelect = fmMultiSelectMulti

这将通过将选择设置为单选,然后清除选择,再将功能设置为多选来清除选择。

如果您想清除整个列表框(所选选项),请使用:

Me.listbox1.clear

1
对于 MS-Access:不允许设置 .MultiSelect;要取消多选 ListBox 中的所有项,需要像这样进行循环 For Each varItem in .ItemsSelected : .Selected(varItem) = False : Next - martin.lindenlauf

1

要重置列表框中所选项目的外观,请尝试:

ListBox1.ListIndex = -1
ListBox2.ListIndex = -1

在此之后,列表框控件中不会出现任何明显的项。

1

尝试使用以下代码在VBA中清除列表框

Private Sub clearListBox()
    Dim iCount As Integer

    For iCount = 0 To Me!ListBox1.ListCount
        Me!ListBox1.Selected(iCount) = False
    Next iCount
End Sub

1
你可以使用

标签。

Private Sub clearListBox()
 'Clears the listbox
    Do Until ListBox1.ListCount = 0
        Me!ListBox1.RemoveItem(0)
    Loop
End Sub

0
在MS Access中,这个方法适用于多选列表框:
Dim Item As Variant

For Each Item In Listbox1.ItemsSelected
    Listbox1.Selected(Item) = False
Next Item

0

隐藏和显示没有效果。如果您想使用“蛮力”方法,请使用卸载然后加载,但它会重置所有内容(不仅是单选按钮),并且会消耗内存(好吧,如果您的表单不包含数千个组件并且您的计算机是最新的等等,那么这将是可以接受的)

另一种实现您想要的功能的方法是简单地遍历所有单选按钮并取消选中它们。


0

借鉴LBPLC巧妙的技巧,这里提供一个适用于所有情况的单一解决方案:

Sub ListBox1_Reset()
    Dim SaveMultSelectMode As Integer
    
    With Me.ListBox1
        SaveMultSelectMode = .MultiSelect
        .MultiSelect = fmMultiSelectSingle
        .Value = ""
        .MultiSelect = SaveMultSelectMode
    End With
End Sub

但请注意,如果从ListBox控件的VBA Change事件中调用,则此方法无效。可能是因为Excel的ListBox更改事件代码在处理过程中冻结了MultiSelect属性的有效状态,以防止其自身处理出现不稳定的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接