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

标签 vba excel filter listbox 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

最佳答案

我当然希望下面的代码是您正在寻找的代码。

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 中自动选择该项目。

enter image description here

关于vba - 如何根据文本框值过滤列表框值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42879261/

相关文章:

java - Excel 到图像转换

django - django 模型过滤器中的 'name__iexact' 是什么意思?

filter - 如何在 Lucene.net 中使用 multifieldquery 和过滤器

excel - VBA Excel VerticalAlignment = xlCenter 不工作

excel - 在 Excel 中使用 VBA 在多页中将元素从一页复制到另一页

vba - Excel:VBA 保留具有来自其他用户的明确内容事件的公式

excel - 如何在 Outlook 中获取任务的完成时间

python - 如何正确读取 pandas 中的 excel 合并标题单元格

java - 将值添加到 java 中的映射数组中的单个变量

image - 控制导出图表的分辨率