通常,我们可以在选择要复制的文本后,按Ctrl+C组合键来复制文本。下面通过两个简单的示例介绍如何使用VBA代码复制用户窗体文本框中的文本数据。
示例一:如下图1所示,在示例窗体中有一个文本框和一个命令按钮。当窗体被激活时,文本框中自动显示文字“完美Excel”,单击“复制文本”按钮后,将文本框中的数据复制到剪贴板。
图1:带有文本框和命令按钮的用户窗体
首先,按图1设计好用户窗体界面。然后,在该用户窗体模块中,输入下列代码:
示例一:如下图1所示,在示例窗体中有一个文本框和一个命令按钮。当窗体被激活时,文本框中自动显示文字“完美Excel”,单击“复制文本”按钮后,将文本框中的数据复制到剪贴板。
图1:带有文本框和命令按钮的用户窗体
首先,按图1设计好用户窗体界面。然后,在该用户窗体模块中,输入下列代码:
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
示例二:在用户窗体中有多个文本框,要求单击按钮后将含有数据的文本框中的数据全部复制到剪贴板。用户窗体如下图2所示,含有6个文本框。
图2:带有多个文本框的用户窗体
首先,按图2设计好用户窗体界面。然后,在用户窗体模块中,输入下列代码:
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帮助)。
本文虽然题为复制文框框中的数据,但DataObject对象也可应用到其他的用户窗体控件中。
- DataObject 对象
DataObject对象能够像“剪贴板”一样保存一段文本格式的文本,并能为每种附加的文本格式(例如用户定义的格式)保存一段文本。
DataObject对象的工作方式与“剪贴板”很相像。如果将一串文本复制到DataObject对象,DataObject 对象将保存该文本。如果将相同格式的第二段文本复制到该DataObject对象,则DataObject对象将清除前一文本,并保存第二段的文本。对于每种指定的格式,它保存一段从最近一次操作得到的文本。
但DataObject对象又与“剪贴板”不同,DataObject支持与“剪贴板”及文本的拖放操作有关的命令。在开始进行与“剪贴板”有关的操作(如GetText)或拖放操作时,与该操作有关的数据会被移到DataObject对象中。
DataObject对象具有下列方法:- SetText方法:使用特定的格式复制文本串到DataObject对象中。
- GetText方法:使用特定的格式在DataObject对象中检索文本串。
- GetFormat方法:返回的值表示DataObject对象中是否有指定的格式。
- StartDrag方法:初始化针对DataObject的拖放操作。
- GetFromClipboard:从剪贴板复制数据到DataObject对象。
- PutInClipboard:将数据从DataObject对象移到剪贴板上。
- Clear方法:删除DataObject对象中的所有对象。
本示例使用GetFormat方法、GetText方法和SetText方法在DataObject对象和剪贴板之间传输文本。
示例窗体如下图3所示,带有一个文本框TextBox1,四个命令按钮CommandButton1、CommandButton2、CommandButton3和CommandButton,以及一个标签Label1。用户把文本键入文本框然后单击命令按钮CommandButton1,把文本以标准文本格式传输到DataObject对象。单击命令按钮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对象到另一个文本框的数据移动。GetFromClipboard方法把数据从剪贴板传输到DataObject对象。该示例还使用了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 = "移动数据到剪贴板,然后到DataObject,接着到另一文本框!" End Sub
本示例使用DataObject对象来包含拖动文本,演示从一个列表框到另一个列表框的拖放操作。在MouseMove事件中使用SetText方法和StartDrag方法来完成拖放操作。
示例窗体如下图5所示,带有两个列表框。
图5:从一个列表框中拖动数据并放置到另一个列表框中
窗体模块代码如下:
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对象和“剪贴板”都提供了将数据从一处移到另一处的方法。作为应用程序开发人员,无论是使用DataObject对象还是使用“剪贴板”,都要记住下列几项要点:
- 只要各项数据具有不同的数据格式,DataObject对象和“剪贴板”就都可以同时保存多项数据。但是如果已经有数据使用了要保存数据的格式,则保存这个新数据,并丢弃原来的数据。
- “剪贴板”支持图片格式和文本格式。而DataObject对象目前只支持文本格式。
- 只有应用程序运行时,DataObject对象才存在;而“剪贴板”则是始终运行的(与正在运行的操作系统同时存在)。这意味着,将数据放到“剪贴板”后,如果关闭了应用程序,“剪贴板”上的数据不会丢失。DataObject对象则没有这个功能。如果关闭应用程序,该应用程序放置在DataObject对象上的数据就会丢失。
- DataObject对象是一个标准的OLE对象,而“剪贴板”不是。这意味着,“剪贴板”支持标准的移动操作(复制、剪切和粘贴),但不支持拖放操作。如果需要应用程序支持拖放操作,就必须使用DataObject对象。
提示 当用SetText方法将数据移动到“剪贴板”或DataObject对象时,可定义自己的数据格式名称。这样便于区分是应用程序移动的文本还是用户移动的文本。
示例文档下载: