首页 > 代码库 > VBA之MSForms.DataObject对象
VBA之MSForms.DataObject对象
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
VBA之MSForms.DataObject对象
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。