自定义拖拽表单布局(列表框内数据拖放的类模块代码的实现过程)
【分享成果,随喜正能量】适量者,适可而止,量力而为。 凡事量力而为,过则为灾,有一日的快乐就快乐一整日,有一分力量做一分事。。
《VBA高级应用30例》,是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家在实际工作中分发VBA程序,写好的程序可以升级。本套教程共三册三十个专题,今日内容是第2个专题“在列表框内及列表框间实现数据拖放”,今日讲解:列表框内数据拖放的类模块代码的实现过程
应用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)下面代码对列表框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)对于第二个列表框属性的读写设置,代码如下:
'属性设置,对象的属性,读
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)对于是否可以进行读写操作属性的设置,大家要注意在设置属性读写时候,对于对象要用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)在列表框上按下左键移动鼠标时,要捕获鼠标的位置mXStart和mYStart,同时会发生一个方法,这个方法是HandleMouseMove,这个方法中需要的参数有:moListBox2, Button, Shift, X, Y,分别来自鼠标的移动及鼠标按下的事件。这个方法中实现了把选项复制到剪切板,及对选项的识别及操作。
[待续]
我20多年的VBA实践经验,全部浓缩在下面的各个教程中:
【分享成果,随喜正能量】我所理解的生活就是做着自己喜欢的事情,养活自己,养活家人。生活不是攀爬高山,也不是深潜海沟,它只是在一张标配的床上睡出你的身形。我所理解的生活就是和自己喜欢的一切在一起。。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com