Vba 是否可以设置“我的Excel用户表单”组合框,以便在输入数据时开始缩小字段范围?
我是新手。 我到处寻找这个答案,甚至遇到了其他与我非常相似的问题,但都找不到答案。所以我希望今天是我的幸运日。 我在excel中有一个Userform,它有四个组合框。每个组合框都有一个下拉列表,其中包含多个选项。在其中两个框中,有许多企业名称,其中许多名称相似。我想有一个功能,在那里的数据被输入框,它将开始缩小选项。示例:如果我键入“heating and air”,它将开始仅显示列表中包含该单词或短语的项目。 这是盒子中的属性更改,还是编写的代码,还是其他什么? 请帮助我,我被难住了,似乎没有人知道答案 非常感谢-Vba 是否可以设置“我的Excel用户表单”组合框,以便在输入数据时开始缩小字段范围?,vba,excel,combobox,Vba,Excel,Combobox,我是新手。 我到处寻找这个答案,甚至遇到了其他与我非常相似的问题,但都找不到答案。所以我希望今天是我的幸运日。 我在excel中有一个Userform,它有四个组合框。每个组合框都有一个下拉列表,其中包含多个选项。在其中两个框中,有许多企业名称,其中许多名称相似。我想有一个功能,在那里的数据被输入框,它将开始缩小选项。示例:如果我键入“heating and air”,它将开始仅显示列表中包含该单词或短语的项目。 这是盒子中的属性更改,还是编写的代码,还是其他什么? 请帮助我,我被难住了,似乎没
Excel新手是的,这是非常可能的。您所要做的就是创建一个填充该组合框的子框,设置它,以便在添加它时检查框的值,例如,如果它是基本的键入示例。基本格式。这假设可能的值存储在数组中。这将添加任何输入了字符串的项。(在任何位置)
我玩了一会儿,想出了一些办法让你开始。这基本上起到了“自动搜索”的作用。它不是自动完成,因为它将搜索整个术语,而不仅仅是以您键入的内容开头的术语。基本上,我假设您有一系列单元格(在本例中为单元格
A2:A121
),其中包含下拉列表的日期
设置
添加一个新的通用模块(名为mineGlobalVars
),并添加以下代码:
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
,它会正确选择绿色
,但是如果我键入甚至
它找不到绿色