【发布时间】:2019-06-06 05:48:23
【问题描述】:
如何在输入时在 Excel 数据验证列表中提出建议。我的请求中有一些限制:
- 项目列表应该在另一个工作表中,并且不能在隐藏行的上方。
- 键入短语应将列表缩小到包含该短语的所有项目。
- 搜索应该不区分大小写。
所以在输入am 之后,假设我们应该有一个从Amelia、Camila、Samantha 接听的建议,前提是这些女孩的名字在项目列表中。
我找到了一个很好的解决方案here,但是它不会过滤带有contains 子句而是begins with 的项目。我很快在这里总结了建议的解决方案。
- 我们在工作表中插入一个组合框(ActiveX 控件)。
-
我们右键单击一个工作表名称>查看代码>并将VBA代码粘贴到工作表VBA编辑器中:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'Update by Extendoffice: 2018/9/21 Dim xCombox As OLEObject Dim xStr As String Dim xWs As Worksheet Dim xArr Set xWs = Application.ActiveSheet On Error Resume Next Set xCombox = xWs.OLEObjects("TempCombo") With xCombox .ListFillRange = "" .LinkedCell = "" .Visible = False End With If Target.Validation.Type = 3 Then Target.Validation.InCellDropdown = False Cancel = True xStr = Target.Validation.Formula1 xStr = Right(xStr, Len(xStr) - 1) If xStr = "" Then Exit Sub With xCombox .Visible = True .Left = Target.Left .Top = Target.Top .Width = Target.Width + 5 .Height = Target.Height + 5 .ListFillRange = xStr If .ListFillRange = "" Then xArr = Split(xStr, ",") Me.TempCombo.List = xArr End If .LinkedCell = Target.Address End With xCombox.Activate Me.TempCombo.DropDown End If End Sub Private Sub TempCombo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Select Case KeyCode Case 9 Application.ActiveCell.Offset(0, 1).Activate Case 13 Application.ActiveCell.Offset(1, 0).Activate End Select End Sub
我找不到将搜索选项从“开始于”更改为contains 的修改方法。
关于验证列表中的自动完成或自动提示的问题已经被问到了。
Excel data validation with suggestions/autocomplete
Excel 2010: how to use autocomplete in validation list
但它们都没有包含满足我施加的限制的答案。
供下载的测试文件是here。
【问题讨论】:
-
一般来说,数据验证和 ComboBox 都不支持你的要求。我唯一的想法是在循环中从
xArr中删除所有不包含键入字符串的项目,例如am。并在每个TempCombo_KeyDown上刷新 ComboBox 列表。但是如果列表很长,这很容易变得很慢。 -
@PEH 你能把它作为答案吗?哪个变量保存当前键入的短语?
标签: excel vba validation autocomplete autosuggest