Option ExplicitDim varData Private Sub txtFind_Change()Dim i As LongDim strFind As String strFind = "*" & UCase(Me.txtFind.Text) & "*" With Me.lbxData.List = varDataFor i = .ListCount - 1 To 0 Step -1If Not UCase(.List(i)) Like strFind Then.RemoveItem iEnd IfNext iEnd WithEnd Sub Private Sub UserForm_Initialize()Dim lLast As LongDim rng As Range lLast = Sheet1.Range("A" & Cells.Rows.Count).End(xlUp).RowvarData = Sheet1.Range("A1:A" & lLast) Me.lbxData.List = varDataEnd Sub
我們可以將UserForm_Initialize代碼塊中的代碼Me.lbxData.List = varData刪除,這樣當(dāng)在文本框txtFind中輸入時,只要輸入的數(shù)據(jù)符合列表框包含的數(shù)據(jù),列表框中將自動出現(xiàn)相關(guān)條目并隨著輸入的進一步具體條目相應(yīng)減少至完全匹配輸入的數(shù)據(jù),如圖3、4、5所示。
圖3:初始化后的用戶窗體
圖4:開始輸入后,列表框中的條目隨著文本框中輸入的數(shù)據(jù)而變化
圖5:文本框中的數(shù)據(jù)越具體,列表框中的條目也越少且與文本框輸入相匹配
在Excel 2000及以后的版本中,VBA提供了一個Filter函數(shù),使用該函數(shù),也能實現(xiàn)上述效果,并且代碼更簡單。代碼如下:
Option ExplicitPrivate Sub txtFind_Change()Dim varData As Variant varData = Range("A1", Cells(Rows.Count, 1).End(xlUp)).ValuevarData = 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)).ValueEnd Sub
如果需要將列表框中所選擇的條目放到文本框中,那么添加下面的代碼:
Private Sub lbxData_Click()Me.txtFind.Value = Me.lbxData.ValueEnd Sub
示例文檔下載:
在使用Google搜索時,一般我們會在輸入框中輸入想要搜索的文本,此時下方會出現(xiàn)相關(guān)條目供選擇,以方便快速輸入。下面,我們在Excel用戶窗體中使用文本框和列表框來仿造這樣的效果。
有時,當(dāng)用戶窗體中的列表框包含大量的項目時,我們必須拖動其滾動條來查找相應(yīng)的項目。此時,可以利用一些技巧快速找到所需的項目。
如圖1所示,在用戶窗體中,放置有兩個控件,上方是一個名為txtFind的文本框,下方是一個名為lbxData的列表框,列表框的數(shù)據(jù)來自工作表Data的列A中的數(shù)據(jù)。
圖1:帶有文本框和列表框的用戶窗體,列表框中的數(shù)據(jù)來自Data工作表中的A列
當(dāng)我在上方的文本框txtFind中輸入“excel vba”后,下方的列表框lbxData中將會只出現(xiàn)包含有“excel vba”的條目,如圖2所示。
圖2:在文本框中輸入文本后,列表框中只出現(xiàn)包含該文本的條目
實現(xiàn)上述效果的VBA代碼如下:
Option ExplicitDim varData Private Sub txtFind_Change()Dim i As LongDim strFind As String strFind = "*" & UCase(Me.txtFind.Text) & "*" With Me.lbxData.List = varDataFor i = .ListCount - 1 To 0 Step -1If Not UCase(.List(i)) Like strFind Then.RemoveItem iEnd IfNext iEnd WithEnd Sub Private Sub UserForm_Initialize()Dim lLast As LongDim rng As Range lLast = Sheet1.Range("A" & Cells.Rows.Count).End(xlUp).RowvarData = Sheet1.Range("A1:A" & lLast) Me.lbxData.List = varDataEnd Sub
我們可以將UserForm_Initialize代碼塊中的代碼Me.lbxData.List = varData刪除,這樣當(dāng)在文本框txtFind中輸入時,只要輸入的數(shù)據(jù)符合列表框包含的數(shù)據(jù),列表框中將自動出現(xiàn)相關(guān)條目并隨著輸入的進一步具體條目相應(yīng)減少至完全匹配輸入的數(shù)據(jù),如圖3、4、5所示。
圖3:初始化后的用戶窗體
圖4:開始輸入后,列表框中的條目隨著文本框中輸入的數(shù)據(jù)而變化
圖5:文本框中的數(shù)據(jù)越具體,列表框中的條目也越少且與文本框輸入相匹配
在Excel 2000及以后的版本中,VBA提供了一個Filter函數(shù),使用該函數(shù),也能實現(xiàn)上述效果,并且代碼更簡單。代碼如下:
Option ExplicitPrivate Sub txtFind_Change()Dim varData As Variant varData = Range("A1", Cells(Rows.Count, 1).End(xlUp)).ValuevarData = 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)).ValueEnd Sub
如果需要將列表框中所選擇的條目放到文本框中,那么添加下面的代碼:
Private Sub lbxData_Click()Me.txtFind.Value = Me.lbxData.ValueEnd Sub
示例文檔下載: