2017-09-15 83 views
0

我有一个文本框和一个列表框,用户的形式。我希望用户能够在文本框中输入文本,并根据他们的输入具有列表框筛选结果。过滤器仅匹配列表框在Excel中的结果,从文本框的文本

到目前为止,我已经设法列表框来突出显示列表中匹配的结果,而不是过滤掉不匹配的结果。我也遇到了我的代码没有标识多个匹配记录的问题,不知道我需要添加什么才能实现这一点。

Private Sub TextBox3_Change() 
     'searches ListBox3 for match and hightlights result. Need to filter results. 
    Dim i As Long 
    Dim sFind As String 

    sFind = Me.TextBox3.Text 

    If Len(sFind) = 0 Then 
     Me.ListBox3.ListIndex = -1 
     Me.ListBox3.TopIndex = 0 
    Else 
     For i = 0 To Me.ListBox3.ListCount - 1 
      If UCase(Left(Me.ListBox3.List(i), Len(sFind))) = UCase(sFind) Then 
       Me.ListBox3.TopIndex = i 
       Me.ListBox3.ListIndex = i 
       Exit For 
      End If 
     Next i 
    End If 
End Sub 
+0

无论你的问题和你的代码表示你是否允许你的列表框或者多个选择来清除先前的选择。我也想知道为什么要在文本框输入的选择,而不是让用户通过点击在列表框中选择他们。 – Variatus

+0

因此我的问题是,如何在结果中允许多重选择?我希望列表框可以作为它所连接的行源的一种搜索工具。因此,当用户键入到文本框中,只匹配在列表中出现 – user3795654

+0

为了使ListBox中的'MultiSelect'属性必须设置为'frmMultiSelectMulti'或'frmMultiSelectExtended'多重选择的结果。但是,我不明白你的工作流程。你是否在文本框中多次输入单词,并将每个单词添加到列表框中的选择中?如果是这样,为什么不使用链接到相同RowSource而不是TextBox的组合框?你打算如何取消选择列表框中的一个项目或全部? – Variatus

回答

1

尝试使用此代码,当您退出textbox3这样的作品,否则会令一些过滤打字时,可以把错误。

如果匹配精确

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
For i = ListBox1.ListCount - 1 To 0 Step -1 
    If Not ListBox1.List(i) = TextBox3 Then ListBox1.RemoveItem (i) 
Next i 
End Sub 

,环路与递归循环做,否则会出现错误出现。

部分匹配

Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) 
For i = ListBox1.ListCount - 1 To 0 Step -1 
    If InStr(1, ListBox1.List(i), TextBox3) = 0 Then ListBox1.RemoveItem (i) 
Next i 
End Sub 

Found a better code to filter a listbox.

相关问题