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...

34 Responses

  1. Sergio Mota says:

    Seria posible que al seleccionar en el Listbox el dato filtrado te abriera un userform con un textbox donde se rellenara con el número de ID. Por ejemplo, Pongo columna ID, busco la ID 5, se filtra en el listbox los datos de la ID 5 y al seleccionarla en el Listbox y cliquear me aparezca una ventana con un textbox con el número 5 escrito en este textbox? Es que seria para aplicarlo a un programa que ya tengo desarrollado y este formulario que proponer me parece super interesante pero con esta variable seria perfecta!

  2. Sergio Mota says:

    Al adaptar este buscador con el reto que planteas me salta error 381 🙁

    • sergioacamposh says:

      En qué línea te marca el error ?

      • Sergio Mota says:

        Lo siento por la tardanza Serigo, pero entre que pensé que no me contestarías al pasar tiempo y que he estado de exámenes hasta hoy no lo había visto.

        Mira el error es el siguiente:

        Se ha producido el error ‘381’ en tiempo de ejecució:
        No se puede configurar la propiedad List.Índice de matriz de propiedades no válido.

        Esto sucede cuando añado más columnas, y para adaptar este genial código necesitaría que gestionara muchas columnas.

        Otra pregunta es el miedo que el listbox permita el visionado de más de 10 columnas, que por lo que se de otros proyectos que cree no lo permite, o al menos hasta el nivel que llego yo.

        Saludos crack! y gracias por las molestias de verdad!

        P.d: Adjunto pantallazo con la Depuración para que veas en la linea que aparece el error que te indico.

  3. Josefran says:

    Buenos Dias, Tengo una duda, al intentar replicar tu codigo en el mio pero queriendo agregar mas columnas que ingresar, solo me ingresa hasta el dato 10, no ingresa el 11,12,13,14 donde esta mi error? este es el codigo.
    De antemano Gracias y buena la pagina y tus aportes.

    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)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 4) = Cells(i, j).Offset(0, 4)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 5) = Cells(i, j).Offset(0, 5)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 6) = Cells(i, j).Offset(0, 6)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 7) = Cells(i, j).Offset(0, 7)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 8) = Cells(i, j).Offset(0, 8)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 9) = Cells(i, j).Offset(0, 9)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 10) = Cells(i, j).Offset(0, 10)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 11) = Cells(i, j).Offset(0, 11)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 12) = Cells(i, j).Offset(0, 12)
    Me.ListBox1.List(Me.ListBox1.ListCount – 1, 13) = Cells(i, j).Offset(0, 13)

    Else
    End If
    Next i

    Exit Sub
    Errores:
    MsgBox “No se encuentra.”, vbExclamation, “EXCELeINFO”
    End Sub

    ””””””””””””””””””’

    Private Sub UserForm_Initialize()

    For i = 1 To 14
    Me.Controls(“Label” & i) = Cells(1, i).Value
    Next i

    With Me
    .ListBox1.ColumnCount = 14
    .ListBox1.ColumnWidths = “40 pt;40 pt;40 pt;40 pt;40 pt;40 pt;40 pt;40 pt;40 pt;40 pt;40 pt;40 pt;40 pt;40 pt”
    .cmbEncabezado.List = Application.Transpose(ActiveCell.CurrentRegion.Resize(1).Value)
    .cmbEncabezado.ListStyle = fmListStyleOption
    End With
    End Sub

    • Jean Carlo Garay Pachas says:

      Estimado lo unico que tienes que hacer es borrar la línea: Filas = Range(“a1”).CurrentRegion.Rows.Count y en la línea: For i = 2 To Filas tienes que reemplazar la palabra Filar por el número de la última fila(ejemplo: 65000).

      Espero te sirva.

      • ronald says:

        hola, yo tambien tengo el mismo problema, no me deja agragar mas de 9 columnas, apenas ingreso una letra de busquea y me sale la ventana de error que dice “no se encuentra”, a que se debe, tengo la tabla con 15 columnas, con 9 columnas no hay problema pero de 10 en adelante no funciona

        • sergioacamposh says:

          Qué tal.

          El control ListBox tiene un limite de 10 columnas cuando se ingresan datos uno a uno.

      • José Serna says:

        GRACIAS!!!! me sirvio de mucho, solo podia registrar hasta 34 filas ahora ya puedo registar mi tabla completa, te agradesco.

  4. Josefran says:

    Esta es la Imagen

  5. Bernardo says:

    Tengo una duda, al intentar replicar tu codigo en el mio pero queriendo
    agregar mas columnas que ingresar, solo me ingresa hasta el dato 10, no
    ingresa el 11,12,13,14 donde esta mi error? este es el codigo.
    De antemano Gracias y buena la pagina y tus aportes.
    Espero tu respuesta he echo de todo para poder poner mas resgistro pero no lo encuentro como

  6. arturo says:

    Quetal!! bueno yo baje tu archivo pero me puedes ayudar con codigos de barras ya que ha mi me seria util para mi trabajo y busqueda me informacion

    • sergioacamposh says:

      Nada más será cuestión de que tengas una columna con los números de tus códigos de barras para que al pasar el lector, éste los escriba en el formulario.

  7. Luis Daniel Rodriguez Acuña says:

    se podria modificar el archivo para filtrar el listbox tan solo ingresando las letras, es decir si ingreso una palabra con la letra “A2 el listbox muestre solo las palabras que empiecen con “A”. 🙁 porfa

    • sergioacamposh says:

      Para que se comporte como comentas debes quitar un asterisk en una parte del código correspondiendo al botón Filtrar.

      Línea original

      If LCase(Cells(i, j).Offset(0, CInt(Columna)).Value) Like “*” & LCase(Me.txtFiltro1.Value) & “*” Then

      Línea modificada

      If LCase(Cells(i, j).Offset(0, CInt(Columna)).Value) Like LCase(Me.txtFiltro1.Value) & “*” Then

  8. hug San says:

    Buenas tardes excelente pagina los ejemplos son de mucha ayuda para poder trabajar pero tengo una duda con el ejemplo que colocan

    tengo datos desde la fila A11 hasta la fila A1956 cuando practico el ejemplo devuelve y encuentro los datos hasta la fila A1950.

    ¿como puedo agregar las otras filas? ¿si quiero agregar mas datos también tendré problemas?

  9. Sergio M says:

    como puedo modificar esta instruccion para que la lista del combobox se lleme apartir del 4to encabezado

    ejemplo:
    tengo estos encabesado en la base de dato

    encabezado1 encabezado2 encabezado3 encabezado4 encabezado5 encabezado6

    y quiero que solo aparezcan en el combobox esto:

    encabezado4
    encabezado5
    encabezado6

    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

  10. Ramses Sariol says:

    Quisiera saber cómo darle formato específico a una columna del LISTBOX. En todas son textos planos, pero en una quiero que refleje una HORA concreta.

    • Ramses Sariol says:

      El contenido de esta columna son “horas”.

      • sergioacamposh says:

        Suponiendo que tu columna horas es la 5, usa el siguiente código:

        Me.ListBox1.List(Me.ListBox1.ListCount – 1, 4) = WorksheetFunction.Text(Cells(i, j).Offset(0, 4), “hh:mm:ss”)

  11. Jorge Ramírez says:

    Estimados:
    Junto con agradecer toda la información entregada quiero consultar lo siguiente:
    Resulta que trabajo con un archivo en el cual el id (en mi caso Rut) se repite en varias ocasiones, ya que trabajo con pólizas, y un Rut puede tener varias pólizas asignadas.
    Ejemplo:

    rut(id) poliza item
    123456 111 1
    123456 112 1
    123456 113 1

    Mi problema es que al filtrar y seleccionar siempre se queda fijo en un solo registro, no me selecciona el que necesito por lo cual no me carga los datos correctos al trabajar con otro userform.
    cual seria la solución ya que me he craneado y no consigo arreglar este problema.
    Desde ya les agradezco su ayuda.

  12. horacio says:

    Hola Sergio, un favor podrías enviarme el archivo, he tratado de descargarlo y nada algo sucede que no lo descarga, gracias.

  13. José Rivera says:

    Estimados un saludo. un favor gracias a la pagina realice un vba pero necesito, su apoyo para seguir mejorando.
    * cuando busque la información en listbox y aparezca la envié a una hoja “despacho” y a la vez sea eliminada del la hoja “datos”.

  14. Cristian Jimenez says:

    Necesito ayuda, podrían decirme como le hago para que en el combobox me aparezcan los nombre de las columnas si el botón de comando lo tengo en la hoja uno y mi base de datos la tengo en la hoja 2?

  15. Abraxas says:

    Hola quiero saber como puedo cambiar el rango donde el filtro haga la búsqueda, ya he logrado que el listbox me muestre los datos de mi interés pero no logro hacer que el filtro y la búsqueda se refieran a un rango especifico, me pueden ayudar.

  16. Jose Herrera says:

    buenas, como podria hacer para que realice la busqueda en todo el documento y no solo en una hoja?
    gracias por toda tu ayuda.

  17. Proyectos Yura S.A. says:

    Una consulta, quisiera saber como puedo indicar en el combobox ciertos campos de la tabla, no quiero que me muestren todos; tu tienes 4 columnas (ID, Usuario, Departamento y Puesto), solo quiero que muestre 2 o 3 que tendría que hacer????
    Gracias por tu respuesta.

  18. Miguel Angel Vidal Huerta says:

    Buenos días. Soy Novato en todo esto. Mi pregunta es cómo hacer que independientemente de si estoy en la hoja 2, me corra el programa con los datos de la hoja 1, es decir, que todo esté referenciado a la hoja 1.
    Gracias.

  19. Miguel Saavedra says:

    Buenas, tengo un error y es que al seleccionar una fila de las listadas, me lanza el error 91 “variable de objeto o bloque with no establecido”. En mi caso tengo 4743 filas, me imagino que para este rango tan grande es el problema. ¿Cómo podría solucionarlo? Gracias

  20. Dari says:

    podria subir nuevamente el archivo por favor; gracias

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: