存档在 ‘列表框’ 分类中.

复制文本框中的数据

有时,我们需要从用户窗体的文本框中复制数据,然后将其粘贴到其它地方。下面举例说明具体的操作方法。
示例一:如下图1所示,在示例窗体中有一个文本框和一个命令按钮。当窗体被激活时,文本框中自动显示文字“完美Excel”,单击“复制”按钮后,将文本框中的数据复制到剪贴板。

test11

test11

图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
    .PutInClipboard
  End With
End Sub

示例二:在用户窗体中有多个文本框,要求单击按钮后将有数据的文本框中的数据全部复制到剪贴板。

test21

test21

图2:带有6个文本框和1个命令按钮的用户窗体
首先,按图2设计好用户窗体界面。然后,在用户窗体模块中,输入下列代码:
Dim strUnion As String

Private Sub CommandButton1_Click()
    Dim dObj As DataObject
    With Me
        If Not .TextBox1 = Empty Then strUnion = strUnion & .TextBox1
        If Not .TextBox2 = Empty Then strUnion = strUnion & vbCrLf & .TextBox2
        If Not .TextBox3 = Empty Then strUnion = strUnion & vbCrLf & .TextBox3
        If Not .TextBox4 = Empty Then strUnion = strUnion & vbCrLf & .TextBox4
        If Not .TextBox5 = Empty Then strUnion = strUnion & vbCrLf & .TextBox5
        If Not .TextBox6 = Empty Then strUnion = strUnion & vbCrLf & .TextBox6
    End With
    
    Set dObj = New DataObject
    
    dObj.SetText strUnion, 1
    dObj.PutInClipboard
End Sub

在一个列表框中显示另一列表框中的具体内容

有时,需要选中某列表框的的项目后,在另一列表框中显示该项目的具体内容,如下图1所示。
listboxselect1
图1:两个列表框实现内容匹配
“专业工程”包括“建筑工程、装饰装修工程……”等,当选中项目列表框中的专业工程后,在分类列表框中显示相应的内容。同理,选择项目列表框中的措施项目后,在分类列表框中也会显示相应的内容。
第一步:准备数据
如下图2所示,在工作表Sheet1中输入下列数据。
listboxselect2
图2:基础数据
将A列的数据命名为“项目”,将B列的数据命名为“专业工程”,将C列的数据命名为“措施项目”。注意,B列和C列的名称应与A列的数据相一致。
第二步:准备窗体界面
如图1所示,在用户窗体中放置两个标签控件、两个列表框控件,并将两个列表框控件分别命名为lbxItem和lbxCategory。
第三步:输入代码
在用户窗体代码模块中,输入下列代码:
Private Sub lbxItem_Change()
    Dim rngCategory As Range
    
    Set rngCategory = Sheet1.Range(Me.lbxItem.Value)
    
    Me.lbxCategory.List = rngCategory.Value
End Sub
Private Sub UserForm_Initialize()
    Dim rngItem As Range
    
    Set rngItem = Sheet1.Range(”项目”)
    
    Me.lbxItem.List = rngItem.Value
End Sub
运行后的最终效果如图1所示。当然,您可以在A列添加更多的项目数据,然后在C列、D列……添加相应的内容并以A列的数据命名,从而扩展本实例

仿Google输入框——快速查找列表框中的项目

在使用Google搜索时,当在输入框中输入时,下方会出现相关条目供选择,以方便快速输入。下面,我们在Excel用户窗体中使用文本框和列表框来仿造这样的效果。
有时,当用户窗体中的列表框包含大量的项目时,我们必须拖动其滚动条来查找相应的项目。然而,可以利用一些技巧快速找到所需的项目。
如图1所示,在用户窗体中,放置有两个控件,上方为一名为txtFind的文本框,下方为一名为lbxData的列表框,列表框的数据来自工作表Data的列A中的数据。
ListBoxFilter1
图1
当我在上方的文本框txtFind中输入“excel vba”后,下方的列表框lbxData将只出现包含有“excel vba”的条目,如图2所示。
ListBoxFilter2
图2
实现上述效果的VBA代码如下:
Option Explicit
Dim varDataPrivate Sub txtFind_Change()
    Dim i As Long
    Dim strFind As String
    
    strFind = “*” & UCase(Me.txtFind.Text) & “*”
    
    With Me.lbxData
        .List = varData
        For i = .ListCount - 1 To 0 Step -1
            If Not UCase(.List(i)) Like strFind Then
                .RemoveItem i
            End If
        Next i
    End With
End Sub

Private Sub UserForm_Initialize()
    Dim lLast As Long
    Dim rng As Range
    
    lLast = Sheet1.Range(”A” & Cells.Rows.Count).End(xlUp).Row
    varData = Sheet1.Range(”A1:A” & lLast)
    
    Me.lbxData.List = varData
End Sub

 


我们可以将UserForm_Initialize代码块中的代码Me.lbxData.List = varData删除,这样当在文本框txtFind中输入时,只要输入的数据符合列表框包含的数据,列表框中将自动出现相关条目并随着输入的进一步具体条目相应减少至完全匹配输入的数据,如图3、4、5所示。
ListBoxFilter3
图3:初始化后的用户窗体
ListBoxFilter4
图4:开始输入后,列表框中的条目随着文本框中输入的数据而变化
ListBoxFilter5
图5:文本框中的数据越具体,列表框中的条目也越少且与文本框输入相匹配
此外,在Excel 2000及以后的版本中,VBA提供了一个Filter函数,使用该函数,也能实现上述效果。代码如下:
Option Explicit
Private Sub txtFind_Change()
    Dim varData As Variant
    
    varData = Range(”A1″, Cells(Rows.Count, 1).End(xlUp)).Value
    varData = Application.Transpose(varData)
    
    varData = Filter(SourceArray:=varData, _
                   Match:=txtFind.Value, _
                   Include:=True, _
                   Compare:=vbTextCompare)
    
    Me.lbxData.List = varDataEnd Sub

Private Sub UserForm_Initialize()

    Me.lbxData.List = Range(”A1″, Cells(Rows.Count, 1).End(xlUp)).Value
End Sub

 

 

示例文档下载:ListBoxFilter.rar