Macro para leer los registros seleccionados de un cuadro combinado de checklist

Mi archivo tiene 3 hojas que son Buscar, BD, Filtro

En la hoja BD están todos mis datos con los sig. Campos

Id_banco |Banco | Producto | id_concepto |Concepto | Costo | Medio

En la hoja Filtro tengo las sig. Columnas que saque de mi base original

Id_banco |Banco || id_concepto |Concepto |id_medio| Medio

  • En total tengo 28 bancos y sus id van del 1 al 28
  • En Concepto tengo un total de 12 y sus id van del 100 al 111
  • Y en medio tengo un total de 6 opciones y sus id van del 200 al 205

Y en la hoja buscar Tengo 3 ListBox

ListBox1: aquí tengo los 28 Bancos que los tome de la hoja “Filtro! B2:B29”

ListBox2: Tengo los 12 conceptos que los tome de “Filtro!D2:D:13)

ListBox3: Tengo 6 medios de “Filtro! F2:F7”

En esta hoja quiero que según los checklist que marquemos me haga una búsqueda en mi base de datos y abajito me muestre los siguientes campos con los resultados que arroje la búsqueda

De B18:B29 estarán fijos los 12 conceptos en C16 Estará el nombre del Banco y en C17 el nombre del producto pero es muy posible que un banco tenga más de un producto con las características que seleccionen en los checklist y dentro de mi tabla estará el Costo

NOTA: mi ListBox2 en un futuro será modificada por eso de momento son los mismos que están de B18:B29 en la hoja Buscar

Ahora como hago que al seleccionar los campos de los ListBox me haga la búsqueda en mi base de datos

1 respuesta

Respuesta
1

Ya entendí lo que necesitas, pero para realizar el filtro tengo que ver cómo están tus datos y tus listbox, podrías enviarme tu archivo, en la hoja buscar pon un pequeño ejemplo de lo que esperas como resultado.

Mi correo [email protected]

En el asunto del correo escribe tu nombre de usuario “Candy Candy” y el título de esta pregunta.

Muchas gracias Dante ya te mande el archivo 

Saludos

H o l a:

Te anexo parte de la macro para filtrar solamente el banco.

Ya no terminé la macro, porque me di cuenta que lo que necesitas es una tabla dinámica, te envié un vídeo para mostrarte cómo crear la tabla dinámica y cómo puedes realizar los filtros por banco y por producto.

Private Sub CommandButton1_Click()
'Por.Dante Amor
    Set h1 = Sheets("Buscar")
    Set h2 = Sheets("BD")
    '
    u = h1.Range("A" & Rows.Count).End(xlUp).Row
    If u < 17 Then u = 17
    h1.Range("A17:N" & u).ClearContents
    k = 17
    '
    For i = 2 To h2.Range("A" & Rows.Count).End(xlUp).Row
        If ListBox1.ListCount > -1 Then
            For j = 0 To ListBox1.ListCount - 1
                If ListBox1.Selected(j) Then
                    x = h2.Cells(i, "B")
                    If h2.Cells(i, "B") = ListBox1.List(j) Then
                        h1.Cells(k, "A") = h2.Cells(i, "B")
                        k = k + 1
                    End If
                End If
            Next
        End If
    Next
End Sub

S a l u d o s 

Muchas gracias por el código me ha servido de mucho aun no puedo ver el vídeo porque el Internet en donde estoy es muy lento pero más tarde en mi casa lo veré

No soy muy buena programando así que algunas cosas no me quedaron claras aquí te pongo el código que me mandaste y la manera en que lo interprete espero que me puedas ayudar a terminar de entender el código por favor te lo agradecería mucho

Sobre lo de mejor usar tablas dinámicas ya lo había visto un poco pero como no muchas personas saben usarlas  yo quiero que cualquier persona que abra el Excel pueda realizar una consulta sin saber nada sobre el manejo de Excel  y por eso me gustaría aprender a hacerlo de esta manera pero quiero ver el video primero 

Aquí el código

Private Sub CommandButton1_Click()
'Por.Dante Amor
    Set h1 = Sheets("Buscar")       'define la hoja  Buscar como objeto h1
    Set h2 = Sheets("BD")        'define la hoja  BD como objeto h2
    '
    u = h1.Range("A" & Rows.Count).End(xlUp).Row        ‘Define a u como los valores que tenga la columna A que es en donde aparecerán los resultados de seleccionar banco
    If u < 17 Then u = 17  ‘mis resultados comienzan a aparecer a partir de la fila 17 por lo tanto  aquí decimos donde comenzara a poner los resultados 
    h1.Range("A17:N" & u).ClearContents  ‘aquí  borro lo que tenga en A17 hasta el último resultado 
    k = 17      ‘define la variable k
    '
‘aquí comienza un ciclo For
    For i = 2 To h2.Range("A" & Rows.Count).End(xlUp).Row     ‘inicializamos I que será igual a 2(por qué 2?) que va a mi BD… Esta instrucción no me queda clara 
        If ListBox1.ListCount > -1 Then  ‘si en mi primer cuadro hay seleccionado al menos una opción entonces (¿si seleccionó uno de los checklist el contador empieza en cero y si escojo 2 en contador se va a 1 y así sucesivamente?) 
            For j = 0 To ListBox1.ListCount – 1 ‘Ahora hacemos j igual a 0 (¿esto es como para decir que mi listbox esta en blanco y cuando seleccionemos una opción se guarda en j?)… Esta instrucción no me queda clara pero j son los valores del listbox
                If ListBox1.Selected(j) Then    ‘si seleccionamos una opción del cuadro combinado se guarda en j y entonces 
                    x = h2.Cells(i, "B")   ‘definimos una variable x que me servirá  para que según el valor de i que sería la opción que elegimos lo busque en la columna B de mi base de datos  
                    If h2.Cells(i, "B") = ListBox1.List(j) Then  ‘si mi X es igual que lo que está seleccionado  en mi listbox entonces  (¿aquí  puedo poner “x” en lugar de  “h2.Cells(i, "B")”?)
                        h1.Cells(k, "A") = h2.Cells(i, "B")       ‘aquí va a poner los mismos resultados  que coincidan con i(el valor buscado) que encuentre en mi columna de B de la BD y los pondrá en la columna A a partir de k que era 17 en mi hoja Buscar 
                        k = k + 1      ‘ es para  decirle a k que avance hacia abajo 
                    End If
                End If
            Next
        End If
    Next
End Sub

Y de nuevo muchas, muchas gracias 

H o l a

Revisa el vídeo, verás que no es tan complicado.

Te anexo la macro con comentarios:

Private Sub CommandButton1_Click()
'Por.Dante Amor
    Set h1 = Sheets("Buscar")   'Establece la "Buscar" en el objeto h1
    Set h2 = Sheets("BD")       'Establece la "BD" en el objeto h2
    '
    'busca la última fila para borrar desde la 17 hasta la última fila
    u = h1.Range("A" & Rows.Count).End(xlUp).Row
    If u < 17 Then u = 17
    H1.Range("A17:N" & u). ClearContents
    '
    'inicia k en 17 ya que va a empezar a poner registros en la fila 17
    k = 17
    '
    'inicia el ciclo en 2, ya que los datos de BD empiezan en la fila 2
    'El ciclo termina en la última fila de datos de la column A de BD
    For i = 2 To h2.Range("A" & Rows.Count).End(xlUp).Row
        'Revisa los datos contenidos en el listbox1 (Bancos)
        If ListBox1.ListCount > -1 Then
            'Para cada registro en el listbox1
            For j = 0 To ListBox1.ListCount - 1
                'Si el registro está marcado
                If ListBox1.Selected(j) Then
                    'Si el Banco de BD es igual al Banco del listbox
                    If h2.Cells(i, "B") = ListBox1.List(j) Then
                        'Pone el banco que está en la fila i de h2(BD), en h1(buscar) en la fila k
                        h1.Cells(k, "A") = h2.Cells(i, "B")
                        k = k + 1
                    End If
                End If
            Next
        End If
    Next
End Sub

S a l u d o s .

Muchas gracias ya vi el vídeo que amable eres y las tablas dinámicas son mas sencillas gracias lo haré así pero después quiero aprender como hacerlo de la otra forma por ahora estudiare un poco mas y gracias por comentar el código me es de gran ayuda 

Muchísimas gracias Dante de verdad gracias

Saludos Candy

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas