Public Sub COM_MSForms_Class_DataObject_Test() ''MSForms.DataObject對象,可以用來溝通VBA工程內各模塊數據,其上可以存儲各種格式的文本,格式名必須是 '' 整數或字符串: ''1.DataObject.GetText([format])從DataObject對象中,取得儲存的某格式文本,如省略format參數,將取得 '' 格式為1的文本,也即對象的默認儲存格式的文本;format參數也可以是1之外的整數,或者是任意字符串, '' 字符串不區分大小寫 ''2.DataObject.SetText(Text,[format])將文本以一定格式儲存到DataObject對象上,如果省略format參數,將 '' 把文本儲存為格式為1的默認文本;format參數也可以是1之外的整數,或者是任意字符串,字符串不區分大 '' 小寫 ''3.DataObject.GetFormat(format)用於檢索DataObject的格式列表,檢查對應的format格式是否存在 ''4.DataObject.GetFromClipboard()從系統剪切板取一次文本,並將它儲存為DataObject格式為1的文本,如果 '' 系統剪切板此時為空,那么調用DataObject.GetFromClipboard()方法,會把DataObject對象中格式為1的文 '' 本和格式都刪除 ''5.DataObject.PutInClipboard()將DataObject對象格式為1的文本放入系統剪切板,此后DataObject對象的格 '' 式為1的文本的存儲單元與系統剪切板共享,一者變,另一者跟着變,從功能設計角度,這可能是一個Bug, '' 與其相反功能的DataObject.GetFromClipboard()則不會將數據的存儲位置共享,所以如此說。 ''6.DataObject.Clear()將DataObject存儲的格式列表及文本數據全部清空,這個方法的調用並不能斷開因為調 '' 用DataObject.PutInClipboard()方法,該DataObject對象格式為1的文本存儲單元與系統剪切板之間建立的 '' 數據共享;要想完全斷開,唯有將該變量重新初始化為一個新的DataObject對象 ''7.DataObject.StartDrag([effect])開始基於MSForms界面程序的數據拖放,是此對象最復雜的一個方法,可以 '' 從任何一個MSForms控件的MouseMove事件中調用此方法,調用后它將阻塞MouseMove事件處理程序,你可以給 '' 任何你想要接受拖放數據的控件,添加BeforeDragOver和BeforeDropOrPaste兩個事件處理程序,在前者中設 '' 置Cancel=True,以方便后一個事件處理傳遞過來的事件參數Data(DataObject類型)中的數據(這個數據是 '' 前面MouseMove事件調用DataObject.StartDrag()方法之前手動在該DataObject對象上設置的,也即在此調用 '' 之前,你需要先用DataObject.SetText(Text,[format])來設置好要傳遞的文本,否則傳遞一個空DataObject '' 對象,也沒有意義不是?!? Dim Clip As New MSForms.DataObject, Clip1 As New MSForms.DataObject ''1.格式1是SetText()與GetText()方法的format參數的默認值,但沒有設置前,這個格式在DataObject對象的 '' 格式列表中是不存在的 Debug.Print 1, Clip.GetFormat(1) 'False ''2.DataObject對象所有方法的format參數,如果是字符串,那么此字符串是不區分大小寫的 Clip.SetText "Smith", "Name" Debug.Print 2, Clip.GetText("name") Debug.Print 2, Clip.GetText("NAME") ''3.SetText(Text,[format])方法,參數format默認植為1 Clip.SetText "hello world" Debug.Print 3, Clip.GetFormat(1) Clip.SetText "Oh, Yeah", 2 Debug.Print 3, Clip.GetFormat(2) ''4.GetText([format])方法,參數format默認植為1 Debug.Print 4, Clip.GetText 'hello world Debug.Print 4, Clip.GetText(2) 'Oh, Yeah ''5.SetText()與GetText()方法的format參數必須是整數或字符串 Clip.SetText "hao123", "website" Debug.Print 5, Clip.GetText("website") Clip.SetText "格式為32", 32 Debug.Print 5, Clip.GetText(32) ''5.1格式如果不是整數的數字,會執行CInt轉換,不過也有例外,所以建議不要用這種奇淫技巧 Clip.SetText "格式為3.2", 3.2 Debug.Print 5.1, Clip.GetText(3.2) Clip.SetText "格式為True的文本", True '格式為-1" 'Debug.Print Clip.GetText(-1) '報錯 Clip.SetText "格式為False的文本", False '格式為0 Debug.Print 5.1, Clip.GetText(False) ''6.DataObject對象所有方法的format參數,可以是字符串,但不可以是空字符串或者vbNullString ' Clip.SetText "hello", "" ' Clip.SetText "Good Good Study", vbNullString ''7.也可以通過DataObject.PutInClipboard()來將DataObject對象中的文本放入系統剪切板中 '' 注意:導入到系統剪切板的文本是DataObject對象中的格式為1的文本數據 Clip.PutInClipboard '粘貼發現是hello world ''8.可以通過DataObject.GetFromClipboard()來將系統剪切板中的文本導入這里的DataObject對象中格式為1的文本的字段中 Clip.SetText "12345" Clip.GetFromClipboard ''8.1下面的GetText()調用,本應將上次調用PutInClipboard()方法后,放入系統剪切板的“hello world”導入進來, '' 但導入進來的是新設置的"12345",所以PutInClipboard()方法會將DataObject對象與剪切板綁定,這肯定是個功能性bug '' 更具體試驗見下面的 Debug.Print 8.1, Clip.GetText '這里輸出的是“hello world” Clip.SetText "hello world" Debug.Print 8.1, Clip.GetText ''9.Clear()方法將清空所有的格式列表與文本數據 Clip.Clear Debug.Print 9, Clip.GetFormat(1) ''9.1Clear()方法被調用之前,如果DataObject對象與系統剪切板數據共享了,也將清除系統剪切板中的數據 ''================【粘貼試試】================ ''9.2如果剪切板文本為空,GetFromClipboard()方法會將DataObject對象的格式為1的文本刪除,該文本將無法訪問 Clip.GetFromClipboard ' Debug.Print 9.2 , Clip.GetText ''9.3上面的代碼,清除了DataObject中的數據,但由下面的試驗可知,仍然不能斷開上面建立的DataObject與系統剪切板之間 '' 的數據共享 Clip.SetText 12345 Debug.Print 9.3, Clip.GetText '如果被Clear()斷開了,這里就應該是“hello world”,因為“12345”還沒有被PutIn ''9.4要想斷開DataObject與系統剪切板之間的數據共享,最好方法是重新初始化該對象 Set Clip = New MSForms.DataObject Clip.SetText "hello world" Clip1.GetFromClipboard '注意:這里是Clip1 Debug.Print 9.4, Clip1.GetText '注意:這里是Clip1,如果沒斷開,應該輸出“hello world” ''9.5GetFromClipboard()方法不會將DataObject對象與系統剪切板的數據共享 Clip1.SetText "hello world" '注意:這里是Clip1 Clip.GetFromClipboard '注意:這里是Clip Debug.Print 9.5, Clip.GetText '注意:這里是Clip,如果建立共享,應該輸出“hello world” End Sub