再次在Excel数据验证列表中自动完成建议

时间:2019-01-11 10:04:04

标签: excel vba validation autocomplete autosuggest

键入时如何在Excel数据验证列表中提出建议。我的要求有限制:

  1. 项目列表应位于另一张表中,并且不得位于隐藏行的上方。
  2. 键入短语应将列表缩小到包含该短语的所有项目。
  3. 搜索应该不区分大小写。

因此,假设输入了这些女孩的名字,我们假设输入am后应该建议从AmeliaCamilaSamantha中进行选择。

我找到了一个不错的解决方案here,但是它不过滤带有contains子句的项,而是过滤begins with的项。我很快在这里总结了提议的解决方案。

  1. 我们将组合框(ActiveX控件)插入到工作表中。
  2. 我们右键单击工作表名称>查看代码>并将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

2 个答案:

答案 0 :(得分:1)

尝试添加以下事件(另外两个)。每次输入内容时,代码都会刷新ComboBox列表。

Private Sub TempCombo_Change()
    With Me.TempCombo
        If Not .Visible Then Exit Sub
        .Clear 'needs property MatchEntry set to 2 - fmMatchEntryNone
        .Visible = False 'to refresh the drop down
        .Visible = True
        .Activate
        Dim xStr As String, xArr As Variant
        xStr = TempCombo.TopLeftCell.Validation.Formula1
        xStr = Right(xStr, Len(xStr) - 1)
        xArr = Split(xStr, Application.International(xlListSeparator))
        Dim itm As Variant
        For Each itm In xArr
            If InStr(1, itm, .Value, vbTextCompare) > 0 Or .Value = "" Then
                .AddItem itm
            End If
        Next itm
        .DropDown
    End With
End Sub

答案 1 :(得分:0)

要克服您的第一个约束,也许您可​​以为组合框分配一个范围:

Dim xCombox             As OLEObject
    Dim xStr                As String
    Dim xWs                 As Worksheet
    Dim xArr
    Dim i                   As Range

    Set xWs = Application.ActiveSheet
    On Error Resume Next
    Set xCombox = xWs.OLEObjects("Combotest")
    With Sheets("Test_list2")
    Set i = .Range("A2:A" & .Range("A" & .Rows.Count).End(xlUp).Row)
    End With
    Combotest.ListFillRange = i.Address
 Set xWs = Application.ActiveSheet
    On Error Resume Next
    Set xCombox = xWs.OLEObjects("Combotest")
    With xCombox
        .LinkedCell = "F2"
        .Visible = True
    End With
.
.
.
.
End Sub