24

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

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

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

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

Awareness  
Education  
Budget  
Budget Planning  
Enterprise Budget 

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

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

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

4

8 回答 8

7

ExtendOffice.com 提供了一个在 Excel 2016 中为我工作的 VBA 解决方案。这是我对步骤的描述。我包括了额外的细节,以使其更容易。我还稍微修改了 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. 最后,保存您的项目并单击包含您添加的数据验证的单元格。您应该会看到一个组合框,其中包含建议的下拉列表,该列表会随着您键入的每个字母而更新。

在此处输入图像描述

在此处输入图像描述

于 2018-11-30T21:12:55.940 回答
5

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

Excel 2010:如何在验证列表中使用自动完成功能

它确实在您的工作表顶部增加了一些烦人的体积,以及潜在的维护(如果您需要更多选项,从员工列表中添加人员姓名,新项目等),但工作方式相同。

于 2013-12-11T08:36:26.543 回答
4

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

  1. 启用“单元格值的自动完成” Tools - Options > Edit
  2. 在具有验证标准的单元格上方的单元格上重新创建有效项目列表;
  3. 隐藏包含有效项目列表的行。
于 2015-03-23T14:10:37.420 回答
3

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


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

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

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

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

乙)。在 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 代码不适用于合并的单元格。

来源: 在 Excel 下拉列表中键入时如何自动完成?

于 2019-05-07T12:31:25.957 回答
1

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

最近我不得不输入很多名字并且没有建议,这是一个巨大的痛苦。我很幸运拥有这个 excel 自动完成插件来启用自动完成功能。不利的一面是您需要启用宏(但您以后可以随时将其关闭)

于 2017-11-03T16:24:16.760 回答
0

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

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

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,但结果证明当用户输入时很难重新绘制列表框
于 2020-03-16T21:38:59.677 回答
0

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

于 2021-09-13T07:00:37.003 回答
0

为什么不使用枢轴?

样本表 过滤器枢轴

于 2020-04-23T09:42:42.083 回答