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
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!
Al principio del artículo les comparto un link con un ejemplo que hace lo que comentas.
Saludos !!
Gracias Sergio, te he hecho una preguntilla en el otro post.
Saludos!
mismo caso paro apara k apareca en combox para su modificacion
Al adaptar este buscador con el reto que planteas me salta error 381 🙁
En qué línea te marca el error ?
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.
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
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.
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
Qué tal.
El control ListBox tiene un limite de 10 columnas cuando se ingresan datos uno a uno.
GRACIAS!!!! me sirvio de mucho, solo podia registrar hasta 34 filas ahora ya puedo registar mi tabla completa, te agradesco.
Esta es la Imagen
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
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
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.
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
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
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?
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
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.
El contenido de esta columna son “horas”.
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”)
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.
Lo que te sugiero es que añadas una columna donde concatenes el RUT, POLIZA e ITEM para que tengas registros únicos.
Por ejemplo:
123456-111-1
Hola Sergio, un favor podrías enviarme el archivo, he tratado de descargarlo y nada algo sucede que no lo descarga, gracias.
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”.
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?
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.
buenas, como podria hacer para que realice la busqueda en todo el documento y no solo en una hoja?
gracias por toda tu ayuda.
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.
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.
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
podria subir nuevamente el archivo por favor; gracias