【问题标题】:Excel data validation with suggestions/autocomplete带有建议/自动完成功能的 Excel 数据验证
【发布时间】:2013-11-18 01:03:10
【问题描述】:

抱歉,我对 Excel 的理解水平低,也许我想做的事情是不可能的。

我有一个包含 120 个条目的列表,我想用作数据验证。但是,人们不必向下滚动 120 个选项,如果他们可以开始输入并查看与他们愿意编写的内容相匹配的选项,那就太好了。有点像自动完成,我找到了 this tip

我希望在打字开始时有更多选择。

例如,这将是列表的一部分:

Awareness  
Education  
Budget  
Budget Planning  
Enterprise Budget 

键入“B”时,我希望显示最后三个选项并单击其中一个。我不知道这里是否有一种包含 vlookup 的方法...

理想的情况是在一个单元格中拥有多个“标签”,但我担心这在 excel 中是绝对不可能的。

非常感谢您的任何意见,如果我没有正确解释自己,我们深表歉意。

【问题讨论】:

  • 当您在 excel 中处于编辑模式时,几乎所有内容在 Excel 中都会停止。您可以在编辑模式下捕获按键,但这没有用,因为您需要显示一个带有过滤值的下拉列表,这在编辑模式下是不可能的。
  • 话虽如此,还有一个替代方案。当用户选择一个单元格时,您可以显示一个带有组合框的用户表单,在那里您可以实现您想要的。这样,如果您有许多带有数据验证的单元格,您就不必在工作表上创建多个组合框。这将涉及少量代码,因为用户窗体必须具有正确的大小并且需要放置在单元格的顶部。
  • 亲爱的@Siddharth,感谢您的提示,我发现了用户表单的全新世界。我想我会用一个来输入数据并用标签放置复选框,虽然它们太多了所以我会尝试放置一个可以在列表中查找的组合框,也许你可以帮助我的想法.再次感谢。
  • 感谢@KazJaw 的编辑。

标签: excel validation tags


【解决方案1】:

ExtendOffice.com offers a VBA solution 在 Excel 2016 中为我工作。这是我对步骤的描述。我包括了额外的细节,以使其更容易。我还稍微修改了 VBA 代码。如果这对您不起作用,请重试这些步骤或查看 ExtendOffice 页面上的说明。

  1. 向单元格(或单元格区域)添加数据验证。允许 = 列表。 Source = [自动完成/下拉列表所需的值的范围]。单击确定。您现在应该有一个下拉菜单,但自动完成功能较弱。

  1. 使用包含新添加的数据验证的单元格,插入 ActiveX 组合框(不是表单控件组合框)。这是从开发人员功能区完成的。如果您没有开发人员功能区,则需要从 Excel 选项菜单中添加它。

  1. 在“控件”部分的“开发人员”选项卡中,单击“设计模式”。选择您刚刚插入的组合框。然后在同一功能区部分中单击“属性”。在“属性”窗口中,将组合框的名称更改为“TempCombo”。

  1. 按 ALT + F11 转到 Visual Basic 编辑器。在左侧,双击带有数据验证的工作表以打开该工作表的代码。将以下代码复制并粘贴到工作表上。注意:我稍微修改了代码,使其即使在工作表顶部启用Option Explicit 时也能正常工作。

    Option Explicit
    
    Private Sub Worksheet_SelectionChange(ByVal target As Range)
    'Update by Extendoffice: 2018/9/21
    ' Update by Chris Brackett 2018-11-30
    
    Dim xWs As Worksheet
    Set xWs = Application.ActiveSheet
    
    On Error Resume Next
    
    Dim xCombox As OLEObject
    Set xCombox = xWs.OLEObjects("TempCombo")
    
    ' Added this to auto select all text when activating the combox box.
    xCombox.SetFocus
    
    With xCombox
        .ListFillRange = vbNullString
        .LinkedCell = vbNullString
        .Visible = False
    End With
    
    
    Dim xStr As String
    Dim xArr
    
    
    If target.Validation.Type = xlValidateList Then
        ' The target cell contains Data Validation.
    
        target.Validation.InCellDropdown = False
    
    
        ' Cancel the "SelectionChange" event.
        Dim Cancel As Boolean
        Cancel = True
    
    
        xStr = target.Validation.Formula1
        xStr = Right(xStr, Len(xStr) - 1)
    
        If xStr = vbNullString 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 = vbNullString 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  ' Tab key
                Application.ActiveCell.Offset(0, 1).Activate
            Case 13 ' Pause key
                Application.ActiveCell.Offset(1, 0).Activate
        End Select
    End Sub
    
  2. 确保引用了“Microsoft Forms 2.0 对象库”。在 Visual Basic 编辑器中,转到工具 > 引用,选中该库旁边的框(如果尚未选中),然后单击确定。要验证它是否有效,请转到调试 > 编译 VBA 项目。

  3. 最后,保存您的项目并单击包含您添加的数据验证的单元格。您应该会看到一个组合框,其中包含一个下拉建议列表,该列表会随着您键入的每个字母而更新。

【讨论】:

  • 有没有办法让组合框列表中的所有匹配项都包含输入的短语,而不仅仅是其中的一部分,即以短语开头的部分?我在这里单独问过这个问题:stackoverflow.com/questions/54144254/…
  • 第四步中的代码使用图形中组合框的名称,但不是第三步的措辞。只要确保组合框的名称是“TempCombo”而不是“TempComboBox” ”。另外,如果您在数据验证步骤(步骤 1)取消选中“单元内下拉菜单”,我认为它会更顺利一些。
  • @John 我将第 4 步中的变量名称更改为与第 3 步中的屏幕截图中的名称一致。现在两者都是TempCombo。感谢您指出这一点!
【解决方案2】:

网络版 Excel 具有此功能。如果您添加基于列表的验证,当您开始在单元格中输入内容时,它将弹出列表中任何匹配项的列表。

【讨论】:

    【解决方案3】:

    为什么不使用 Pivot?

    Sample Table Filter Pivot

    【讨论】:

      【解决方案4】:

      我改编了 ChrisB 的答案。就像在他的示例中一样,单击单元格时会显示一个临时组合框。另外:

      1. Combobox 项目列表随用户类型更新,仅显示匹配项目
      2. 如果选择了组合框中的任何项目,则会跳过过滤,因为它是有意义的并且因为this error

      Option Explicit
      
      Private Const DATA_RANGE = "A1:A16"
      Private Const DROPDOWN_RANGE = "F2:F10"
      Private Const HELP_COLUMN = "$G"
      
      
      Private Sub Worksheet_SelectionChange(ByVal target As Range)
          Dim xWs As Worksheet
          Set xWs = Application.ActiveSheet
          
          On Error Resume Next
          
          With Me.TempCombo
              .LinkedCell = vbNullString
              .Visible = False
          End With
          
          If target.Cells.count > 1 Then
              Exit Sub
          End If
          
          Dim isect As Range
          Set isect = Application.Intersect(target, Range(DROPDOWN_RANGE))
          If isect Is Nothing Then
             Exit Sub
          End If
             
          With Me.TempCombo
              .Visible = True
              .Left = target.Left - 1
              .Top = target.Top - 1
              .Width = target.Width + 5
              .Height = target.Height + 5
              .LinkedCell = target.Address
      
          End With
      
          Me.TempCombo.Activate
          Me.TempCombo.DropDown
      End Sub
      
      Private Sub TempCombo_Change()
          If Me.TempCombo.Visible = False Then
              Exit Sub
          End If
          
          Dim currentValue As String
          currentValue = Range(Me.TempCombo.LinkedCell).Value
          
          If Trim(currentValue & vbNullString) = vbNullString Then
              Me.TempCombo.ListFillRange = "=" & DATA_RANGE
          Else
              If Me.TempCombo.ListIndex = -1 Then
                   Dim listCount As Integer
                   listCount = write_matching_items(currentValue)
                   Me.TempCombo.ListFillRange = "=" & HELP_COLUMN & "1:" & HELP_COLUMN & listCount
                   Me.TempCombo.DropDown
              End If
      
          End If
      End Sub
      
      
      Private Function write_matching_items(currentValue As String) As Integer
          Dim xWs As Worksheet
          Set xWs = Application.ActiveSheet
      
          Dim cell As Range
          Dim c As Range
          Dim firstAddress As Variant
          Dim count As Integer
          count = 0
          xWs.Range(HELP_COLUMN & ":" & HELP_COLUMN).Delete
          With xWs.Range(DATA_RANGE)
              Set c = .Find(currentValue, LookIn:=xlValues)
              If Not c Is Nothing Then
                  firstAddress = c.Address
                  Do
                    Set cell = xWs.Range(HELP_COLUMN & "$" & (count + 1))
                    cell.Value = c.Value
                    count = count + 1
                   
                    Set c = .FindNext(c)
                    If c Is Nothing Then
                      GoTo DoneFinding
                    End If
                 Loop While c.Address <> firstAddress
              End If
      DoneFinding:
          End With
          
          write_matching_items = count
      
      End Function
      
      Private Sub TempCombo_KeyDown( _
                      ByVal KeyCode As MSForms.ReturnInteger, _
                      ByVal Shift As Integer)
      
          Select Case KeyCode
              Case 9  ' Tab key
                  Application.ActiveCell.Offset(0, 1).Activate
              Case 13 ' Pause key
                  Application.ActiveCell.Offset(1, 0).Activate
          End Select
      End Sub

      注意事项:

      1. ComboBoxe 的 MatchEntry 必须设置为 2 - fmMatchEntryNone。不要忘记将 ComboBox 名称设置为 TempCombo
      2. 我正在使用 listFillRange 来设置 ComboBox 选项。范围必须是连续的,因此,匹配项存储在帮助列中。
      3. 我已尝试使用 ComboBox.addItem 完成相同的操作,但结果发现很难在用户键入时重新绘制列表框

      【讨论】:

        【解决方案5】:

        这是一个如何使用 VBA 制作自动完成下拉列表的解决方案:


        首先您需要在工作表中插入一个组合框并更改其属性,然后运行 ​​VBA 代码以启用自动完成功能。

        1. 进入包含您希望自动完成的下拉列表的工作表。

        2. 在插入组合框之前,您需要启用功能区中的“开发人员”选项卡。

        a)。在 Excel 2010 和 2013 中,单击文件 > 选项。并在“选项”对话框中,单击右侧窗格中的“自定义功能区”,选中“开发人员”框,然后单击“确定”按钮。

        b)。在 Outlook 2007 中,单击 Office 按钮 > Excel 选项。在 Excel 选项对话框中,单击右侧栏中的流行,然后选中功能区框中的显示开发人员选项卡,最后单击确定按钮。

        1. 然后点击开发者>插入>ActiveX控件下的组合框。

        2. 在当前打开的工作表中绘制组合框并右键单击它。在右键菜单中选择属性。

        3. 通过单击开发人员 > 设计模式关闭设计模式。

        4. 右键单击当前打开的工作表选项卡,然后单击查看代码。

        5. 确保当前工作表代码编辑器已打开,然后将下面的 VBA 代码复制并粘贴到其中。

        extendoffice.com借来的代码

        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
        
        1. 单击文件 > 关闭并返回 Microsoft Excel 以关闭 Microsoft Visual Basic for Application 窗口。

        2. 现在,只需单击带有下拉列表的单元格,您可以看到下拉列表显示为一个组合框,然后在框中键入第一个字母,相应的单词将自动完成。

        注意:此 VBA 代码不适用于合并的单元格。

        来源: How To Autocomplete When Typing In Excel Drop Down List?

        【讨论】:

          【解决方案6】:

          上述解决方案均无效。似乎工作的那个只为一个单元格提供功能

          最近我不得不输入很多名字并且没有建议,这是一个巨大的痛苦。我很幸运拥有this excel autocomplete add-in 来启用自动完成功能。缺点是你需要启用宏(但你以后可以随时关闭它)

          【讨论】:

          • 对于那些看到这个的人 - 这是一个付费加载项。
          • 该 URL 中不再存在加载项
          【解决方案7】:

          http://www.ozgrid.com/Excel/autocomplete-validation.htm 有一个混乱的解决方法,基本上是这样工作的:

          1. Tools - Options &gt; Edit 上启用“单元格值的自动完成”;
          2. 在具有验证标准的单元格上方的单元格上重新创建有效项目列表;
          3. 隐藏包含有效项目列表的行。

          【讨论】:

          • 现代 Excel 上的等效过程(来自 support.office.com):单击文件选项卡,然后单击选项。单击高级,然后在编辑选项下,选中或清除为单元格值启用自动完成复选框以打开单元格值的自动完成或关闭。
          【解决方案8】:

          如果您不想走 VBA 路径,可以参考上一个问题中的这个技巧。

          Excel 2010: how to use autocomplete in validation list

          它确实会在您的工作表顶部增加一些烦人的内容,并可能进行维护(如果您需要更多选项、从员工列表中添加人员姓名、新项目等),但工作方式都是一样的。

          【讨论】:

          • 当您的工作表的用户突然看到行序列号(在 excel 中显示在最左侧)从某个奇数 1527(在我的情况)。然后他们显然变得好奇,想要揭开这些行,看看下面是什么秘密。当他们取消隐藏这些行时,一切都变得一团糟。
          猜你喜欢
          • 2019-06-06
          • 2019-01-23
          • 2020-02-14
          • 1970-01-01
          • 1970-01-01
          • 2012-08-05
          • 1970-01-01
          • 2013-10-02
          • 1970-01-01
          相关资源
          最近更新 更多