虫虫技术在线--技术决定出路

当前位置: 首页 > 办公 > Excel >

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

时间:2010-06-06 11:09来源:虫虫技术在线收集整理 作者:虫虫编辑 点击:
在使用Google搜索时,一般我们会在输入框中输入想要搜索的文本,此时下方会出现相关条目供选择,以方便快速输入。下面,我们在Excel用户窗体中使用文本框和列表框来仿造这样的效

在使用Google搜索时,一般我们会在输入框中输入想要搜索的文本,此时下方会出现相关条目供选择,以方便快速输入。下面,我们在Excel用户窗体中使用文本框和列表框来仿造这样的效果。
有时,当用户窗体中的列表框包含大量的项目时,我们必须拖动其滚动条来查找相应的项目。此时,可以利用一些技巧快速找到所需的项目。
如图1所示,在用户窗体中,放置有两个控件,上方是一个名为txtFind的文本框,下方是一个名为lbxData的列表框,列表框的数据来自工作表Data的列A中的数据。
ListBoxFilter1
图1:带有文本框和列表框的用户窗体,列表框中的数据来自Data工作表中的A列
当我在上方的文本框txtFind中输入“excel vba”后,下方的列表框lbxData中将会只出现包含有“excel vba”的条目,如图2所示。
ListBoxFilter2
图2:在文本框中输入文本后,列表框中只出现包含该文本的条目
实现上述效果的VBA代码如下:

Option Explicit
Dim varData
 
Private 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 = varData
 
End Sub
 
Private Sub UserForm_Initialize()
 
    Me.lbxData.List = Range("A1", Cells(Rows.Count, 1).End(xlUp)).Value
End Sub

如果需要将列表框中所选择的条目放到文本框中,那么添加下面的代码:

Private Sub lbxData_Click()
    Me.txtFind.Value = Me.lbxData.Value
End Sub

示例文档下载:
在使用Google搜索时,一般我们会在输入框中输入想要搜索的文本,此时下方会出现相关条目供选择,以方便快速输入。下面,我们在Excel用户窗体中使用文本框和列表框来仿造这样的效果。
有时,当用户窗体中的列表框包含大量的项目时,我们必须拖动其滚动条来查找相应的项目。此时,可以利用一些技巧快速找到所需的项目。
如图1所示,在用户窗体中,放置有两个控件,上方是一个名为txtFind的文本框,下方是一个名为lbxData的列表框,列表框的数据来自工作表Data的列A中的数据。
ListBoxFilter1
图1:带有文本框和列表框的用户窗体,列表框中的数据来自Data工作表中的A列
当我在上方的文本框txtFind中输入“excel vba”后,下方的列表框lbxData中将会只出现包含有“excel vba”的条目,如图2所示。
ListBoxFilter2
图2:在文本框中输入文本后,列表框中只出现包含该文本的条目
实现上述效果的VBA代码如下:

Option Explicit
Dim varData
 
Private 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 = varData
 
End Sub
 
Private Sub UserForm_Initialize()
 
    Me.lbxData.List = Range("A1", Cells(Rows.Count, 1).End(xlUp)).Value
End Sub

如果需要将列表框中所选择的条目放到文本框中,那么添加下面的代码:

Private Sub lbxData_Click()
    Me.txtFind.Value = Me.lbxData.Value
End Sub

示例文档下载:

实例

(责任编辑:admin)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
推荐内容