具有自动完成功能并在您键入时进行搜索的VBA组合框

时间:2018-10-02 20:53:19

标签: excel vba filter combobox autocomplete

我有以下代码,该代码创建了具有自动完成功能的用户表单,该表单是我从另一个网站复制的。我想对此进行修改以包括“键入时搜索”功能。例如:

组合框引用的表为1列,其中包含以下项:

chevy truck
ford truck
truck
chevy car
ford car
car

当前,当用户键入“卡车”时,唯一的结果和建议是“卡车”,并且不会显示“雪佛兰卡车”

当用户搜索“卡车”时,我希望下拉列表显示类似这样的内容

truck
chevy truck
ford truck

或者如果用户键入“ tr”,则列表将显示:

truck
chevy truck
ford truck

用户类型为“ che” ...列表显示:

chevy truck
chevy car

Private Sub OEM_Change()
Dim x, dict
Dim i As Long
Dim str As String
'x = this is where i need help.
Set dict = CreateObject("scripting.dictionary")
str = Me.OEM.Value
    If str <> "" Then
        For i = 1 To UBound(x, 1)
            If InStr(LCase(x(i, 1)), LCase(str)) > 0 Then
                dict.Item(x(i, 1)) = ""
            End If
        Next i
    Me.OEM.List = dict.keys
    Else
    Me.OEM.List = x
    End If
    Me.OEM.DropDown

End Sub

Private Sub UserForm_Initialize()

With Vertical
     .AddItem "vertical1"
     .AddItem "vertical2"
     .AddItem "vertical3"
     .AddItem "vertical4"
     .AddItem "vertical5"
End With

End Sub

Private Sub Vertical_Change()

Dim index As Integer
 index = Vertical.ListIndex

Select Case index
     Case Is = 0
         With OEM
             .RowSource = "Namedrange1"
         End With
     Case Is = 1
         With OEM
             .RowSource = "Namedrange2"
         End With
     Case Is = 2
         With OEM
            .RowSource = "Namedrange3"
         End With
    Case Is = 3
         With OEM
            .RowSource = "Namedrange4"
         End With
    Case Is = 4
         With OEM
            .RowSource = "Namedrange5"
         End With

End Select

End Sub

供参考:某些代码来自此线程

searchable combo box with a list of sugggestion on a userform

3 个答案:

答案 0 :(得分:0)

使用VBA代码输入下拉列表时自动完成

首先,您需要在工作表中插入一个组合框并更改其属性,然后运行VBA代码以启用自动完成功能。

  1. 进入工作表,该工作表包含您希望其自动完成的下拉列表。

  2. 在插入组合框之前,需要启用功能区中的“开发人员”选项卡。

1)。在Excel 2010和2013中,单击文件>选项。然后在“选项”对话框中,单击右窗格中的“自定义功能区”,选中“开发人员”框,然后单击“确定”按钮。查看屏幕截图:

2)。在Outlook 2007中,单击Office按钮> Excel选项。在“ Excel选项”对话框中,单击右栏中的“流行”,然后选中“功能区”框中的“显示开发人员”选项卡,最后单击“确定”按钮。

  1. 然后单击“ ActiveX控件”下的“开发人员”>“插入”>“组合框”。查看屏幕截图:

  2. 在当前打开的工作表中绘制组合框,然后右键单击它。在右键菜单中选择“属性”。

  3. 在“属性”对话框中,您需要:

1)。在“名称”字段中将名称更改为TempCombo;

2)。在“字体”字段中指定所需的字体;

3)。向下滚动以在MatchEntry字段中选择1-fmMatchEntryComplete;

4)。关闭“属性”对话框。

  1. 通过单击“开发人员”>“设计模式”来关闭设计模式。

  2. 右键单击当前打开的工作表选项卡,然后单击“查看代码”。查看屏幕截图:

  3. 确保打开了当前工作表代码编辑器,然后将下面的VBA代码复制并粘贴到其中。

在某些情况下无法粘贴代码...

  1. 单击“文件”>“关闭”,然后返回到Microsoft Excel以关闭“ Microsoft Visual Basic for Application”窗口。

  2. 现在,只需单击带下拉列表的单元格,您会看到下拉列表显示为组合框,然后在框中键入第一个字母,相应的单词将自动完成。查看屏幕截图:

https://www.extendoffice.com/documents/excel/2401-excel-drop-down-list-autocomplete.html#a1

答案 1 :(得分:0)

好的,我知道了。我将另一个变量设为“ p”。 p = vertical.value,然后x = worksheets(“ sheet2”)。range(p).value。完美的作品。谢谢大家的帮助

答案 2 :(得分:-1)

对于在 VBA 表单上使用 ComboBox 尝试此操作的任何人,John_w 来自以下链接的回答是更好的解决方案:

https://www.mrexcel.com/board/threads/how-to-use-a-combobox-with-autocomplete-and-search-as-you-type.1098277/

编辑 - 页面中的信息,以防根据 SO bot 建议将其删除:

试试这个代码。组合框是一个具有以下属性的 ActiveX 组合框:

Name = ComboBox1
ListFillRange = blank
MatchEntry = 2 - fmMatchEntryNone
MatchRequired = False

组合框值位于 Sheet1 中,从 A2 开始到 A 列中最后一个填充的单元格。

将此代码放在包含组合框的工作表的模块中。

Option Explicit

Private IsArrow As Boolean

Private Sub ComboBox1_Change()

    Dim i As Long
    
    If Not IsArrow Then
        With Me.ComboBox1
            .List = Worksheets("Sheet1").Range("A2", Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Value
            .ListRows = Application.WorksheetFunction.Min(6, .ListCount)
            .DropDown
            If Len(.Text) Then
                For i = .ListCount - 1 To 0 Step -1
                    If InStr(1, .List(i), .Text, vbTextCompare) = 0 Then .RemoveItem i
                Next
                .DropDown
            End If
        End With
    End If
    
End Sub


Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    IsArrow = (KeyCode = vbKeyUp) Or (KeyCode = vbKeyDown)
    If KeyCode = vbKeyReturn Then Me.ComboBox1.List = Worksheets("Sheet1").Range("A2", Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Value
End Sub