代码之家  ›  专栏  ›  技术社区  ›  Przemyslaw Remin

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

  •  0
  • Przemyslaw Remin  · 技术社区  · 5 年前

    如何在Excel数据验证列表中输入建议。我的请求中有一些限制:

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

    所以打字之后 am 我们应该假设有个建议 Amelia , Camila , Samantha ,前提是这些女孩的名字在物品清单上。

    我找到了一个很好的解决办法 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
      

    我找不到修改的方法,无法将搜索选项从“开始于”更改为 包含 .

    到目前为止,已经询问了有关验证列表中的自动完成或自动建议的问题。
    Excel data validation with suggestions/autocomplete
    Excel 2010: how to use autocomplete in validation list
    但他们两人的回答都不能满足我施加的限制。

    下载的测试文件是 here .

    1 回复  |  直到 5 年前
        1
  •  1
  •   Pᴇʜ    5 年前

    尝试添加以下事件(另外添加其他2个事件)。每次输入内容时,代码都会刷新组合框列表。

    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