Hola a todos:
En el post de hoy trataré un tema muy específico de los listbox (o cuadros de lista) en los formularios. Se trata de cómo podemos seleccionar desde un listbox CON UN FILTRO APLICADO la información relacionada en un base de datos.
Para comprender el concepto, es necesario explicarlo con un ejemplo:
En la imagen podemos apreciar como el listbox está filtrado por varios criterios y como en la hoja hemos capturado la fila correspondiente al registro seleccionado en el listbox.
Para poder conseguir esto, debemos siempre crear en nuestra base de datos un indice que vaya desde el 1 hasta el final indicando el número en cada celda: 1, 2, 3 …hasta el final del rango con datos. En mi ejemplo es la primera columna y la nombro como ÍNDICE.
Esto lo automatizaremos cada vez que inicialicemos el formulario que carga los datos en el listbox, así:
Private Sub UserForm_Initialize()
Dim i As Long, fin As Long, Mirango() As Integer
'Borramos ID's e inicializamos de nuevo.
'Los ID deben ser consecutivos a partir de 1
fin = Application.CountA(Sheets("BBDD").Range("B:B"))
Sheets("BBDD").Range("A2:A" & fin).Select
Selection.Clear
ReDim Mirango(1 To fin)
For i = 1 To fin:
Mirango(i) = i
Next i
Worksheets("BBDD").Range("A2:A" & UBound(Mirango)).Value = _
Application.WorksheetFunction.Transpose(Mirango)
Worksheets("BBDD").Range("A1").Select
'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
En rojo está el código de realiza esto, primero limpia datos de la primera columna excepto encabezados y luego a través de un array iniciamos la numeración del 1 hasta el final. El último paso es transponer los datos en la columna A.
Es importante tener en cuenta que este paso lo hará automáticamente cada vez que mostremos el formulario.
Luego, en el evento ListBox1_Click(), solo tenemos que pasar este código para cada vez que seleccionemos una línea en nuestro cuadro de lista, está se seleccione también en la hoja:
Private Sub ListBox1_Click()
Dim i As Long
Dim dato As Integer
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then dato = ListBox1.List(i)
Next i
Sheets("BBDD").Cells(dato + 1, 1).Activate
End Sub
Y os estaréis preguntando porqué hacemos todo esto, pues es sencillo, es fundamental por si queremos modificar los datos a través del listbox. De esta forma podremos modificar lo que hayamos seleccionado, aunque se encuentre filtrado, en nuestra base de datos:
He aprovechado la misma base de datos del post: REALIZAR BÚSQUEDAS DEPENDIENTES EN UN LISTBOX y también parte de la programación para poder ilustrar cómo podemos resolver la cuestión presentada.
Simplemente comento dos líneas de código que he agregado para que el formulario de modificación funcione correctamente:
Para cargar los datos seleccionado en el listbox y en la hoja:
Private Sub UserForm_Initialize()
For j = 1 To 6
Me.Controls("TextBox" & j).Value = ActiveCell.Offset(0, j)
Next j
End Sub
Y para modificar:
Private Sub CommandButton1_Click()
'Definimos variables
Dim i As Long, j As Long, fin As Long, Mirango() As Integer
'Pasamos datos modificados a la hoja
For j = 1 To 6
ActiveCell.Offset(0, j).Value = Me.Controls("Textbox" & j).Value
Next j
'Marcamos de nuevo elemento a modificar
For i = 0 To FORMULARIO.ListBox1.ListCount - 1
If FORMULARIO.ListBox1.Selected(i) Then dato = FORMULARIO.ListBox1.List(i)
Next i
Sheets("BBDD").Cells(dato + 1, 1).Activate
'Actualizamos listbox
FORMULARIO.ListBox1.RowSource = ("A2:G") & Worksheets("BBDD").Range("A" & Rows.Count).End(xlUp).Row
Unload Me
End Sub
En este ejemplo solo he implementado un formulario para realizar modificaciones, cualquier otra mejora como realizar un alta o una baja o que los cambios se guarden automáticamente os lo dejo como ejercicio para practicar : )
Y eso es todo, espero que este método os haya resultado de interés : )
Descarga el archivo de ejemplo pulsando en: MODIFICAR BASE DE DATOS DESDE UN LISTBOX CON UN FILTRO APLICADO
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies
Hola és possible acer eso si la BD está en Access? Como?
Se podría hacer en ADO, pero tendría que estudiarlo. Saludos.
Gracias por la respuesta, me quedo esperando, ansiosamente. Saludos
OK, Muchas gracias Jorge. Saludos
Excelente artículo y magnifico ejemplo, me va a servir de mucho en los proyectos que tengo en el aire.
Me alegro de que te haya servido el ejemplo, Adolfo.
Saludos y gracias!!
Me alegro de que te haya servido el ejemplo, Adolfo.
Saludos y gracias!!
como podría hacer para filtrar mas de 10 columnas
En esta post, al final adjunto un archivo con el ejemplo de mas de 10 columnas:
https://excelsignum.com/2015/06/07/ordenar-columnas-de-forma-independiente/
Buenas,
Me ha ayudado mucho este ejemplo, pero no entiendo una cosa, lo he aplicado en un trabajo que ya tenía y al abrir el formulario la columna índice se borra y al seleccionar en el listbox no activa la fila en la base de datos de excel. El código lo he puesto tal cual, cambiando obviamente nombres únicamente. Qué puede suceder?
Tendría que verlo para poder evaluar el problema. Con lo que comentas no podría decirte a qué se debe.
Saludos.
Buenas noches tengo un inquietud, me ha gustado mucho esto pero quisiera saber si el formulario de búsqueda con listo box abre desde otra pestaña y que así busque o modifiqué no me muestre la base de datos eso es posible
Si, claro. El ejemplo lo hice así para que se pueda ver la tabla con los datos, pero solo habría que hacer referencia a la hoja en la que estuviesen los datos.
Saluds.
Hola Segu! buenas tardes, disculpa tengo una duda. Quiero saber si es posible poder filtrar una tabla dinámica a partir de seleccionar datos multiples en una listbox, y si es posible, como podría hacerlo? Agradezco mucho tu respuesta
Saludos!
Tendría que estudiarlo. Aunque siempre podrías utilizar la segmentación de datos (que es su uso lógico). Saludos.
Y pordría ayudarme a llevarlo a cabo, es que llevo varios días quebrándome la cabeza y no encuentro como poder hacerlo, la secuencia seria de la siguiente manera:
para cada elemento en cierta columna preguntar que elementos quieres filtrar y asi sucesivamente.
De verdad lo agradecería mucho. Saludos!
Si pones en el buscador «dependientes» creo que encontrás algunas entradas que te pueden ayudar bastante.
Hola Segu!, buenos días y muchas gracias por tus enseñanzas y sobre todo por tomarte el tiempo y responder a las dudas, pocos lo hacen. Es posible que en formulario que se abre para modificar, algunos campos, por ejemplo el de SECCIÓN, se abra un cuadro de selección con las diferentes opciones (Alimentación, Bricolaje, Deportes,……) y no tener que teclearlo?
Igualmente puedes empezar por donde iría el tema de las altas, bajas y que los cambios se guarden automáticamente?. Lo he empezado varias veces, pero no lo consigo
Muchísimas gracias
Se podría hacer utilizando un combobox en lugar de un textbox. Hay ejemplos de como cargar un combobox cuando se muestra una userform en esta web. Sobre lo otro, no comprendo bien lo de las altas y las bajas…
Mandoche un Paypal, no é moito pero significativo. Unha aperta
Muchísimas gracias por tu aportación y ayuda, druida!.
Buenas noches. me encanto el procedimiento que hiciste muy práctico y lo estoy poniendo a prueba. pero tengo una duda. sí creo un commandbutton con la opción eliminar registro. cual seria el proceso. porque aquí enseñas a modificar desde el listbox con el cmb modificar. pero si yo quiero seleccionar un ítem del listbox y luego eliminar ese ítem. cual sería el proceso. porque estoy estancado ahí. podrías ayudarme.?
Esto te puede ayudar: https://excelsignum.com/2018/01/20/eliminar-duplicados-directamente-sobre-el-contenido-de-un-listbox/