【问题标题】:Filter a VBA combo box by matching string anywhere in an item通过匹配项目中任意位置的字符串来过滤 VBA 组合框
【发布时间】:2017-10-09 21:19:33
【问题描述】:

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

  • 约翰·史密斯
  • 特德·詹姆斯
  • 菲利普价格
  • 汤姆·哈迪
  • 詹姆斯·迪恩
  • 克里斯·基金

所以如果我开始输入Te,它会过滤到Ted James

但是假设我只知道姓氏并输入Dean,没有任何匹配项,因为它只从字符串的开头搜索,而不是在其中。同样,如果我输入Jam,它会过滤到James Dean,而不是Ted James

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

【问题讨论】:

  • 组合框是在用户窗体中还是直接在工作表上?我问的原因是,如果它在用户表单上,您可以访问更多事件。
  • 它直接在工作表上,但您仍然可以通过工作表模块访问事件
  • 我的错误,我将 Form 控件与 ActiveX 控件混淆了。

标签: vba excel combobox


【解决方案1】:

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

使用以下代码创建一个名为 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 模块中,添加以下内容以确保在打开工作簿时填充组合框:

Public Sub Workbook_Open()
    InitCombobox1
End Sub

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

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

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

【讨论】:

    【解决方案2】:

    我尝试了完全相同的代码,但出现了很多崩溃。
    我做了一些小改动,对我来说效果很好。
    我的第一个问题是从一开始就在组合框上放一些东西。
    我更喜欢初始化 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 解决了它。这使它返回搜索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      相关资源
      最近更新 更多