vba excel-vba filter listbox userform

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.