Excel 2010: как использовать автозаполнение в списке проверки - PullRequest
19 голосов
/ 03 ноября 2011

Я использую большой список проверки, от которого зависит пара функций vlookup (). Этот список становится все больше и больше. Есть ли способ ввести первые буквы нужного мне элемента списка вместо ручной прокрутки списка вниз в поисках элемента?

Я сделал несколько поисков в Google, но это говорит о том, что это действительно возможно в более ранних версиях Excel, но не в Excel 2010. Надеюсь, что вы, ребята, можете помочь.

Ответы [ 6 ]

11 голосов
/ 03 ноября 2011

Вот очень хороший способ справиться с этим (можно найти на ozgrid ):

Допустим, ваш список находится на Sheet2, и вы хотите использовать Список проверки с автозаполнением на Sheet1.

Вкл. Sheet1 A1 Введите =Sheet2!A1 и скопируйте, включая столько резервных строк, сколько необходимо (скажем, всего 300 строк). Скройте эти строки и используйте эту формулу в Ссылках: для динамического именованного диапазона с именем MyList:

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

Теперь в ячейке, расположенной непосредственно под последней скрытой строкой, используйте проверку данных, а для источника списка - =MyList

[РЕДАКТИРОВАТЬ] Адаптированная версия для Excel 2007+ (хотя не могла протестировать в 2010 году, но AFAIK, нет ничего особенного для версии).
Допустим, ваш источник данных находится на Sheet2!A1:A300, и давайте предположим, что ваш список проверки (он же autocomplete ) находится в ячейке 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. Ваш список источников должен быть отсортирован

1 голос
/ 07 мая 2015

Опираясь на ответ JMax , используйте эту формулу для динамического именованного диапазона, чтобы решение работало для нескольких строк:

=OFFSET(Sheet2!$A$1,MATCH(INDIRECT("Sheet1!"&ADDRESS(ROW(),COLUMN(),4))&"*",Sheet2!$A$1:$A$300,0)-1,0,COUNTA(Sheet2!$A:$A))
1 голос
/ 03 ноября 2011

Excel автоматически делает это, когда у вас есть вертикальный столбец элементов. Если вы выберете пустую ячейку ниже (или выше) столбца и начнете вводить текст, он выполнит автозаполнение на основе всего содержимого столбца.

0 голосов
/ 20 ноября 2017

Как и предлагали другие люди, вам нужно использовать комбинированный список.Тем не менее, в большинстве уроков показано, как настроить только один комбинированный список, и этот процесс довольно утомителен.

Поскольку я сталкивался с этой проблемой раньше, когда вводил большой объем данных из списка, я могу предложить вам использовать эту надстройку для автозаполнения .Это поможет вам создать поле со списком в любых ячейках, которые вы выберете, и вы можете определить список, который будет отображаться в раскрывающемся списке.

0 голосов
/ 28 июля 2017

Вот еще один вариант.Он работает, помещая 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
0 голосов
/ 07 августа 2016
=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. В столбце А заполните список данных.

  2. Создайте другое имя листа как FillData для создания нужного списка проверки данных.

  3. Введите первый алфавит и выберите, в зависимости от вашего типа появится выпадающее меню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...