我在用户窗体上有一个文本框和一个列表框。我想根据我在文本框中输入的值过滤列表框中的值。名为 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
最佳答案
我当然希望下面的代码是您正在寻找的代码。
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
请注意,此子程序不使用工作表TMP
上的AutoFilter
。因此,潜艇速度要快一些。此外,如果您希望过滤工作表上的数据,此子程序不会删除/更改您当前的过滤器设置。
末尾的行 If Me.ListBox1.ListCount = 1 Then Me.ListBox1.Selected(0) = True
并不是真正必要的,而是为了您的方便。它确保如果列表中只有 1 个项目,则在 ListBox
中自动选择该项目。
关于vba - 如何根据文本框值过滤列表框值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42879261/