如何根据文本框值过滤列表框值

Roh*_*han 3 vba listbox filter excel-vba userform

我在userform上有一个文本框和一个列表框.我想根据我在文本框中输入的值过滤列表框中的值.名为TMP的工作表具有值,我根据文本框更改事件对其进行过滤,但在将该值添加到列表框时会自动退出.

Private Sub Textbox1_Change()
'On Error Resume Next
Dim fCell As Range, MyArr As Variant, i As Long

With TMP
    .AutoFilterMode = False
    .Range("A1").AutoFilter
    .Range("A1").AutoFilter Field:=1, Criteria1:=Me.TextBox1.Value
End With

ListBox1.RowSource = ""
i = 0

For Each fCell In TMP.Range("A1:A" & TMP.Range("A" & TMP.Rows.Count).End(xlUp).Row).SpecialCells(xlCellTypeVisible)
    Me.ListBox1.AddItem fCell.Value, i
     i = i + 1
Next fCell


End Sub
Run Code Online (Sandbox Code Playgroud)

Ral*_*lph 11

我当然希望以下代码是您正在寻找的.

Private Sub Textbox1_Change()

Dim i As Long
Dim arrList As Variant

Me.ListBox1.Clear
If TMP.Range("A" & TMP.Rows.Count).End(xlUp).Row > 1 And Trim(Me.TextBox1.Value) <> vbNullString Then
    arrList = TMP.Range("A1:A" & TMP.Range("A" & TMP.Rows.Count).End(xlUp).Row).Value2
    For i = LBound(arrList) To UBound(arrList)
        If InStr(1, arrList(i, 1), Trim(Me.TextBox1.Value), vbTextCompare) Then
            Me.ListBox1.AddItem arrList(i, 1)
        End If
    Next i
End If
If Me.ListBox1.ListCount = 1 Then Me.ListBox1.Selected(0) = True

End Sub
Run Code Online (Sandbox Code Playgroud)

请注意,此子程序不使用工作AutoFilter表上的内容TMP.因此,sub更快一点.此外,如果您希望过滤工作表上的数据,此子目录不会删除/更改您当前的过滤器设置.

最后一行If Me.ListBox1.ListCount = 1 Then Me.ListBox1.Selected(0) = True并不是必需的,而是为了您的方便.它确保ListBox在列表中只有1个项目时自动选择项目.

在此输入图像描述