Un lector me planteaba cómo podríamos mover datos de un ListBox a otro dentro de UserForm de Excel, y es lo que procedo a explicar hoy...
Para esto deberemos emplear algunos eventos poco habituales en nuestros ListBox:
Evento _BeforeDragOver para lanzar un proceso cuando el usuario ejecute una acción de arrastrar y colocar...
Evento _BeforeDropOrPaste para lanzar un proceso cuando el usuario esté a punto de colocar o pegar datos en un objeto...
y Evento _MouseMove cuando el usuario mueve el mouse.
Además usaremos un método concreto asociado a la acción de arrastrar:
El método .StartDrag da inicio a una operación de arrastrar y colocar para un objeto DataObject.
Construiremos un sencillo UserForm que contiene dos ListBox renombrados como:
LB_Origen
LB_Destino
En la propiedad .RowSource del primer ListBox (LB_Origen) hemos tomado los datos de la Tabla1 de nuestra hoja de cálculo para cargarlo de datos...
Ya estamos en disposición de incorporar el código necesario...
Para ello insertamos nuestro código asociándolo a nuestro UserForm de nuestro proyecto de VBA desde el editor de VB... en la ventana de código específica del UserForm1:
Podemos ver el efecto aquí:
Para esto deberemos emplear algunos eventos poco habituales en nuestros ListBox:
Evento _BeforeDragOver para lanzar un proceso cuando el usuario ejecute una acción de arrastrar y colocar...
Evento _BeforeDropOrPaste para lanzar un proceso cuando el usuario esté a punto de colocar o pegar datos en un objeto...
y Evento _MouseMove cuando el usuario mueve el mouse.
Además usaremos un método concreto asociado a la acción de arrastrar:
El método .StartDrag da inicio a una operación de arrastrar y colocar para un objeto DataObject.
Construiremos un sencillo UserForm que contiene dos ListBox renombrados como:
LB_Origen
LB_Destino
En la propiedad .RowSource del primer ListBox (LB_Origen) hemos tomado los datos de la Tabla1 de nuestra hoja de cálculo para cargarlo de datos...
Ya estamos en disposición de incorporar el código necesario...
Para ello insertamos nuestro código asociándolo a nuestro UserForm de nuestro proyecto de VBA desde el editor de VB... en la ventana de código específica del UserForm1:
Private Sub LBo_Destino_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean, ByVal Data As _ MSForms.DataObject, ByVal x As Single, _ ByVal Y As Single, ByVal DragState As Long, _ ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer) 'este evento se produce cuando se está ejecutando una operación de arrastrar y colocar. Cancel = True Effect = 1 End Sub ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub LBo_Destino_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, _ ByVal Action As Long, ByVal Data As MSForms.DataObject, ByVal x As Single, _ ByVal Y As Single, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer) 'este otro evento se produce cuando el usuario está a punto de colocar o pegar datos en un objeto. Cancel = True Effect = 1 Dim iIndex As Long, col As Integer With LBo_Origen 'determinamos cuál ha sido el elemento seleccionado iIndex = LBo_Origen.ListIndex 'añadimos un elemento al ListBox de destino... LBo_Destino.AddItem .List(iIndex, 0), 0 'incorporamos los valores de las diferentes columnas 'desde el LB de origen al LB destino For col = 1 To LBo_Origen.ColumnCount - 1 LBo_Destino.List(0, col) = .List(iIndex, col) Next col End With End Sub ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub LBo_Origen_MouseMove(ByVal Button As Integer, _ ByVal Shift As Integer, ByVal x As Single, ByVal Y As Single) 'este evento se produce cuando el usuario mueve el mouse... Dim MyDataObject As DataObject If Button = 1 Then Set MyDataObject = New DataObject Dim Effect As Integer 'Con el método .SetText copiamos una cadena de texto al objeto DataObject... MyDataObject.SetText LBo_Origen.Value 'el método .StartDrag da inicio a una operación de arrastrar y colocar para un objeto DataObject. Effect = MyDataObject.StartDrag End If End Sub
Podemos ver el efecto aquí:
No hay comentarios:
Publicar un comentario
Nota: solo los miembros de este blog pueden publicar comentarios.