仿Google输入框——快速查找列表框中的项目
在使用Google搜索时,当在输入框中输入时,下方会出现相关条目供选择,以方便快速输入。下面,我们在Excel用户窗体中使用文本框和列表框来仿造这样的效果。
有时,当用户窗体中的列表框包含大量的项目时,我们必须拖动其滚动条来查找相应的项目。然而,可以利用一些技巧快速找到所需的项目。
如图1所示,在用户窗体中,放置有两个控件,上方为一名为txtFind的文本框,下方为一名为lbxData的列表框,列表框的数据来自工作表Data的列A中的数据。

图1
当我在上方的文本框txtFind中输入“excel vba”后,下方的列表框lbxData将只出现包含有“excel vba”的条目,如图2所示。

图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所示。

图3:初始化后的用户窗体

图4:开始输入后,列表框中的条目随着文本框中输入的数据而变化

图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




