在我的Excel工作表中,我有一个包含许多值的组合框。目前,您只需键入字符串的前几个字母即可跳转到组合框中的项目。例如。假设我的组合框中有这些项目。
因此,如果我开始输入Te
,则会过滤到Ted James
。
但是说我只知道姓氏并输入Dean
,没有任何内容可以匹配,因为它只搜索字符串的开头,而不是在字符串的内部。同样,如果我输入Jam
,它会过滤到James Dean
但不过滤Ted James
。
有没有办法用VBA复制行为,例如Select2 plugin,它会搜索字符串中的任何位置并相应地过滤?
答案 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解决了它。这使它转回搜索。