miércoles, 1 de julio de 2015

VBA: Arrastrando datos entre ListBox de un formulario de Excel.

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...

VBA: Arrastrando datos entre ListBox de un formulario de Excel.



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í:

VBA: Arrastrando datos entre ListBox de un formulario de Excel.

No hay comentarios:

Publicar un comentario en la entrada