我有以下代码,该代码创建了具有自动完成功能的用户表单,该表单是我从另一个网站复制的。我想对此进行修改以包括“键入时搜索”功能。例如:
组合框引用的表为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
答案 0 :(得分:0)
使用VBA代码输入下拉列表时自动完成
首先,您需要在工作表中插入一个组合框并更改其属性,然后运行VBA代码以启用自动完成功能。
进入工作表,该工作表包含您希望其自动完成的下拉列表。
在插入组合框之前,需要启用功能区中的“开发人员”选项卡。
1)。在Excel 2010和2013中,单击文件>选项。然后在“选项”对话框中,单击右窗格中的“自定义功能区”,选中“开发人员”框,然后单击“确定”按钮。查看屏幕截图:
2)。在Outlook 2007中,单击Office按钮> Excel选项。在“ Excel选项”对话框中,单击右栏中的“流行”,然后选中“功能区”框中的“显示开发人员”选项卡,最后单击“确定”按钮。
然后单击“ ActiveX控件”下的“开发人员”>“插入”>“组合框”。查看屏幕截图:
在当前打开的工作表中绘制组合框,然后右键单击它。在右键菜单中选择“属性”。
在“属性”对话框中,您需要:
1)。在“名称”字段中将名称更改为TempCombo;
2)。在“字体”字段中指定所需的字体;
3)。向下滚动以在MatchEntry字段中选择1-fmMatchEntryComplete;
4)。关闭“属性”对话框。
通过单击“开发人员”>“设计模式”来关闭设计模式。
右键单击当前打开的工作表选项卡,然后单击“查看代码”。查看屏幕截图:
确保打开了当前工作表代码编辑器,然后将下面的VBA代码复制并粘贴到其中。
在某些情况下无法粘贴代码...
单击“文件”>“关闭”,然后返回到Microsoft Excel以关闭“ Microsoft Visual Basic for Application”窗口。
现在,只需单击带下拉列表的单元格,您会看到下拉列表显示为组合框,然后在框中键入第一个字母,相应的单词将自动完成。查看屏幕截图:
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 来自以下链接的回答是更好的解决方案:
编辑 - 页面中的信息,以防根据 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