通过在项目中的任何位置匹配字符串来过滤VBA组合框

时间:2014-10-09 14:51:39

标签: excel vba excel-vba combobox

在我的Excel工作表中,我有一个包含许多值的组合框。目前,您只需键入字符串的前几个字母即可跳转到组合框中的项目。例如。假设我的组合框中有这些项目。

  • John Smith
  • Ted James
  • 菲利普价格
  • Tom Hardy
  • James Dean
  • Chris Keaking

因此,如果我开始输入Te,则会过滤到Ted James

但是说我只知道姓氏并输入Dean,没有任何内容可以匹配,因为它只搜索字符串的开头,而不是在字符串的内部。同样,如果我输入Jam,它会过滤到James Dean但不过滤Ted James

有没有办法用VBA复制行为,例如Select2 plugin,它会搜索字符串中的任何位置并相应地过滤?

2 个答案:

答案 0 :(得分:2)

尝试此解决方案 - 在您键入时,下拉列表会显示和更新,以仅显示与键入框中键入的内容部分匹配的选项。这可能需要一些额外的工作,因为当您选择了有效的选项时,列表仍然仅针对该项目进行过滤,直到您清除组合框,但它可能会为您提供所需的内容。

使用以下代码

创建名为mdlComboBox的模块
Public colChoices As Collection

Public Sub InitCombobox1()
    Set colChoices = New Collection
    With colChoices
        .Add "John Smith"
        .Add "Ted James"
        .Add "Phillip Price"
        .Add "Tom Hardy"
        .Add "James Dean"
        .Add "Chris Keaking"
    End With
    FilterComboBox1 ""
End Sub

Public Sub FilterComboBox1(strFilter As String)
    Sheet1.ComboBox1.Clear
    For Each strChoice In colChoices
        If InStr(1, strChoice, strFilter) <> 0 Then
            Sheet1.ComboBox1.AddItem strChoice
        End If    
    Next
End Sub

ThisWorkbook模块中,添加以下内容以确保在工作簿打开时填充ComboBox:

Public Sub Workbook_Open()
    InitCombobox1
End Sub

最后,将一个ComboBox(名为ComboBox1)添加到Sheet1,并将以下代码添加到Sheet1模块中:

Private Sub ComboBox1_Change()
    FilterComboBox1 ComboBox1.Value
    ActiveSheet.Select
    ComboBox1.DropDown
End Sub

Activesheet.Select强制组合框从头开始重绘下拉列表,仅显示由该函数过滤的选项。在此解决方案中,您必须跟踪我在Collection全局变量中所做的总选择集,但是在某些情况下它可能会丢失其值,因此最好是硬编码或从工作表中提取代替。

答案 1 :(得分:0)

我尝试了完全相同的代码并遇到了很多崩溃 我做了一些小改动,它对我来说很好。
我的第一个问题是从一开始就把一些东西放在组合框上 我更喜欢初始化ComboBox并使用Sheet1代码中应用的worksheet_activate()填充它。

Private Sub worksheet_activate()

InitCombobox1

With ComboBox1
        .AddItem "John Smith"
        .AddItem "Ted James"
        .AddItem "Phillip Price"
        .AddItem "Tom Hardy"
        .AddItem "James Dean"
        .AddItem "Chris Keaking"
End With

End Sub

我不知道你们,但是当我选择(或输入)符合列表的任何内容时,之前的答案代码都不接受。

为了解决这个问题,我做了一个IF检查我入口的INDEX。 如果所选项目已在列表中,请不要清除下拉列表。

Public Sub FilterComboBox1(strFilter As String)

    If Sheet1.ComboBox1.ListIndex > -1 Then

    Else
        Sheet1.ComboBox1.Clear
        For Each strchoice In colChoices
            If InStr(1, strchoice, strFilter) <> 0 Then
                Sheet1.ComboBox1.AddItem strchoice
            End If
        Next
    End If

End Sub

但还有待解决的问题。我正在使用自动填充功能,当Excel尝试猜测我要查找的项目时,这会避免搜索。 现在,我按DEL解决了它。这使它转回搜索。