tft每日頭條

 > 科技

 > 自定義拖拽表單布局

自定義拖拽表單布局

科技 更新时间:2024-07-23 13:05:37

分享成果,随喜正能量】适量者,适可而止,量力而為。 凡事量力而為,過則為災,有一日的快樂就快樂一整日,有一分力量做一分事。。

《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

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

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved