vba - Cómo filtrar valores de cuadro de lista en función de un valor de cuadro de texto
excel-vba filter (1)
Tengo un cuadro de texto y un cuadro de lista en forma de usuario. Quiero filtrar los valores en el cuadro de lista según el valor que ingrese en el cuadro de texto. La hoja llamada TMP tiene los valores y los filtro según el evento de cambio del cuadro de texto, pero se cierra automáticamente al agregar esos valores al cuadro de lista.
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
Espero que la siguiente pieza de código sea lo que está buscando.
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
Tenga en cuenta que este sub no utiliza el
AutoFilter
en la hoja
TMP
.
Por lo tanto, el sub es un poco más rápido.
Además, si desea filtrar sus datos en la hoja, este submenú no eliminará / cambiará su configuración de filtro actual.
La línea al final
If Me.ListBox1.ListCount = 1 Then Me.ListBox1.Selected(0) = True
no es realmente necesario, sino más bien para su conveniencia.
Asegura que el elemento se seleccione automáticamente en
ListBox
si solo hay 1 elemento en la lista.