自定义拖拽表单布局(列表框内数据拖放的类模块代码的实现过程)

分享成果,随喜正能量】适量者,适可而止,量力而为。 凡事量力而为,过则为灾,有一日的快乐就快乐一整日,有一分力量做一分事。。

《VBA高级应用30例》,是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家在实际工作中分发VBA程序,写好的程序可以升级。本套教程共三册三十个专题,今日内容是第2个专题“在列表框内及列表框间实现数据拖放”,今日讲解:列表框内数据拖放的类模块代码的实现过程

自定义拖拽表单布局(列表框内数据拖放的类模块代码的实现过程)(1)

应用2 在列表框内及列表框间实现数据拖放

利用VBA编程时候,我们往往会利用列表框进行选择处理,最为方便的操作是拖放数据,但是在VBA中实现拖放,是比较困难的任务。为了便于在UserForm上的两个列表框之间完成拖放操作,我专门利用这个专题给大家讲解一个利用类模块的方案,在需要的时候,只需将其插入到VBA项目中即可。这样做之后,可以大大方便我们自己的工作。

2 类模块代码的实现过程

在类模块中我们要完成各种类对象的属性设置及读取,事件的响应等等。我给大家一一讲解:

1)各种变量的设置,在下面的各个代码中,进行各个参数的设置,有鼠标拖放确定的项及列表框的变量,左键的设置,以及事件响应的列表框对象,是否允许控件拖动的变量及鼠标定位的设置:

'用于在鼠标拖放时确定的项

Private mlListItemCount As Long

Private mdListItemSize As Double

'我们从中拖动项目的列表框

Private mobjFromList As MSForms.ListBox

'左键设置

Private Const lLEFTMOUSEBUTTON As Long = 1

Private WithEvents moListBox1 As MSForms.ListBox

Private WithEvents moListBox2 As MSForms.ListBox

'这两项决定是否允许在控件内拖动:

Private mbDragWithin1 As Boolean

Private mbDragWithin2 As Boolean

Private mXStart As Single

Private mYStart As Single

代码的截图:

自定义拖拽表单布局(列表框内数据拖放的类模块代码的实现过程)(2)

2)下面代码对列表框ListBox1的属性进行读写设置,在属性写的设置过程中,我们模拟用了40个项目填充列表框,然后删除,这个过程中我们会获得参数 mdListItemSize参数的初始值,也提供给大家一个捕获鼠标位置的可选方案,代码如下:

'属性设置,对象的属性,读

Public Property Get ListBox1() As MSForms.ListBox

Set ListBox1 = moListBox1

End Property

'属性设置,对象的属性,写

Public Property Set ListBox1(ByVal oNewValue As MSForms.ListBox)

Dim lCt As Long

Set moListBox1 = oNewValue

'mdListItemSize = 1

'note:下面的代码用于临时用40个项目填充列表框。

'当我们放下鼠标时,这可以用来确定列表中的哪个项目在鼠标指针下

With moListBox1

For lCt = 1 To 40

.AddItem lCt

Next

.TopIndex = .ListCount - 1

mlListItemCount = .ListCount - .TopIndex

mdListItemSize = .Height / mlListItemCount

For lCt = 1 To 40

.RemoveItem .ListCount - 1

Next

End With

End Property

代码的部分截图:

自定义拖拽表单布局(列表框内数据拖放的类模块代码的实现过程)(3)

3)对于第二个列表框属性的读写设置,代码如下:

'属性设置,对象的属性,读

Public Property Get ListBox2() As MSForms.ListBox

Set ListBox2 = moListBox2

End Property

'属性设置,对象的属性,写

Public Property Set ListBox2(ByVal oNewValue As MSForms.ListBox)

Set moListBox2 = oNewValue

End Property

代码截图:

自定义拖拽表单布局(列表框内数据拖放的类模块代码的实现过程)(4)

4)对于是否可以进行读写操作属性的设置,大家要注意在设置属性读写时候,对于对象要用set,对于一般的属性是不需要set的,关于详细的讲解大家要参考我的专门教程(我的第五套教程:《VBA中类的解读及应用》)

'属性设置,读

Public Property Get DragWithin1() As Boolean

DragWithin1 = mbDragWithin1

End Property

'属性设置,写

Public Property Let DragWithin1(ByVal bNewValue As Boolean)

mbDragWithin1 = bNewValue

End Property

'属性设置,读

Public Property Get DragWithin2() As Boolean

DragWithin2 = mbDragWithin2

End Property

'属性设置,写

Public Property Let DragWithin2(ByVal bNewValue As Boolean)

mbDragWithin2 = bNewValue

End Property

代码截图:

自定义拖拽表单布局(列表框内数据拖放的类模块代码的实现过程)(5)

5)在列表框上按下左键移动鼠标时,要捕获鼠标的位置mXStart和mYStart,同时会发生一个方法,这个方法是HandleMouseMove,这个方法中需要的参数有:moListBox2, Button, Shift, X, Y,分别来自鼠标的移动及鼠标按下的事件。这个方法中实现了把选项复制到剪切板,及对选项的识别及操作。

[待续]

自定义拖拽表单布局(列表框内数据拖放的类模块代码的实现过程)(6)

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

自定义拖拽表单布局(列表框内数据拖放的类模块代码的实现过程)(7)

自定义拖拽表单布局(列表框内数据拖放的类模块代码的实现过程)(8)

自定义拖拽表单布局(列表框内数据拖放的类模块代码的实现过程)(9)

分享成果,随喜正能量】我所理解的生活就是做着自己喜欢的事情,养活自己,养活家人。生活不是攀爬高山,也不是深潜海沟,它只是在一张标配的床上睡出你的身形。我所理解的生活就是和自己喜欢的一切在一起。。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页