Al momento de seleccionar algún elemento que tengamos en un control ListBox, dentro de un Userform, podemos optar por pasar cada columna de la lista a controles dentro del mismo formulario o a controles ubicados en otros Userforms. También por supuesto podemos optar por enviarlos a una hoja Excel.
A continuación imágenes y códigos para cada modelo.
CASO 1: pasar algunas columnas del elemento seleccionado a campos dentro del mismo Userform. Aquí se toman los datos de la hoja base de Materiales.
Invocaremos al evento Doble Clic del control Lista. Pasaremos a los diferentes controles del formulario el contenido de algunas columnas de ese elemento seleccionado. La fila seleccionada en la lista se reconoce como ListBox1.ListIndex. Y las columnas inician en el valor 0.
Por ejemplo, el valor 'Cod' de la fila seleccionada en la imagen, se reconoce como: ListBox1.List(ListBox1.ListIndex, 0)
Ajustar el nombre de cada control que tengan en el formulario.
Private Sub ListBox1_DblClick(ByVal Cancel As
MSForms.ReturnBoolean
'si no se selecciona algún elemento de la
lista, cancela.
If ListBox1.ListIndex < 0 Then Exit Sub
‘se guarda en la variable el contenido de la primera
columna
dato = ListBox1.List(ListBox1.ListIndex, 0)
‘se lo busca en la hoja Base de Materiales, previamente
llamada como ‘homa’ (*)
Set busco = homa.Range("B:B").Find(dato,
LookIn:=xlValues, lookat:=xlWhole)
‘si el dato fue encontrado, se pasan algunas columnas
a la hoja
If Not busco Is Nothing Then
TextBox9 =
homa.Range("C" & busco.Row)
TextBox8 =
homa.Range("B" & busco.Row)
TextBox3 =
homa.Range("D" & busco.Row)
TextBox5 =
homa.Range("E" & busco.Row)
‘se posiciona en el primer control a rellenar por
parte del usuario
‘se quita la selección a la lista.
(*) En el evento Initialize, se declaró una variable (pública) llamada 'homa' para guardar el nombre de la hoja base de Materiales.
CASO 2: pasar algunos campos del elemento seleccionado a controles dentro de otro Userform.
En el Userform de la izquierda se observa una lupa que tendrá asociada la subrutina que llama al formulario de la derecha. Ajustar los nombres del control imagen y del segundo formulario.
Private Sub Image1_Click() 'botón que llama al segundo formulario.
UserFactura.Show
End Sub
En el segundo Userform (UserFactura) se programó también el evento Doble Clic. Y en este modelo, se pasó cada columna del elemento seleccionado a los controles del primer Userform (UF_UsoMaterial). Ajustar todos los nombres a los que correspondan en vuestros modelos.
Private Sub ListBox1_DblClick(ByVal Cancel As
MSForms.ReturnBoolean)
‘se controla que esté seleccionado un elemento de la
lista
If ListBox1.ListIndex >= 0 Then
‘se pasan
algunas columnas de la lista a los controles del primer UF
With UF_UsoMaterial
.TextBox8 = ListBox1.List(ListBox1.ListIndex, 0)
.TextBox9 = ListBox1.List(ListBox1.ListIndex, 1)
.TextBox3 = ListBox1.List(ListBox1.ListIndex, 2)
.TextBox5 = ListBox1.List(ListBox1.ListIndex, 3)
'revisar qué
otros campos debieran pasarse al otro formulario
'....
'se cierra
este uf quedando en el de Factura. Se quita el filtro a la hoja.
If
ActiveSheet.FilterMode = True Then ActiveSheet.ShowAllData
'se cierra este segundo formulario para volver al primero.
Unload Me
End If
End Sub
Nota: en el libro se incluye la macro de búsqueda adaptada del ejemplo del video Nº 36: Filtro dinámico.ATENCIÓN: es importante que los 2 userforms tengan el mismo valor en su propiedad ShowModal.
CASO 3: pasar algunos campos del elemento seleccionado a una segunda hoja Excel.
Siguiendo el ejemplo anterior, para pasar elementos seleccionados de una lista a una hoja simplemente se cambiará el destino reemplazando el nombre del primer formulario y su campo por el de la fila y columna en la hoja destino (en el ejemplo es SALIDAS).
Aquí se utilizó el evento Click aunque bien podría ser también el DoubleClick.
IMPORTANTE: No se deben desarrollar los 2 eventos en un mismo Userform. Ya que al intentar presionar doble click ya se ejecuta el simple click ;)
Ejemplo:
Private Sub ListBox1_Click()
‘se controla que esté
seleccionado un elemento de la lista
If ListBox1.ListIndex >= 0
Then
‘se pasan algunas columnas de la
lista a una hoja resumen de Salidas
'-------------- OPCIONAL: PASAR A UNA HOJA DE SALIDAS
X =
Sheets("SALIDAS").Range("a" & Rows.Count).End(xlUp).Row
+ 1
With
Sheets("SALIDAS")
.Range("A" & X) = ListBox1.List(ListBox1.ListIndex, 0)
.Range("B" & X) = ListBox1.List(ListBox1.ListIndex, 1)
.Range("C" & X) = ListBox1.List(ListBox1.ListIndex, 2)
.Range("D" & X) = ListBox1.List(ListBox1.ListIndex, 3)
End With
'----------------------------------------------------------------------
‘otros pases
Unload Me
End If
End Sub
Ver video Nº 87 desde aquí.
Otros videos relacionados:
Nº 36: Filtro dinámico desde un Userform. Nº 39: RowSource. Actualizar desplegables desde otro formulario. Nº 9: Macros compartidas.