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刪除,,這樣當(dāng)在文本框txtFind中輸入時(shí),只要輸入的數(shù)據(jù)符合列表框包含的數(shù)據(jù),,列表框中將自動(dòng)出現(xiàn)相關(guān)條目并隨著輸入的進(jìn)一步具體條目相應(yīng)減少至完全匹配輸入的數(shù)據(jù),,如圖3、4,、5所示,。
圖3:初始化后的用戶窗體
圖4:開始輸入后,列表框中的條目隨著文本框中輸入的數(shù)據(jù)而變化
圖5:文本框中的數(shù)據(jù)越具體,,列表框中的條目也越少且與文本框輸入相匹配
在Excel 2000及以后的版本中,,VBA提供了一個(gè)Filter函數(shù),使用該函數(shù),,也能實(shí)現(xiàn)上述效果,并且代碼更簡(jiǎn)單,。代碼如下:
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搜索時(shí),一般我們會(huì)在輸入框中輸入想要搜索的文本,,此時(shí)下方會(huì)出現(xiàn)相關(guān)條目供選擇,,以方便快速輸入。下面,,我們?cè)贓xcel用戶窗體中使用文本框和列表框來仿造這樣的效果,。
有時(shí),當(dāng)用戶窗體中的列表框包含大量的項(xiàng)目時(shí),,我們必須拖動(dòng)其滾動(dòng)條來查找相應(yīng)的項(xiàng)目,。此時(shí),可以利用一些技巧快速找到所需的項(xiàng)目,。
如圖1所示,,在用戶窗體中,,放置有兩個(gè)控件,上方是一個(gè)名為txtFind的文本框,,下方是一個(gè)名為lbxData的列表框,,列表框的數(shù)據(jù)來自工作表Data的列A中的數(shù)據(jù)。
圖1:帶有文本框和列表框的用戶窗體,,列表框中的數(shù)據(jù)來自Data工作表中的A列
當(dāng)我在上方的文本框txtFind中輸入“excel vba”后,,下方的列表框lbxData中將會(huì)只出現(xiàn)包含有“excel vba”的條目,如圖2所示,。
圖2:在文本框中輸入文本后,列表框中只出現(xiàn)包含該文本的條目
實(shí)現(xiàn)上述效果的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刪除,,這樣當(dāng)在文本框txtFind中輸入時(shí),,只要輸入的數(shù)據(jù)符合列表框包含的數(shù)據(jù),列表框中將自動(dòng)出現(xiàn)相關(guān)條目并隨著輸入的進(jìn)一步具體條目相應(yīng)減少至完全匹配輸入的數(shù)據(jù),,如圖3,、4、5所示,。
圖3:初始化后的用戶窗體
圖4:開始輸入后,,列表框中的條目隨著文本框中輸入的數(shù)據(jù)而變化
圖5:文本框中的數(shù)據(jù)越具體,列表框中的條目也越少且與文本框輸入相匹配
在Excel 2000及以后的版本中,,VBA提供了一個(gè)Filter函數(shù),,使用該函數(shù),也能實(shí)現(xiàn)上述效果,,并且代碼更簡(jiǎn)單,。代碼如下:
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
示例文檔下載: