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 TextBoxBuscar” podamos ingresar un texto de búsqueda y nos muestre los resultados en el ListBox de la parte inferior.

Llenar ComboBox con encabezados de tabla en Excel

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.

Filtrar datos de tabla en ListBox de Excel

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

Anexos

:: Descargar ejemplo Formulario para filtrar datos de una tabla en ListBox eligiendo la columna de búsqueda en un ComboBox.rar

You may also like...