Dim myClipboard As New DataObject Private Sub UserForm_Activate()Me.TextBox1.Value = "完美Excel"End Sub Private Sub CommandButton1_Click()With myClipboard.SetText Me.TextBox1.Text.PutInClipboardEnd WithEnd Sub
示例二:在用戶窗體中有多個文本框,要求單擊按鈕后將含有數(shù)據(jù)的文本框中的數(shù)據(jù)全部復制到剪貼板。用戶窗體如下圖2所示,含有6個文本框。
圖2:帶有多個文本框的用戶窗體
首先,按圖2設(shè)計好用戶窗體界面。然后,在用戶窗體模塊中,輸入下列代碼:
Dim strUnion As String Private Sub CommandButton1_Click()Dim dObj As DataObjectWith MeIf Not .TextBox1 = Empty Then strUnion = strUnion & .TextBox1If Not .TextBox2 = Empty Then strUnion = strUnion & vbCrLf & .TextBox2If Not .TextBox3 = Empty Then strUnion = strUnion & vbCrLf & .TextBox3If Not .TextBox4 = Empty Then strUnion = strUnion & vbCrLf & .TextBox4If Not .TextBox5 = Empty Then strUnion = strUnion & vbCrLf & .TextBox5If Not .TextBox6 = Empty Then strUnion = strUnion & vbCrLf & .TextBox6End With Set dObj = New DataObject dObj.SetText strUnion, 1dObj.PutInClipboardEnd Sub
說明與擴展
下面對示例中涉及到的主要對象及其屬性、方法進行簡單的介紹和整理,并進行一些擴展(也可參考VBA幫助)。
本文雖然題為復制文框框中的數(shù)據(jù),但DataObject對象也可應(yīng)用到其他的用戶窗體控件中。
- DataObject 對象
DataObject對象能夠像“剪貼板”一樣保存一段文本格式的文本,并能為每種附加的文本格式(例如用戶定義的格式)保存一段文本。
DataObject對象的工作方式與“剪貼板”很相像。如果將一串文本復制到DataObject對象,DataObject 對象將保存該文本。如果將相同格式的第二段文本復制到該DataObject對象,則DataObject對象將清除前一文本,并保存第二段的文本。對于每種指定的格式,它保存一段從最近一次操作得到的文本。
但DataObject對象又與“剪貼板”不同,DataObject支持與“剪貼板”及文本的拖放操作有關(guān)的命令。在開始進行與“剪貼板”有關(guān)的操作(如GetText)或拖放操作時,與該操作有關(guān)的數(shù)據(jù)會被移到DataObject對象中。
DataObject對象具有下列方法:- SetText方法:使用特定的格式復制文本串到DataObject對象中。
- GetText方法:使用特定的格式在DataObject對象中檢索文本串。
- GetFormat方法:返回的值表示DataObject對象中是否有指定的格式。
- StartDrag方法:初始化針對DataObject的拖放操作。
- GetFromClipboard:從剪貼板復制數(shù)據(jù)到DataObject對象。
- PutInClipboard:將數(shù)據(jù)從DataObject對象移到剪貼板上。
- Clear方法:刪除DataObject對象中的所有對象。
本示例使用GetFormat方法、GetText方法和SetText方法在DataObject對象和剪貼板之間傳輸文本。
示例窗體如下圖3所示,帶有一個文本框TextBox1,四個命令按鈕CommandButton1、CommandButton2、CommandButton3和CommandButton,以及一個標簽Label1。用戶把文本鍵入文本框然后單擊命令按鈕CommandButton1,把文本以標準文本格式傳輸?shù)紻ataObject對象。單擊命令按鈕CommandButton2,在DataObject對象中檢索文本。單擊命令按鈕CommandButton3,用自定義格式把文本從文本框TextBox1復制到DataObject對象。單擊命令按鈕CommandButton4,用自定義格式在DataObject對象中檢索文本。

圖3:演示GetFormat、GetText、SetText方法的用戶窗體
窗體模塊中的代碼為:
Dim MyDataObject As DataObject Private Sub CommandButton1_Click() '把標準格式放到剪貼板上 If TextBox1.TextLength > 0 Then Set MyDataObject = New DataObject MyDataObject.SetText TextBox1.Text Label1.Caption = "放置到DataObject中" CommandButton2.Enabled = True CommandButton4.Enabled = False End If End Sub Private Sub CommandButton2_Click() '從剪切板得到標準格式 If MyDataObject.GetFormat(1) = True Then Label1.Caption = "標準格式 - " _ & MyDataObject.GetText(1) End If End Sub Private Sub CommandButton3_Click() '把自定義格式放到剪切板上 If TextBox1.TextLength > 0 Then Set MyDataObject = New DataObject MyDataObject.SetText TextBox1.Text, 233 Label1.Caption = "在DataObject中的自定義格式" CommandButton4.Enabled = True CommandButton2.Enabled = False End If End Sub Private Sub CommandButton4_Click() '從剪切板得到自定義格式 If MyDataObject.GetFormat(233) = True Then Label1.Caption = "自定義格式 - " _ & MyDataObject.GetText(233) End If End Sub Private Sub UserForm_Initialize() CommandButton2.Enabled = False CommandButton4.Enabled = False End Sub
本示例演示從文本框到剪貼板,從剪貼板到DataObject對象以及從DataObject對象到另一個文本框的數(shù)據(jù)移動。GetFromClipboard方法把數(shù)據(jù)從剪貼板傳輸?shù)紻ataObject對象。該示例還使用了Copy方法和GetText方法。
示例窗體如下圖4所示,帶有兩個文本框和一個命令按鈕。單擊命令按鈕,將把文本從一個文本框移至另一個文本框。

圖4:Copy、GetFromClipboard、GetText和DataObject對象示例窗體
窗體模塊中的代碼如下:
Dim MyData as DataObject Private Sub CommandButton1_Click() '在把文本復制到剪切板之前,需要選定一段文本 TextBox1.SelStart = 0 TextBox1.SelLength = TextBox1.TextLength TextBox1.Copy MyData.GetFromClipboard TextBox2.Text = MyData.GetText(1) End Sub Private Sub UserForm_Initialize() Set MyData = New DataObject TextBox1.Text = "移動數(shù)據(jù)到剪貼板,然后到DataObject,接著到另一文本框!" End Sub
本示例使用DataObject對象來包含拖動文本,演示從一個列表框到另一個列表框的拖放操作。在MouseMove事件中使用SetText方法和StartDrag方法來完成拖放操作。
示例窗體如下圖5所示,帶有兩個列表框。

圖5:從一個列表框中拖動數(shù)據(jù)并放置到另一個列表框中
窗體模塊代碼如下:
Private Sub ListBox2_BeforeDragOver(ByVal Cancel As _ MSForms.ReturnBoolean, ByVal Data As _ MSForms.DataObject, ByVal X As Single, _ ByVal Y As Single, ByVal DragState As Long, _ ByVal Effect As MSForms.ReturnEffect, _ ByVal Shift As Integer) Cancel = True Effect = 1 End Sub Private Sub ListBox2_BeforeDropOrPaste(ByVal _ Cancel As MSForms.ReturnBoolean, _ ByVal Action As Long, ByVal Data As _ MSForms.DataObject, ByVal X As Single, _ ByVal Y As Single, ByVal Effect As _ MSForms.ReturnEffect, ByVal Shift As Integer) Cancel = True Effect = 1 ListBox2.AddItem Data.GetText End Sub 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 Set MyDataObject = New DataObject Dim Effect As Integer MyDataObject.SetText ListBox1.Value Effect = MyDataObject.StartDrag End If End Sub Private Sub UserForm_Initialize() Dim i As Long For i = 1 To 10 ListBox1.AddItem "Choice " _ & (ListBox1.ListCount + 1) Next i End Sub
DataObject對象和“剪貼板”都提供了將數(shù)據(jù)從一處移到另一處的方法。作為應(yīng)用程序開發(fā)人員,無論是使用DataObject對象還是使用“剪貼板”,都要記住下列幾項要點:
- 只要各項數(shù)據(jù)具有不同的數(shù)據(jù)格式,DataObject對象和“剪貼板”就都可以同時保存多項數(shù)據(jù)。但是如果已經(jīng)有數(shù)據(jù)使用了要保存數(shù)據(jù)的格式,則保存這個新數(shù)據(jù),并丟棄原來的數(shù)據(jù)。
- “剪貼板”支持圖片格式和文本格式。而DataObject對象目前只支持文本格式。
- 只有應(yīng)用程序運行時,DataObject對象才存在;而“剪貼板”則是始終運行的(與正在運行的操作系統(tǒng)同時存在)。這意味著,將數(shù)據(jù)放到“剪貼板”后,如果關(guān)閉了應(yīng)用程序,“剪貼板”上的數(shù)據(jù)不會丟失。DataObject對象則沒有這個功能。如果關(guān)閉應(yīng)用程序,該應(yīng)用程序放置在DataObject對象上的數(shù)據(jù)就會丟失。
- DataObject對象是一個標準的OLE對象,而“剪貼板”不是。這意味著,“剪貼板”支持標準的移動操作(復制、剪切和粘貼),但不支持拖放操作。如果需要應(yīng)用程序支持拖放操作,就必須使用DataObject對象。
提示 當用SetText方法將數(shù)據(jù)移動到“剪貼板”或DataObject對象時,可定義自己的數(shù)據(jù)格式名稱。這樣便于區(qū)分是應(yīng)用程序移動的文本還是用戶移動的文本。
示例文檔下載: