2016-07-01 15 views
3

Ich versuche, eine Drag & Drop-Funktion in VBA zu erstellen, um Benutzern zu ermöglichen, Elemente zwischen ListBoxen auf einem UserForm zu verschieben. VBA Listbox Drag & Drop

enter image description here

Das Problem, das ich habe, ist, dass, wenn Sie die Maustaste gedrückt klicken und die Maus bewegen, die ListBox Auswahl bewegt sich nach oben und unten auf der Liste. Es ist mir gelungen, einige Zeilen zu schreiben, die die Auswahl erfassen, wenn Sie die Maustaste gedrückt halten. Wenn Sie sie also in die andere ListBox ziehen, wird das richtige Element gelöscht. Allerdings scheint die markierte Auswahl der ersten ListBox deaktiviert zu sein Putting für den Endnutzer.

Ich habe versucht, die Auswahl auf das Originalelement jedes Mal, wenn Sie die Maus auf dem MouseMove-Ereignis bewegen, aber es funktioniert einfach nicht, wenn der Cursor mit Elementen auf der Liste übereinstimmt, es springt jedoch zurück, wenn Sie Bewegen Sie den Cursor unter die Liste.

Here's a copy of the macro workbook (Excel 2010)

Könnte jemand etwas Licht leuchten auf, wie dieses verbessert werden könnte?

Edit Hinweis: Dieses Beispiel wird nur Elemente aus dem linken Feld auf der rechten Seite hinzufügen, ich plane, alle hier gefundenen Lösungen auf einem UserForm mit mehreren ListBoxen zu replizieren, so hoffe ich, dass jemand eine gute Mechanik kennt, um dies zu erreichen.

+0

Warum fügen Sie keine Schaltfläche zwischen zwei Feldern hinzu und schreiben Code, um ausgewählte Elemente von einer Box in eine andere zu verschieben ...? gefällt das [** eins **] (http://www.contextures.com/excelvbalistboxmoveuserform.html). – ManishChristian

+0

@ManishChristian Dies ist ein abgespecktes Beispiel für die Diskussion, die tatsächliche Verwendung, die ich im Sinn habe, ist eine Form mit mehreren Kästchen, in denen mehrere Schaltflächen, um Elemente zwischen ihnen alle auszutauschen, ziemlich umständlich werden könnte. – Carrosive

+1

Überprüfen Sie den Link [** this **] (http://www.mrexcel.com/forum/excel-questions/446895-need-help-code-drag-drop.html). – ManishChristian

Antwort

1

Wie von Manish's Kommentar, this link Details eine elegante Lösung für diese, siehe den späteren Beitrag für die bessere Lösung, die für eine beliebige Anzahl von ListBoxen auf einem UserForm wirksam ist. Ich habe jedoch ein paar Anpassungen vorgenommen, damit es in meinem Fall besser funktioniert.

ist ein Fehler mit anderen Steuerelemente auf der Userform geworfen, die nicht Listboxen sind, dies zu korrigieren ich UserForm_Initialize() geändert:

Private Sub UserForm_Initialize() 
    Dim Ctrl As MSForms.Control 
    Dim LMB As ListBoxDragAndDropManager 
    Dim x As Integer 

    Set LBs = New Collection 
    For Each Ctrl In Me.Controls 
     If TypeName(Ctrl) = "ListBox" Then 
      Set LMB = New ListBoxDragAndDropManager 
      Set LMB.ThisListBox = Ctrl 
      LBs.Add LMB 
     End If 
    Next 
End Sub 

In der ListBoxDragAndDropManager Klasse habe ich die folgenden Unter so dass nur eine List-Box kann zu einem Zeitpunkt ausgewählt wird, macht es die Userform Aussehen und im Gebrauch besser fühlen, aber keinen Unterschied machen Funktion nicht:

Private Sub pThisListBox_Click() 
    Dim Ctrl As MSForms.Control 
    Dim i As Integer 

    For Each Ctrl In ThisListBox.Parent.Controls 
     If Ctrl.Name <> ThisListBox.Name And TypeName(Ctrl) = "ListBox" Then 
      For i = 0 To Ctrl.ListCount - 1 
       Ctrl.Selected(i) = False 
      Next i 
     End If 
    Next Ctrl 
End Sub 
-1

A-Klasse-Modul kann für Listbox per Drag & Drop verwendet werden:

Private Sub ListBox1_MouseMove(ByVal Button As _ 
    Integer, ByVal Shift As Integer, ByVal X As _ 
    Single, ByVal Y As Single) 
    Dim MyDataObject As DataObject 
    If Button = 1 Then 
     On Error Resume Next 
     Set MyDataObject = New DataObject 
     Dim Effect As Integer 
     MyDataObject.SetText ListBox1.Value 
     Effect = MyDataObject.StartDrag 
    End If 
End Sub