EXPORTAR DATOS SELECCIONADOS DE UN LISTBOX A OTRO LISTBOX EN OTRO FORMULARIO

Hace unos días recibí una consulta sobre formularios, la petición en concreto era sobre la necesidad de pasar la información seleccionada en varios listbox de un formulario a los mismo listbox pero en otro formulario.

Además, pedía que aunque se seleccionasen listbox diferentes, se pasase la misma información al segundo formulario y sin duplicar los datos.

Aunque puede parecer una consulta sencilla, la especificación de poder seleccionar cualquier item en cualquier listbox y que la información no se duplique durante el proceso, hacen que requiera un desarrollo a medida.

El post anterior, en el que trataba acerca de cargar datos en un listbox y realizar consultas y filtros con SQL y ADO, ya formaba parte de esta consulta, solo que no quería publicar un post demasiado extenso cuando se puede hacer en dos partes y bien explicado 🙂

Por lo tanto, vamos a utilizar el formulario del post: CARGAR DATOS EN LISTBOX Y REALIZAR BÚSQUEDAS CON ADO Y CONSULTAS SQL que cargaba los datos que previamente habíamos seleccionado a través de los criterios indicados en un buscador, por ejemplo todos los nombres que contienen una “A”.

EXPORTAR DATOS SELECCIONADOS DE UN LISTBOX A OTRO LISTBOX EN OTRO FORMULARIO1

Ahora lo que se pide es pasar los items que queramos seleccionar a un segundo formulario (para nosotros userform2). Por ejemplo así:

EXPORTAR DATOS SELECCIONADOS DE UN LISTBOX A OTRO LISTBOX EN OTRO FORMULARIO2

Como podéis ver, seleccionamos en una ocasión el nombre, en otra la asignatura y en otra la calificación.

Para poder exportar esta selección debemos incluir un botón de comando y pegar el siguiente código:

Private Sub CommandButton2_Click()
'Declaramos las variables
Dim i As Integer, j As Integer, n As Integer
Dim Lista As MSForms.ListBox
Dim nLista As MSForms.ListBox
Dim Control As Control
'Contamos el número de Listbox en el formulario
For Each Control In Me.Controls
If TypeName(Control) = "ListBox" Then
Lbox = Lbox + 1
End If
Next
'Primer bucle: recorremos todos los formularios
For j = 1 To Lbox
Set Lista = Me.Controls("Listbox" & j)
'Segundo bucle: por cada formulario, recorremos los item que contiene
'y detectamos el item seleccionado.
For i = 0 To Lista.ListCount - 1
If Lista.Selected(i) = True Then
'Tercer bucle, volvemos a recorrer todos los items
' y si existen varios items seleccionados en la misma fila (misma persona)
'desmarcamos todos menos el primero (evitando así duplicados).
For n = j + 1 To Lbox
Set nLista = Me.Controls("Listbox" & n)
If nLista.Selected(i) = True Then nLista.Selected(i) = False
Next n
'Pasamos los datos seleccionados al formulario 2
UserForm2.ListBox1.AddItem Me.ListBox1.List(i)
UserForm2.ListBox2.AddItem Me.ListBox2.List(i)
UserForm2.ListBox3.AddItem Me.ListBox3.List(i)
UserForm2.ListBox4.AddItem Me.ListBox4.List(i)
UserForm2.ListBox5.AddItem Me.ListBox5.List(i)
End If
Next i
Next j
'Mostramos formulario 2
UserForm2.Show
End Sub

Una vez pulsado el botón, se muestra el formulario 2 con los datos que hemos seleccionado. Es decir, realiza la tarea correctamente.

EXPORTAR DATOS SELECCIONADOS DE UN LISTBOX A OTRO LISTBOX EN OTRO FORMULARIO3

Pero ¿qué pasaría si seleccionamos para un mismo item (o persona) varias informaciones?, en lógica si el código importa todo lo seleccionado … ¡duplicaría la información!

Pero esto se soluciona con la siguiente parte del código: donde indicamos que si un ítem ha sido seleccionado varias veces, solo tenga en cuenta la primera de ellas, de esta forma no duplicaremos la información:

For n = j + 1 To Lbox
Set nLista = Me.Controls("Listbox" & n)
If nLista.Selected(i) = True Then nLista.Selected(i) = False
Next n

Os he dejado el código muy comentado para que sea sencillo comprender cómo funciona. Espero que os resulte interesante y os sea de utilidad 🙂

Por supuesto, también está la macro del ejercicio anterior, necesaria para cargar los listbox y hacer las búsquedas.

Por cierto, tanto en este post, como en el anterior, el formulario se abre con el evento Workbook.Open, es decir, en el momento que abrimos el archivo se carga automáticamente el formulario. Es posible que si tenéis activada la seguridad en las macros, en el momento de abrir genere un error. Esto se soluciona guardando el archivo y volviéndolo a abrir, o con un on error resume next (pero no me gusta abusar de este recurso).

Descarga el archivo de ejemplo pulsando en: EXPORTAR DATOS SELECCIONADOS DE UN LISTBOX A OTRO LISTBOX EN OTRO FORMULARIO

Anuncios

GESTIÓN DE CLIENTES (modificaciones)

Ya hace varios años que publiqué un pequeño programa realizado en Excel con motivo de emular las bases de datos de Access y reclamar también así las posibilidades que ofrece Excel para confeccionar este tipo de trabajos: GESTIÓN DE CLIENTES

El motivo de la actualización de hoy, no se debe a mejoras en el programa (que se podrían realizar, pero con tiempo suficiente) , sino a varias consultas y peticiones realizadas por los lectores en cuanto a la necesidad de completar todos los datos que se piden al dar de alta a un cliente. Es decir, que muchos lectores, necesitan que sea posible dar de alta a un cliente sin tener que grabar los datos relativos a su dirección o contacto, de modo que así puedan realizar esta tarea mucho más rápida.

En mi opinión personal y desde el ámbito de la información y las bases de datos, siempre consideraré que es fundamental contar con la máxima cantidad de información. Y esto es fundamental, con ello conseguiremos una base de datos de calidad, fiable y útil. El dar de alta a un cliente sin una dirección asociada o sin un teléfono móvil, puede provocar que cuando necesitemos ponernos en contacto con él no lo podamos hacer, cosa que se habría solucionado perdiendo unos minutos en la toda de datos, por eso en el formulario GESTIÓN DE CLIENTES esta información es obligatoria.

Dicho esto, también tengo en cuenta que en ciertos momentos, no se dispone de dicha información o el cliente no quiere facilitarla, y siempre será mejor dejar un dato en blanco que inventarlo.

Por ello dejo aquí otra versión donde solo se pide de forma obligatoria los datos personales, pudiendo dejar sin rellenar el resto de datos (direcciones y teléfonos). De todas formas, os invito a que siempre intentéis dar de alta todos los datos que podías de vuestros contactos.

Otra mejora que he introducido en este formulario ha sido implementar el buscador de nombres. Es algo sencillo, simplemente he agregado un listbox que se carga cada vez que se pasa el cursor del ratón por encima y para buscar el nombre basta con teclear la primera letra y mostrará los resultados, luego solo hay que seleccionarlo y pulsar en “Buscar”.

También recordar que el formulario está completamente abierto, y si cualquier usuario desea realizar nuevas modificaciones o actualizaciones puede hacerlo fácilmente entrado en el código.

 

Descarga el archivo pulsando enGESTION DE CLIENTES