Hola a todos!
Qué tal os va?, espero que muy bien!. El post de hoy tratará sobre los listbox y la posibilidad de sincronizar la información entre varios.
Como es habitual, el post surge fruto de una duda, en la que el lector planteaba la siguiente problemática: Tenía varios listbox en los que se mostraban varios campos de un tabla de Excel y lo que necesitaba es que si en el primero seleccionada un determinado ítem, en el segundo se debía mostrar la información relacionada con ese ítem, y así hasta varios.
Como sabéis, cuando cargamos información en varios listbox, aunque provengan de la misma tabla, la selección y el uso del scroll es totalmente independiente el uno del otro. Para hacer lo que el lector solicita, debemos sincronizarlos. Ahora os mostraré el ejemplo.
Vamos a cargar una base de datos en 3 listbox:
En este ejemplo voy a utilizar ADO para cargar los listbox (no es el tema del post) y ya lo vimos en otras entradas, por ejemplo: CARGAR DATOS EN LISTBOX Y REALIZAR BÚSQUEDAS CON ADO Y CONSULTAS SQL por eso, no voy a publicar aquí el código, os lo dejo en el archivo de prueba.
Pues bien, la información cargada quedaría así:
Como podéis observar he dejado un textbox para realizar búsquedas dado que he reutilizado parte del código de la entrada que os he mencionado al principio.
Y ahora, para sincronizar los listbox, debemos utilizar el evento click en cada uno de ellos y pegar este código en el formulario:
Private Sub ListBox1_Click()
ListBox2.ListIndex = ListBox1.ListIndex
ListBox2.TopIndex = ListBox1.TopIndex
ListBox3.ListIndex = ListBox1.ListIndex
ListBox3.TopIndex = ListBox1.TopIndex
End Sub
Private Sub ListBox2_Click()
ListBox1.ListIndex = ListBox2.ListIndex
ListBox1.TopIndex = ListBox2.TopIndex
ListBox3.ListIndex = ListBox2.ListIndex
ListBox3.TopIndex = ListBox2.TopIndex
End Sub
Private Sub ListBox3_Click()
ListBox1.ListIndex = ListBox3.ListIndex
ListBox1.TopIndex = ListBox3.TopIndex
ListBox2.ListIndex = ListBox3.ListIndex
ListBox2.TopIndex = ListBox3.TopIndex
End Sub
Lo que estamos haciendo es igualar la propiedad .ListIndex para identificar el elemento que tiene el foco y el .TopIndex para detectar el elemento en la parte superior del listbox.
El resultado será que siempre marcaremos la línea de información del ítem seleccionado en todos los listbox:
y eso es todo. Ya está solucionada la consulta : )
Descarga el archivo de ejemplo pulsando en: SINCRONIZAR LA INFORMACIÓN DE VARIOS LISTBOX
¿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
Como hacer si Listbox1 tiene dos o más columns?
Hola jokaman:
Funciaría igual. Dado que estamos sincronizando información de un listox (en el caso de varias columnas serían dentro de un listbox, por lo tanto, el código funciona exactamente igual).
Saludos.
Lo perguntaba como popular la ListBox, com más de una coluna
Hola Jorge, no entiendo la pregunta… a qué te refieres con «popular». Saludos.
Populae viene do inglês «Populate», queria decir que la Listbox tenia datos en dos o mas colunas e como hacer para introducir esses datos en la listbox
Aunque este no es el post relacionado con ese tema. Para cargar un listbox con varias columnas puedes hacerlo simplemente con rowsource:
Me.ListBox1.RowSource = «B2:E» & Hoja2.Range(«B» & Rows.Count).End(xlUp).Row
En este caso, cargas todos los datos desde B2 hasta E (y el final de la hoja con datos).
Si tienes dudas, mira este post: https://excelsignum.com/2013/12/19/mostrar-datos-en-un-listbox-y-exportar-de-excel-a-pdf/
Gracias
He conseguido hacerlo de otro modo, pero muchas gracias en la misma.
Te envié un email, cuando tengas un tempinho ve si es posible hacer lo que refiero en él.
Gracias
Jorge
Magnífico aporte
Estuve buscando algo así para aplicarlo a otro proyecto que tengo funcionando pero tenia q pulirlo
No es necesario la linea del TopIndex
Saludos!!