【问题标题】:Excel 2010: how to use autocomplete in validation listExcel 2010:如何在验证列表中使用自动完成功能
【发布时间】:2011-11-03 02:53:22
【问题描述】:

我正在使用几个 vlookup() 函数所依赖的大型验证列表。这个列表越来越大。有没有办法输入我要查找的列表项的第一个字母,而不是手动向下滚动列表搜索项?

我做了一些谷歌搜索,但这表明这在早期版本的 Excel 中确实是可能的,但在 Excel 2010 中却不行。希望你们能提供帮助。

【问题讨论】:

  • 查看this wiki,这是真正意义上最接近的解决方案。一个名为 Don't Break The Chain 或 Excel 中的数据链接的概念。

标签: vba excel excel-2010


【解决方案1】:

这是一个很好的处理方法(在ozgrid 上找到):

假设您的列表在Sheet2 上,并且您希望在Sheet1 上使用带有自动完成功能的验证列表。

Sheet1 A1 上输入=Sheet2!A1 并复制下来,包括所需数量的备用行(例如总共300 行)。隐藏这些行并在引用中使用此公式:对于名为 MyList 的动态命名范围:

=OFFSET(Sheet1!$A$1,0,0,MATCH("*",Sheet1!$A$1:$A$300,-1),1)

现在在最后一个隐藏行下方的单元格中使用数据验证,对于列表源使用=MyList

[EDIT] 适用于 Excel 2007+ 的改编版本(虽然无法在 2010 年进行测试,但 AFAIK,没有什么真正特定于某个版本)。
假设您的数据源位于 Sheet2!A1:A300 上,假设您的验证列表(又名 自动完成)位于单元格 Sheet1!A1 上。

  1. 创建一个动态命名范围MyList,这将取决于您放置验证的单元格的值

    =OFFSET(Sheet2!$A$1,MATCH(Sheet1!$A$1&"*",Sheet2!$A$1:$A$300,0)-1,0,COUNTA(Sheet2!$A:$A))

  2. 在单元格Sheet1!A1 上添加验证列表,该列表将引用列表=MyList

注意事项

  1. 这不是 真正的自动完成功能,因为您必须先键入,然后单击验证箭头:然后列表将在第一个匹配元素处开始你的名单

  2. 该列表将持续到数据的末尾。如果您想更精确(仅在列表中保留 匹配 元素),您可以将 COUNTA 更改为 SUMLPRODUCT,这将计算匹配元素的数量

  3. 您的源列表必须排序

【讨论】:

  • 感谢您的回复。你确定这适用于 Excel 2010 吗?文章说“启用自动完成”,据我所知,这在 2010 年不是一个选项。此外,“在引用中使用此公式:”是什么意思?我将在哪个单元格中开始输入我要查找的项目的第一个字母?
  • 这非常好...但是,cmiiw 仅适用于单个单元格验证,因为列表源正在使用 match 函数来匹配 sheet1 上的预定义单个单元格。有什么解决方法可以使它适用于多行吗?
  • Excel 2007+ 的动态范围公式对我来说就像一个真正的自动完成。我正在处理公司列表,所以当我在定位到MyList 的单元格中键入Microsof 时,Excel 会自动完成它,就像 Microsoft Corporation 通过在灰色背景中显示剩余的文本 t orporation 一样。
  • 您不必将主列表数据保留在要显示具有自动完成功能的列表的目标单元格上方。这会弄乱最左侧显示的行号,并且对于最终用户来说看起来很奇怪。相反,您可以将主列表保持在工作表底部的下方,以避免弄乱行号(当您隐藏它们时)。 don't break the chainhere 的一个惊人概念
【解决方案2】:

基于JMax 的答案,对动态命名范围使用此公式以使解决方案适用于多行:

=OFFSET(Sheet2!$A$1,MATCH(INDIRECT("Sheet1!"&ADDRESS(ROW(),COLUMN(),4))&"*",Sheet2!$A$1:$A$300,0)-1,0,COUNTA(Sheet2!$A:$A))

【讨论】:

    【解决方案3】:

    这是另一种选择。它的工作原理是在启用了验证的单元格顶部放置一个 ActiveX ComboBox,然后在 ComboBox 中提供自动完成功能。

    Option Explicit
    
    ' Autocomplete - replacing validation lists with ActiveX ComboBox
    '
    ' Usage:
    '   1. Copy this code into a module named m_autocomplete
    '   2. Go to Tools / References and make sure "Microsoft Forms 2.0 Object Library" is checked
    '   3. Copy and paste the following code to the worksheet where you want autocomplete
    '      ------------------------------------------------------------------------------------------------------
    '      - autocomplete
    '      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    '          m_autocomplete.SelectionChangeHandler Target
    '      End Sub
    '      Private Sub AutoComplete_Combo_KeyDown(ByVal KeyCode As msforms.ReturnInteger, ByVal Shift As Integer)
    '          m_autocomplete.KeyDownHandler KeyCode, Shift
    '      End Sub
    '      Private Sub AutoComplete_Combo_Click()
    '          m_autocomplete.AutoComplete_Combo_Click
    '      End Sub
    '      ------------------------------------------------------------------------------------------------------
    
    ' When the combobox is clicked, it should dropdown (expand)
    Public Sub AutoComplete_Combo_Click()
        Dim ws As Worksheet: Set ws = ActiveSheet
        Dim cbo As OLEObject: Set cbo = GetComboBoxObject(ws)
        Dim cb As ComboBox: Set cb = cbo.Object
        If cbo.Visible Then cb.DropDown
    End Sub
    
    ' Make it easier to navigate between cells
    Public Sub KeyDownHandler(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Const UP As Integer = -1
        Const DOWN As Integer = 1
    
        Const K_TAB_______ As Integer = 9
        Const K_ENTER_____ As Integer = 13
        Const K_ARROW_UP__ As Integer = 38
        Const K_ARROW_DOWN As Integer = 40
    
        Dim direction As Integer: direction = 0
    
        If Shift = 0 And KeyCode = K_TAB_______ Then direction = DOWN
        If Shift = 0 And KeyCode = K_ENTER_____ Then direction = DOWN
        If Shift = 1 And KeyCode = K_TAB_______ Then direction = UP
        If Shift = 1 And KeyCode = K_ENTER_____ Then direction = UP
        If Shift = 1 And KeyCode = K_ARROW_UP__ Then direction = UP
        If Shift = 1 And KeyCode = K_ARROW_DOWN Then direction = DOWN
    
        If direction <> 0 Then ActiveCell.Offset(direction, 0).Activate
    
        AutoComplete_Combo_Click
    End Sub
    
    Public Sub SelectionChangeHandler(ByVal Target As Range)
        On Error GoTo errHandler
    
        Dim ws As Worksheet: Set ws = ActiveSheet
        Dim cbo As OLEObject: Set cbo = GetComboBoxObject(ws)
        Dim cb As ComboBox: Set cb = cbo.Object
    
        ' Try to hide the ComboBox. This might be buggy...
        If cbo.Visible Then
            cbo.Left = 10
            cbo.Top = 10
            cbo.ListFillRange = ""
            cbo.LinkedCell = ""
            cbo.Visible = False
            Application.ScreenUpdating = True
            ActiveSheet.Calculate
            ActiveWindow.SmallScroll
            Application.WindowState = Application.WindowState
            DoEvents
        End If
    
        If Not HasValidationList(Target) Then GoTo ex
    
        Application.EnableEvents = False
    
        ' TODO: the code below is a little fragile
        Dim lfr As String
        lfr = Mid(Target.Validation.Formula1, 2)
        lfr = Replace(lfr, "INDIREKTE", "") ' norwegian
        lfr = Replace(lfr, "INDIRECT", "") ' english
        lfr = Replace(lfr, """", "")
        lfr = Application.Range(lfr).Address(External:=True)
    
        cbo.ListFillRange = lfr
        cbo.Visible = True
        cbo.Left = Target.Left
        cbo.Top = Target.Top
        cbo.Height = Target.Height + 5
        cbo.Width = Target.Width + 15
        cbo.LinkedCell = Target.Address(External:=True)
        cbo.Activate
        cb.SelStart = 0
        cb.SelLength = cb.TextLength
        cb.DropDown
    
        GoTo ex
    
    errHandler:
        Debug.Print "Error"
        Debug.Print Err.Number
        Debug.Print Err.Description
    ex:
        Application.EnableEvents = True
    End Sub
    
    ' Does the cell have a validation list?
    Function HasValidationList(Cell As Range) As Boolean
        HasValidationList = False
        On Error GoTo ex
        If Cell.Validation.Type = xlValidateList Then HasValidationList = True
    ex:
    End Function
    
    ' Retrieve or create the ComboBox
    Function GetComboBoxObject(ws As Worksheet) As OLEObject
        Dim cbo As OLEObject
        On Error Resume Next
        Set cbo = ws.OLEObjects("AutoComplete_Combo")
        On Error GoTo 0
        If cbo Is Nothing Then
            'Dim EnableSelection As Integer: EnableSelection = ws.EnableSelection
            Dim ProtectContents As Boolean: ProtectContents = ws.ProtectContents
    
            Debug.Print "Lager AutoComplete_Combo"
            If ProtectContents Then ws.Unprotect
            Set cbo = ws.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False, _
                                Left:=50, Top:=18.75, Width:=129, Height:=18.75)
            cbo.name = "AutoComplete_Combo"
            cbo.Object.MatchRequired = True
            cbo.Object.ListRows = 12
            If ProtectContents Then ws.Protect
        End If
        Set GetComboBoxObject = cbo
    End Function
    

    【讨论】:

      【解决方案4】:

      只要您有一列项目,Excel 就会自动执行此操作。如果您选择列下方(或上方)的空白单元格并开始输入,它会根据列中的所有内容自动完成。

      【讨论】:

      • 列表存储在另一个工作表中。我使用数据验证 --> 列表。
      【解决方案5】:

      正如其他人所建议的,您需要使用组合框。但是,大多数教程都向您展示了如何只设置一个组合框,并且该过程非常繁琐。

      由于我之前从列表中输入大量数据时遇到过这个问题,我建议您使用 this autocomplete add-in 。它可以帮助您在您选择的任何单元格上创建组合框,并且您可以定义一个列表以显示在下拉列表中。

      【讨论】:

        【解决方案6】:
        =OFFSET(NameList!$A$2:$A$200,MATCH(INDIRECT("FillData!"&ADDRESS(ROW(),COLUMN(),4))&"*",NameList!$A$2:$A$200,0)-1,0,COUNTIF($A$2:$A$200,INDIRECT("FillData!"&ADDRESS(ROW(),COLUMN(),4))&"*"),1)
        
        1. 创建工作表名称为Namelist。在A列填写数据列表。

        2. 创建另一个工作表名称为FillData,以便根据需要制作数据验证列表。

        3. 输入第一个字母并选择,下拉菜单将取决于您的输入。

        【讨论】:

        • 数据列表必须按字母顺序排列
        • 我不明白。 sheet name 是什么意思?工作表或命名范围的名称?如何处理您提供的代码。
        猜你喜欢
        • 2020-10-25
        • 2013-11-18
        • 1970-01-01
        • 2012-09-06
        • 2014-04-20
        • 1970-01-01
        • 1970-01-01
        • 2022-08-15
        • 2015-06-20
        相关资源
        最近更新 更多