【分享成果,随喜正能量】适量者,适可而止,量力而為。 凡事量力而為,過則為災,有一日的快樂就快樂一整日,有一分力量做一分事。。
《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實踐經驗,全部濃縮在下面的各個教程中:
【分享成果,随喜正能量】我所理解的生活就是做着自己喜歡的事情,養活自己,養活家人。生活不是攀爬高山,也不是深潛海溝,它隻是在一張标配的床上睡出你的身形。我所理解的生活就是和自己喜歡的一切在一起。。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!