Vba 是否可以设置“我的Excel用户表单”组合框,以便在输入数据时开始缩小字段范围?

Vba 是否可以设置“我的Excel用户表单”组合框,以便在输入数据时开始缩小字段范围?,vba,excel,combobox,Vba,Excel,Combobox,我是新手。 我到处寻找这个答案,甚至遇到了其他与我非常相似的问题,但都找不到答案。所以我希望今天是我的幸运日。 我在excel中有一个Userform,它有四个组合框。每个组合框都有一个下拉列表,其中包含多个选项。在其中两个框中,有许多企业名称,其中许多名称相似。我想有一个功能,在那里的数据被输入框,它将开始缩小选项。示例:如果我键入“heating and air”,它将开始仅显示列表中包含该单词或短语的项目。 这是盒子中的属性更改,还是编写的代码,还是其他什么? 请帮助我,我被难住了,似乎没

我是新手。 我到处寻找这个答案,甚至遇到了其他与我非常相似的问题,但都找不到答案。所以我希望今天是我的幸运日。 我在excel中有一个Userform,它有四个组合框。每个组合框都有一个下拉列表,其中包含多个选项。在其中两个框中,有许多企业名称,其中许多名称相似。我想有一个功能,在那里的数据被输入框,它将开始缩小选项。示例:如果我键入“heating and air”,它将开始仅显示列表中包含该单词或短语的项目。 这是盒子中的属性更改,还是编写的代码,还是其他什么? 请帮助我,我被难住了,似乎没有人知道答案

非常感谢-
Excel新手

是的,这是非常可能的。您所要做的就是创建一个填充该组合框的子框,设置它,以便在添加它时检查框的值,例如,如果它是基本的键入示例。基本格式。这假设可能的值存储在数组中。这将添加任何输入了字符串的项。(在任何位置)


我玩了一会儿,想出了一些办法让你开始。这基本上起到了“自动搜索”的作用。它不是自动完成,因为它将搜索整个术语,而不仅仅是以您键入的内容开头的术语。基本上,我假设您有一系列单元格(在本例中为单元格
A2:A121
),其中包含下拉列表的日期

设置

添加一个新的通用模块(名为mine
GlobalVars
),并添加以下代码:

Option Explicit

Public IgnoreChange As Boolean
Public RangeOfData As Variant
Private Sub UserForm_Initialize()
        RangeOfData = Application.WorksheetFunction.Transpose(Sheet1.Range("A2:A121").Value)
        IgnoreChange = False
End Sub
代码

将代码打开到您的UserForm

添加以下代码:

Option Explicit

Public IgnoreChange As Boolean
Public RangeOfData As Variant
Private Sub UserForm_Initialize()
        RangeOfData = Application.WorksheetFunction.Transpose(Sheet1.Range("A2:A121").Value)
        IgnoreChange = False
End Sub
确保更新
A2:A121
Sheet1
(我使用的是代码名,但
工作表(“Sheet1”)
也可以)以指向包含组合框选项的数据

现在,作业的内容在
组合框\u Change
事件中处理

Private Sub ComboBox1_Change()

        If Me.ComboBox1.Text = vbNullString Then
                Me.ComboBox1.Clear
                SendKeys ("{Enter}")
        End If

        If Me.ComboBox1.TextLength > 2 Then

                Dim i As Long, j As Long

                If IgnoreChange = False Then
                Me.ComboBox1.Clear
                SendKeys ("{Enter}")
                DoEvents 'Bug with NumLock
                For i = LBound(RangeOfData) To UBound(RangeOfData)
                        If UCase(RangeOfData(i)) Like "*" & UCase(Me.ComboBox1.Text) & "*" Then
                                Me.ComboBox1.AddItem RangeOfData(i)
                        End If
                Next i

                Me.ComboBox1.DropDown

                End If

        End If
        IgnoreChange = False
End Sub
确保将combobox控件的名称更改为
combobox 1

基本上,它的作用是在用户输入达到两个或两个以上字符时处理用户输入。代码将搜索输入数据范围,然后在用户输入字符串时返回与字符串匹配的结果。结果就像一个建议框

我应该注意的是,使用这种方法,combobox没有预先填充数据,因此用户必须开始在combobox中输入一些内容

此外,我还添加了以下代码来处理退格键:

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = 8 Then
                IgnoreChange = True
        End If
End Sub
再次确保根据需要更改组合框1

例如,我将所有120种蜡笔颜色加载到电子表格中(这是A2:A121的Sheet1中的内容)

下面是我开始键入时的示例输出,首先输入
blu

如您所见,我正在获取所有包含
blu
的值,包括那些不以
blu
开头的值,例如Cadet Blue或Midnight Blue

另一个例子是,我将搜索
flower

如您所见,它不是一个包含120个静态选项的组合框,而是根据用户键入的内容进行更新,并绑定到单元格中的值列表

我确实注意到,
SendKeys
有时会切换我的NumLock,这是一个已知的问题。该行的目的是在用户删除所有文本或继续发送文本后折叠下拉列表,以便“刷新”自动生成的列表。

默认行为(我使用的是Excel 2013)如果我开始键入,它将为我自动完成。但我假设你想要比自动完成更好的东西?就像你想找到一个短语,即使你不知道它的开头?例如:我添加了一个颜色组合框。如果我开始键入
Gr
,它会正确选择
绿色
,但是如果我键入
甚至
它找不到绿色