25 febrero, 2021

REALIZAR BÚSQUEDAS DEPENDIENTES EN UN LISTBOX

Hola a todos : )

Hace unos días me enviaron una consulta en la que me solicitaban la necesidad de poder realizar consultas dependientes en un listbox.

Sobre el tema de las consultas dependientes, ya había tratado algo en esta entrada: COMBOBOX DEPENDIENTES EN USERFORM CON SQL , solo que esa ocasión estaba utilizando combobox.

En concreto, en esa consulta el filtro debería hacerse sobre un único listbox y utilizando varios textbox para indicar los items por los que realizar el filtrado.

Utilizará la base de datos de empleados de unos grandes almacenes (ya es un clásico en esta web) y pasaré los datos a un listbox:

Esta es la base de datos:

REALIZAR BUSQUEDAS DEPENDIENTES EN UN LISTBOX

Y mediante este código pasamos la información al listbox:

Private Sub UserForm_Initialize()
'Indicamos el número de columnas que tendrá el listbox
Me.ListBox1.ColumnCount = 7
'Definimos tamaño de los espacios
Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt"
'Cargamos listbox
Me.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
End Sub

Aquí ya tenemos la información cargada:

REALIZAR BUSQUEDAS DEPENDIENTES EN UN LISTBOX2

Pero ahora debemos filtrar según nuestras necesidades. Para este ejemplo realizaré un secuencia de tres consultas dependientes: Primero filtramos por Sección, una vez tengamos esos datos, filtramos por Estudios y finalmente, filtraremos por Idioma.

Para ello es necesario crear tres textbox, y en cada uno de ellos realizar la programación correspondiente. Os dejo el código de cada textbox:

TextBox1 – Filtrar por Sección:

Private Sub TextBox1_Change()
'Declaramos variables
Dim fin As Long, i As Long, n As Long
Dim sCadena_seccion As String
'Filtramos por sección
With Sheets("BBDD")
fin = Application.CountA(.Range("A:A"))
If TextBox1 = "" Then
Me.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
Exit Sub
End If
Me.TextBox2 = Clear
Me.TextBox3 = Clear
Me.ListBox1.RowSource = Clear
For i = 2 To fin
sCadena_seccion = .Cells(i, 3).Value
If UCase(sCadena_seccion) Like "*" & UCase(TextBox1.Value) & "*" Then
Me.ListBox1.AddItem
Me.ListBox1.List(n, 0) = .Cells(i, 1).Value
Me.ListBox1.List(n, 1) = .Cells(i, 2).Value
Me.ListBox1.List(n, 2) = .Cells(i, 3).Value
Me.ListBox1.List(n, 3) = .Cells(i, 4).Value
Me.ListBox1.List(n, 4) = .Cells(i, 5).Value
Me.ListBox1.List(n, 5) = .Cells(i, 6).Value
Me.ListBox1.List(n, 6) = .Cells(i, 7).Value
n = n + 1
End If
Next
Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt"
End With
End Sub

TextBox2 – Filtrar por Estudios:

Private Sub TextBox2_Change()
Dim fin As Long, i As Long, n As Long
Dim sCadena_seccion As String, sCadena_estudios As String
'Una vez filtrados los datos por sección, filtramos por estudios
With Sheets("BBDD")
fin = Application.CountA(.Range("A:A"))
If TextBox2 = "" Then
Me.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
Exit Sub
End If
Me.ListBox1 = Clear
Me.ListBox1.RowSource = Clear
For i = 2 To fin
sCadena_seccion = .Cells(i, 3).Value
sCadena_estudios = .Cells(i, 7).Value
If UCase(sCadena_seccion) Like "*" & UCase(TextBox1.Value) & "*" And _
UCase(sCadena_estudios) Like "*" & UCase(TextBox2.Value) & "*" Then
Me.ListBox1.AddItem
Me.ListBox1.List(n, 0) = .Cells(i, 1).Value
Me.ListBox1.List(n, 1) = .Cells(i, 2).Value
Me.ListBox1.List(n, 2) = .Cells(i, 3).Value
Me.ListBox1.List(n, 3) = .Cells(i, 4).Value
Me.ListBox1.List(n, 4) = .Cells(i, 5).Value
Me.ListBox1.List(n, 5) = .Cells(i, 6).Value
Me.ListBox1.List(n, 6) = .Cells(i, 7).Value
n = n + 1
End If
Next
Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt"
End With
End Sub

TextBox3 – Filtrar por Idiomas:

Private Sub TextBox3_Change()
Dim fin As Long, i As Long, n As Long
Dim sCadena_seccion As String, sCadena_estudios As String, sCadena_idioma As String
'una vez filtrada la información por sección y estudios, filtramos por idioma

With Sheets("BBDD")

fin = Application.CountA(.Range("A:A"))
If TextBox3 = "" Then
Me.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
Exit Sub
End If
Me.ListBox1 = Clear
Me.ListBox1.RowSource = Clear
For i = 2 To fin
sCadena_seccion = .Cells(i, 3).Value
sCadena_estudios = .Cells(i, 7).Value
sCadena_idioma = .Cells(i, 6).Value
If UCase(sCadena_seccion) Like "*" & UCase(TextBox1.Value) & "*" And _
UCase(sCadena_estudios) Like "*" & UCase(TextBox2.Value) & "*" And _
UCase(sCadena_idioma) Like "*" & UCase(TextBox3.Value) & "*" Then
Me.ListBox1.AddItem
Me.ListBox1.List(n, 0) = .Cells(i, 1).Value
Me.ListBox1.List(n, 1) = .Cells(i, 2).Value
Me.ListBox1.List(n, 2) = .Cells(i, 3).Value
Me.ListBox1.List(n, 3) = .Cells(i, 4).Value
Me.ListBox1.List(n, 4) = .Cells(i, 5).Value
Me.ListBox1.List(n, 5) = .Cells(i, 6).Value
Me.ListBox1.List(n, 6) = .Cells(i, 7).Value
n = n + 1
End If
Next
Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt"
End With
End Sub

Una vez te tenemos el código incluido en todos los controles, ya podemos proceder a probar la herramienta. Probaremos con la siguiente consulta: todos los empleados que pertenezcan a la sección de «Bricolaje«, que en sus estudios sean «Diplomados» y que sepan «Chino«.

El resultado es el siguiente:

REALIZAR BUSQUEDAS DEPENDIENTES EN UN LISTBOX3

Como podéis observar, el filtro funciona perfectamente y no es necesario escribir la palabra completa en los textbox, basta con ir escribiendo y la información se irá mostrando. En este caso tenemos a dos personas, perfecto!.

Y eso es todo, creo que es un método muy sencillo, donde trabajamos con un loop, un buscador y cargamos información si los parámetros de la consulta coinciden.

Espero que os resulte de interés : )

Descarga el archivo de ejemplo pulsando en: REALIZAR BÚSQUEDAS DEPENDIENTES EN UN LISTBOX

Nota: Debido a las reiteradas consultas para realizar este trabajo superando las limitaciones de las 10 columnas del método utilizado, dejo en este enlace un ejemplo con más de 10 columnas: EJEMPLO CON MÁS DE 10 COLUMNAS

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Comparte este post

27 comentario en “REALIZAR BÚSQUEDAS DEPENDIENTES EN UN LISTBOX

  1. Hola, tengan un muy feliz año.

    Tengo el siguiente caso
    Poseo una hoja llamada EMPRESA y otra llamada CONTACTOS.
    Estoy realizando un formulario en donde cargo los datos asociados a una empresa, mientras que en la otra hoja, cargo aquellos datos telefónicos de los gerentes que tengo por cada empresa que registro.
    El ingreso y la modificación desde el formulario de empresa se hace perfectamente, sin embargo, para la modificación de los gerentes presento problemas.
    Hasta ahora he logrado hacer una búsqueda sencilla y mostrar en un listboxt todos los gerentes asociados a esa empresa, el problema se me presenta cuando quiero modificar alguno de los datos de ese gerente.

    La secuencia en el formulario es: ingresar un código de empresa y presionar el botón buscar, luego se refleja en el listboxt la lista de gerentes, selecciono el gerente y con un click en el botón editar, debería ir a otra pantalla y mostrarme los datos para editarlos. Y es precisamente, este último paso, que no logro que funcione. No envía los datos para mostrarlos en el nuevo formulario y por ende no puedo modificar.

    Ayuda por favor.

    1. Hola Mercedes, por alguna razón tu correo entró en el buzón de spam de la pagina web. Hoy lo he podido recuperar!. Para poder ayudarte necesito que me envíes un ejemplo, tal como te funciona actualmente y cómo deseas que te funcione. Así podré verificar el código.

      Saludos.

      1. Hola tengo la siguiente consulta, necesito que pueda buscar entre mayúsculas y minúsculas, tanto como algunos errores tipicos de busqueda, por ejemplo: quiero buscar: Tipo de articulos: «Eléctricos»; pero se coloca «electricos), en la búsqueda no me muestra nada, porque no son iguales.

    1. Efectivamente es un listbox, pero el método para realizar búsquedas es el mismo que para un listview.

      Si observas el post, lo que se hace es buscarlos datos en la hoja y luego cargar los datos en el listbox. Con el listview es igual solo que utilizamos un control distinto.

      Intenta realizar el mismo ejemplo. Saludos

    1. Hola Justo:

      Has probado a modificar la rutina que carga el listbox?

      Private Sub UserForm_Initialize()
      'Indicamos el número de columnas que tendrá el listbox
      Me.ListBox1.ColumnCount = 12
      'Definimos tamaño de los espacios
      Me.ListBox1.ColumnWidths = "30pt;150pt;150pt;50pt;50pt;60pt;30pt;150pt;150pt;50pt;50pt;60pt"
      'Cargamos listbox
      Me.ListBox1.RowSource = ("A2:L") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
      End Sub

      Saludos.

  2. Muchas gracias por responder,

    1.- como primer duda:

    Veo que en el archivo de muestra la base de datos esta en la misma hoja, cuando yo cambio el nombre de la hoja «BBDD» por donde tengo los datos el listbox sale en blanco, sin datos, usando el codigo que menciona:

    Me.ListBox1.RowSource = («A2:L») & Worksheets(«BBDD»).Range(«A» & Rows.Count).End(xlUp).Row

    que para mi caso la hoja se llama «Exis_Central» y el total de columnas es 16, pero no me las muestra en el listbox.

    La verdad saque los datos solo usando:

    Me.ListBox1.RowSource = «Exis_Central!A2:P40000»

    pero ese codigo limita a cierto rango el cual varia segun la cantidad de datos cargada…

    2.- segundo problema:

    El problema es que en cada textbox cuando va filtrando no me muestra mas de 10 columnas, me sale un error y me indica que solo pueden mostrarse 10, esa era mi duda, como hacer para que cuando se valla filtrando en cada textbox se reflejen mas de 10 columnas, en este caso las 16, si la hice funcionar con 10 columnas sin problema, pero me faltan 6…

    espero haberme explicado…

    de antemano muchas gracias por el apoyo

    1. Hola Justo:

      He tenido que reprogramar el ejemplo dado que existen limitaciones a la carga de datos en listbox con el método addItem.

      Te envío el ejemplo completo y funcionando correctamente.

      Saludos.

  3. Justo buenas noches… tengo un problema y es que la base de datos esta en una hoja diferente y varia de tamaño que código puedo usar

      1. Hola, gracias, tengo una duda que tengo que cambiar dle codigo para que me permita gregar mas columnas al filtrar los datos? mi base cuenta con 19 columnas. pero agregando

        Me.ListBox1.List(n, 11) = .Cells(i, 12).Value
        Me.ListBox1.List(n, 12) = .Cells(i, 13).Value
        Me.ListBox1.List(n, 13) = .Cells(i, 14).Value
        Me.ListBox1.List(n, 14) = .Cells(i, 15).Value
        Me.ListBox1.List(n, 15) = .Cells(i, 16).Value
        Me.ListBox1.List(n, 16) = .Cells(i, 17).Value
        Me.ListBox1.List(n, 17) = .Cells(i, 18).Value
        Me.ListBox1.List(n, 18) = .Cells(i, 19).Value

        no me agrega las columnas en los resultados de la busqueda

  4. Hola buen día, podría decirme como permitir que ponga mas columnas, ya que llega a la 10 y me error, y en mi practica requiero 23, podría apoyarme?, de antemano muchas gracias por compartir su conocimiento ha sido de mucha ayuda, saludos

  5. Hola muy buenas. Espero que todo el mundo esté bien. Agradecer de antemano estas informaciones. Como en los casos anteriores tengo el problema de cargar más de 10 columnas al buscar. ¿Me podríais ayudar?

  6. Buenas Tardes:

    Yo tengo un listbox y realizo busquedas de nombres a traves de un textbox y al mostrarme los datos que coinciden, yo necesito seleccionar el nombre que estoy buscando y que me muestre los datos de ese registro en textbox que se encuentran en el mismo formulario.

    Ojala puedan ayudarme.

    Gracias.

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies