带有建议/自动完成功能的Excel数据验证

时间:2013-11-06 16:59:13

标签: excel validation tags

对我低级别的Excel理解深表抱歉,也许我不想做的事情。

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

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

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

Awareness  
Education  
Budget  
Budget Planning  
Enterprise Budget 

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

理想情况下,最好的方法是在一个单元格中放置几个​​“标签”,但我担心excel绝对不可能。

非常感谢您的任何意见,如果我没有正确解释,请对不起。

7 个答案:

答案 0 :(得分:4)

如果您不想沿着VBA路径前进,那么上一个问题就有这个技巧。

Excel 2010: how to use autocomplete in validation list

它确实会在您的工作表顶部添加一些恼人的批量,以及潜在的维护(如果您需要更多选项,添加员工名单中的人员名称,新项目等),但工作方式完全相同。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

上述解决方案均无效。看似有效的那个只提供一个单元格的功能

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

答案 3 :(得分:1)

ExtendOffice.com offers a VBA solution在Excel 2016中为我工作。这是我对步骤的描述。我添加了其他详细信息以使其更容易。我还稍微修改了VBA代码。如果这不适合您,请重试这些步骤或查看ExtendOffice页面上的说明。

  1. 将数据验证添加到一个单元格(或单元格范围)。允许=列表。来源= [包含您要自动完成/下拉的值的范围]。单击确定。现在,您应该有一个下拉列表,但自动完成功能较弱。

    enter image description here

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

    enter image description here

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

    enter image description here

  4. 按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
    
  5. 确保已引用“ Microsoft Forms 2.0对象库”。在Visual Basic编辑器中,转到“工具”>“引用”,选中该库旁边的框(如果尚未选中),然后单击“确定”。要验证其是否有效,请转到“调试”>“编译VBA项目”。

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

enter image description here

enter image description here

答案 4 :(得分:1)

这是一种解决方案,该方法如何使用VBA制作自动填充下拉列表:


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

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

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

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

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

  1. 然后单击“ ActiveX控件”下的“开发人员”>“插入”>“组合框”。

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

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

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

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

  

Private Sub Worksheet_SelectionChange(ByVal目标作为范围)   '由Extendoffice更新:2018/9/21       昏暗的xCombox作为OLEObject       Dim xStr作为字符串       昏暗的xWs作为工作表       昏暗的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

结束子

  

私有子TempCombo_KeyDown(ByVal KeyCode为MSForms.ReturnInteger,ByVal Shift为整数)       选择案例键码           案例9               Application.ActiveCell.Offset(0,1)。激活           案例13               Application.ActiveCell.Offset(1,0)。激活       结束选择   结束

  1. 单击“文件”>“关闭”,然后返回到Microsoft Excel以关闭“ Microsoft Visual Basic for Application”窗口。

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

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

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

答案 5 :(得分:0)

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

  1. 组合框项目的列表随用户类型而更新,仅显示匹配的项目
  2. 如果从组合框中选择了任何项目,则由于this error
  3. ,将跳过有意义的过滤

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完成相同操作,但是事实证明,随着用户类型的不同,重新绘制列表框很困难

答案 6 :(得分:0)

为什么不使用枢轴?

Sample Table Filter Pivot