Formulario para filtrar datos de una tabla en ListBox eligiendo la columna de búsqueda en un ComboBox en Excel
Te reto a implementar este ejemplo que les comparto en el formulario que les compartí en este otro artículo.
Hablando de este reto, ahora le comparto un formulario que nos servirá para hacer filtros de una tabla de Excel y devolver el resultado a un ListBox. Pero lo interesante es que tendremos un ComboBox el cual se llenará con los encabezados de nuestra tabla y tendremos la opción de nosotros elegir el campo en el cual buscaremos datos para aplicar el filtro.
Cómo funciona
Al mostrar el formulario lo primero que hará es validar que nuestro rango activo tenga más de una celda elegida y el ComboBox de “Filtro por” se llenará con los encabezados de la tabla para posteriormente en el TextBox “Buscar” podamos ingresar un texto de búsqueda y nos muestre los resultados en el ListBox de la parte inferior.
Figura 1. ComboBox que enlista los encabezados de una tabla.
Al elegir alguna opción del resultado del filtro en el ListBox, notaremos que se activará la fila en la tabla. Esto se hace para que funcione el otro formulario que es parte del reto.
Figura 2. Los resultados coincidentes se muestran en un ListBox.
Código vba
Todo el siguiente código corresponde al formulario.
'Cambia el TextBox con cada cambio en el Combo ' Private Sub cmbEncabezado_Change() Me.lblFiltro = "Filtro por " & Me.cmbEncabezado.Value End Sub ' 'Cerrar formulario Private Sub CommandButton2_Click() Unload Me End Sub ' ' 'Mostrar resultado en ListBox Private Sub CommandButton5_Click() On Error GoTo Errores If Me.txtFiltro1.Value = "" Then Exit Sub Me.ListBox1.Clear Columna = Me.cmbEncabezado.ListIndex j = 1 Filas = Range("a1").CurrentRegion.Rows.Count For i = 2 To Filas If LCase(Cells(i, j).Offset(0, CInt(Columna)).Value) Like "*" & LCase(Me.txtFiltro1.Value) & "*" Then Me.ListBox1.AddItem Cells(i, j) Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1) Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2) Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3) Else End If Next i Exit Sub Errores: MsgBox "No se encuentra.", vbExclamation, "EXCELeINFO" End Sub ' 'Activar la celda del registro elegido Private Sub ListBox1_Click() Range("a2").Activate Cuenta = Me.ListBox1.ListCount Set Rango = Range("A1").CurrentRegion For i = 0 To Cuenta - 1 If Me.ListBox1.Selected(i) Then Valor = Me.ListBox1.List(i) Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate End If Next i End Sub ' 'Dar formato al ListBox y traer los encabezados de la tabla Private Sub UserForm_Initialize() ' For i = 1 To 4 Me.Controls("Label" & i) = Cells(1, i).Value Next i ' With Me .ListBox1.ColumnCount = 4 .ListBox1.ColumnWidths = "60 pt;60 pt;60 pt;60 pt" .cmbEncabezado.List = Application.Transpose(ActiveCell.CurrentRegion.Resize(1).Value) .cmbEncabezado.ListStyle = fmListStyleOption End With End Sub