首页 文章

VBA列表框拖放

提问于
浏览
3

我正在尝试在VBA中生成拖放功能,以允许用户在UserForm上的ListBox之间移动项目 .

enter image description here

我遇到的问题是,当您单击鼠标按钮并移动鼠标时,ListBox选项会在列表中上下移动 . 当你按下鼠标按钮时,我设法编写了一些捕获选择的行,所以当你将它拖到另一个ListBox时,正确的项目会被删除,但我觉得第一个ListBox的移动突出显示的选择可能会关闭为最终用户提供服务 .

我已经尝试在每次在MouseMove事件上移动鼠标时将选择设置为原始项目,但是当光标与列表中的项目一致时它只是不起作用,它会在您将光标移动到下面时反弹列表 .

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

任何人都可以对这如何改进有所启发吗?

编辑注释:这个例子只会向右边的左边框添加项目,我打算在具有多个ListBoxes的UserForm上复制这里找到的任何解决方案,所以我希望有人知道一个很好的机制来实现这个目标 .

2 回答

  • -1

    根据Manish的评论,this link为此详细介绍了一个优雅的解决方案,请查看更好的解决方案的后期帖子,该解决方案对UserForm上的任意数量的ListBox都有效 . 我做了一些调整,以使其在我的情况下更好地工作 .

    UserForm上的其他控件抛出的错误不是ListBoxes,为了纠正这个问题,我将 UserForm_Initialize() 更改为:

    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
    

    ListBoxDragAndDropManager 类中,我添加了以下sub,以便一次只能选择一个ListBox,它使UserForm在使用中看起来更好看,但在功能上没有任何区别:

    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
    
  • 2

    类模块可用于列表框拖放:

    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
    

相关问题