Как сделать поиск по выпадающему списку в excel?

Содержание

Я собираюсь вам рассказать о фантастически полезном и эффектном приёме. Это одна из самых интересных вещей, которую мне доводилось видеть в Excel. Кроме того, она достаточно легко реализуется. Если вы разберётесь, как она работает, то вы сразу узнаете об Excel необычно много. Я постараюсь рассказать всё максимально подробно, последовательно и внятно.

Выпадающий список с контекстным поиском

Итак, речь пойдёт о выпадающем списке (так называемый combo box), в который встроена возможность динамического поиска по подстроке, которую пользователь вводит с клавиатуры. Посмотрите пример, в котором мы имеем топ 300 крупнейших городов России. На анимированной иллюстрации видно, как мы динамически сужаем список выбора, вводя подстроку «кр» или «ниж», экономя огромное количество времени. Более того, список меняется после ввода каждого нового символа! Выглядит чрезвычайно привлекательно и профессионально, не так ли? Давайте разбираться, как это устроено.

Файл примера

Скачать

Пошаговая инструкция

Предварительные замечания

В файле примера выпадающий список с поиском реализован сразу в двух вариантах: для обычного диапазона (лист Range) и для умной таблицы (лист Table). Мы будим эти варианты обсуждать одновременно, отмечая их различия.

Шаг 1. Готовим таблицу для списка

Подготовьте таблицу с четырьмя колонками: Город (или то, что вам нужно), Статус, Индекс, Фильтр. Заполните столбец Город значениями. В остальных трёх колонках будут формулы, которые мы обсудим ниже. Я всем рекомендую использовать умную таблицу, так как это значительно проще.

Шаг 2. Формулы для столбца Статус

На примере ячейки F2 рассмотрим формулу, аналогичную для всего столбца Статус (столбец F). Из F2 формулу можно протягивать вниз до конца, а в случае умной таблицы Excel это сделает за вас. Это также относится ко всем формулам, которые мы будем обсуждать в этой статье.

$B$2 — ячейка, с которой будет связан выпадающий список (добавляется на шаге 6). Что значит связано? Всё, что вы введёте в выпадающий список, тут же отразится в ячейке B2.

Формула ПОИСК вернёт ошибку, если содержимое B2 не найдено в $E2. ЕОШИБКА перехватит ошибку и вернёт ИСТИНА, если действительно была ошибка, и — ЛОЖЬ, если строка таки была найдена. Функция НЕ делает из истины ложь и наоборот (инверсирует результат). Таким образом, мы получим в этом столбце ИСТИНА, если подстрока найдена в текущем городе, и наоборот. Обратите внимание, что пустая подстрока содержится в любой строке, поэтому все ячейки столбца Статус имеют значения ИСТИНА, когда мы не ввели ещё ничего в B2.

Обычный диапазон Умная таблица

=НЕ( ЕОШИБКА( ПОИСК( $B$2; $E2) ) )

или

=NOT( ISERROR( SEARCH( $B$2; $E2) ) )

=НЕ( ЕОШИБКА( ПОИСК( $B$2; ) ) )

или

=NOT( ISERROR( SEARCH( $B$2; ) ) )

— на языке структурных формул умных таблиц это ссылка на ячейку столбца Город в той же строке, в которой находится сама формула. Поскольку ссылка идёт внутри таблицы, то имя самой таблицы в формуле можно не использовать. В остальном всё — тоже самое.

Шаг 3. Формула для столбца Индекс

Если B2 содержит подстроку поиска, то в столбце Статус не все ячейки примут значение ИСТИНА. Статус ИСТИНА будет только там, в чьи названия городов входит соответствующая подстрока. А в столбце Индекс мы рассчитываем номер по порядку для всех строк, которые содержат искомую подстроку. Например, на рисунке ниже B2 содержит «ни», что заставляет столбец Статус быть истинным у строк с городами Нижний Новгород, Калининград, Магнитогорск и т.д., а в столбце Индекс мы начинаем считать факты срабатываний в F: Нижний Новгород — первое срабатывание, Калининград — второе и так далее.

как сделать поиск по выпадающему списку в excel

Функция ЕСЛИ отсекает все значения в F, которые не равны ИСТИНА. Функция СЧЁТЕСЛИ подсчитывает количество значений ИСТИНА в F.

Обычный диапазон Умная таблица

=ЕСЛИ( $F2; СЧЁТЕСЛИ( $F$2:$F2; ИСТИНА ); «»)

или

=IF( $F2; COUNTIF( $F$2:$F2; TRUE ); «»)

=ЕСЛИ( ; СЧЁТЕСЛИ( $F$2:; ИСТИНА ); «»)

или

=IF( ; COUNTIF( $F$2:; TRUE ); «»)

Обратите внимание, что диапазон условия в СЧЁТЕСЛИ введен скользящий — вторая координата не закреплена — и во время протягивания она растёт пропорционально таблице. За счёт этого трюка мы получаем механизм подсчёта значения ИСТИНА. Например, 6-я строка будет подсчитывать ИСТИНУ по диапазону $F$2:$F6 (там одно значение — от Нижнего Новгорода), а 41-я строка будет подсчитывать ИСТИНУ уже по диапазону $F$2:$F41 (а там уже 2 значения — от Нижнего Новгорода и от Калининграда). Вот суть механизма. Это полезный приём, который стоит запомнить.

Шаг 4. Формула для столбца Фильтр

Теперь наша задача, опираясь на столбец Индекс, сформировать в столбце H отфильтрованный список городов, который необходимо показывать в выпадающем списке.

Обычный диапазон Умная таблица

=ЕСЛИОШИБКА( ИНДЕКС( стлГород; ПОИСКПОЗ( ЧСТРОК($G$2:$G2); стлИндекс; 0) ); «»)

или

=IFERROR( INDEX( стлГород; MATCH( ROWS($G$2:$G2); стлИндекс; 0) ); «» )

Обратите внимание на динамический именованный диапазон стлГород и стлИндекс, которые мы вынуждены создавать для случая диапазона, чтобы придать решению должный уровень универсальности. Техника, по которой созданы эти именованные диапазоны разобрана тут.

=ЕСЛИОШИБКА( ИНДЕКС( ; ПОИСКПОЗ( ЧСТРОК($G$2:); ; 0) ); «»)

или

=IFERROR( INDEX( ; MATCH( ROWS($G$2:); ; 0) ); «» )

Не путайте: — ссылка на весь столбец, а — ссылка на ячейку из этого столбца в текущей строке. Никакие дополнительные именованные диапазоны нам создавать нет никакой необходимости, так как мы пользуемся встроенным в умные таблицы сервисом при ссылке на столбцы.

Формула ЧСТРОК($G$2:$G2) используется для генерации последовательных номеров от 1 (для второй строки) до N (в строке N+1), равному количеству найденных подстрок. Просто генерируется диапазон соответствующего размера, а формула ЧСТРОК возвращает его высоту в строках.

Формула ПОИСКПОЗ ищет номер реальной строки, содержащий соответствующий индекс. Например, в столбце Фильтр мы видим Магнитогорск на третьей позиции, но в реальности он взят из E45, так как в G45 стоит цифра 3, которую мы и нашли через ПОИСКПОЗ. То есть ПОИСКПОЗ сказал нам, что Магнитогорск находится в 45-й строке, а извлекли мы его оттуда уже при помощи формулы ИНДЕКС.

Если же при извлечении возникает ошибка (текущая строка находится ниже строки N+1), то формула возвращает пустую строку. За это отвечает ЕСЛИОШИБКА.

Шаг 5. Создание именованных диапазонов

Обычный диапазон Умная таблица

Именованный диапазон стлГород

=Range!$E$2:ИНДЕКС( Range!$E:$E; СЧЁТЗ(Range!$E:$E) )

или

=Range!$E$2:INDEX( Range!$E:$E; COUNTA(Range!$E:$E) )

Именованный диапазон стлИндекс

=Range!$G$2:ИНДЕКС( Range!$G:$G; СЧЁТЗ(Range!$G:$G) )

или

=Range!$G$2:INDEX( Range!$G:$G; COUNTA(Range!$G:$G) )

Именованный диапазон стлФильтр

=Range!$H$2:ИНДЕКС( Range!$H:$H; СЧЁТЗ(Range!$H:$H) )

или

=Range!$H$2:INDEX( Range!$H:$H; COUNTA(Range!$H:$H) )

Именованный диапазон DDL_Range

=Range!$H$2:ИНДЕКС( стлФильтр; МАКС(стлИндекс) )

или

=Range!$H$2:INDEX( стлФильтр; MAX(стлИндекс) )

Именованный диапазон DDL_Table

=Table!$H$2:ИНДЕКС( tblData; МАКС(tblData) )

или

=Table!$H$2:INDEX( tblData; MAX(tblData) )

tblData — имя умной таблицы

Именованный диапазон DDL_Fake

=DDL_Table

Именованный диапазон DDL_Fake, как видите, напрямую ссылается на DDL_Table и нужен для того, чтобы обмануть элемент управления ComboBox21, так как он не умеет работать с ИД, ссылающимися на умную таблицу.

DDL_Range и DDL_Table это диапазоны, которые формируются на базе значений столбца Фильтр без пустых строк. Эти ИД указываются в свойствах ListFillRange выпадающих списков (DDL_Table — через DDL_Fake).

как сделать поиск по выпадающему списку в excel

Шаг 6. Вставляем Combo box на лист

На ленте Разработчик в группе Элементы управления через кнопку Вставить выберите элемент управления ActiveX Поле со списком и вставьте его на лист.

как сделать поиск по выпадающему списку в excel

Далее:

  • Нажмите кнопку Режим конструктора (предварительно убедитесь, что вставленный элемент управления активен)

  • Нажмите кнопку Свойства на ленте

  • Отредактируйте свойства в соответствии с рисунком:

    • Поле AutoWordSelect должно быть равно False
    • Поле LinkedCell сделайте равным B2
    • Поле ListFillRange должно быть либо DDL_Range для обычного диапазона (лист Range), либо DDL_Fake для умной таблицы (лист Table).
    • Поле MatchEntry = 2 — fmMatchEntryNone

как сделать поиск по выпадающему списку в excel

Шаг 7. Модификация события Change для элементов Поле со списком

Ну и изюминка нашего приёма, то, что заставляет Поле со списком показывать нам обновленный список выбора после каждого изменения строки ввода, — событие Change этого элемента управления, которое переприсваивает свойство ListFillRange и вызывает событие раскрытия списка DropDown.

Вот и всё!

P.S. К сожалению, не я придумал такую крутую штуку. Это сделал индийский товарищ Sumit Bansal, решение которого я лишь немного оптимизировал (исправил VBA событие — у него оно почему-то было привязано к GotFocus, что всё портило, и сократил формулы).

Читайте также:

  • Создание выпадающего списка в ячейке

  • Каскадные выпадающие списки

  • Универсальные динамические каскадные выпадающие списки без VBA!

  • Каскадные комбинированные списки

  • Динамические каскадные списки на основе сводных таблиц

Привет!

В Одессе сильная жара, и меня ждет море. Море работы. Я разработал такой вот выпадающий список с поиском — как в Гугле — для Экселя.

как сделать поиск по выпадающему списку в excel

Если ты не знаешь, что такое выпадающие списки, не беда. В Экселе их можно найти по адресу:

Данные → Проверка данных… Выбор значений из списка.

Ты получишь следующий результат. В ячейке с проверкой данных появится стрелка, при нажатии на которую выпадет список возможных значений.

как сделать поиск по выпадающему списку в excel

Чего склонен ожидать пользователь от такого списка?

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

Предлагаю решение, которое поможет тебе справляться с большими списками. Решение использует VBA с использованием пользовательской формы. Далее я пошагово расскажу, как у себя настроить то же. Но сперва предлагаю

скачать пример с готовым фильтром

, на базе которого ты можешь настроить свой шаблон.

Немного кода…

Работаем в редакторе VBA. Если ты раньше там не бывал, не бойся. В этом нет ничего страшного!

Нажми + для открытия редактора кода. Интерфейс его весьма приятный, он не менялся, наверное, уже лет 20. Слева нажми правой кнопкой мыши по элементам текущей книги и нажми Insert > Module.

как сделать поиск по выпадающему списку в excel

Итак, в обычный модуль добавь следующий код:

 Option Explicit Const minW = 170 Const minH = 15 Public NamedRange       As String Public LinkedCell       As Range Public List             As Range Public L                As Long Public T                As Long Public W                As Long Public H                As Long Public CodeChange       As Boolean   Private Declare Function FindWindow Lib "user32" _ Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long   Private Declare Function GetWindowLong Lib "user32" _ Alias "GetWindowLongA" ( _ ByVal hwnd As Long, _ ByVal nIndex As Long) As Long   Private Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" (ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long   Private Declare Function DrawMenuBar Lib "user32" ( _ ByVal hwnd As Long) As Long  Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDC As Long) As Long Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long Private Const HWND_DESKTOP As Long = 0 Private Const LOGPIXELSY As Long = 90 Private Const LOGPIXELSX As Long = 88  Const TWIPSPERINCH = 1440  Private Declare Function SystemParametersInfo Lib "user32" _       Alias "SystemParametersInfoA" _     (ByVal uAction As Long, _       ByVal uParam As Long, _       lpvParam As Any, _       ByVal fuWinIni As Long) As Long  Sub ShowForm()     If UserForm1.Caption = "UserForm1" Then _     UserForm1.Show ' show the form End Sub  Sub ButtonLaunch() ' Change Range(...) to yours Dim Target      As Range On Error Resume Next Set Target = ActiveCell If Intersect(Target, Range("B4:B500")) _     Is Nothing Or Target.Cells.Count > 1 Then     Exit Sub End If SetList Call DetectDimentions(Target) Call SetLinkedCell(Target) ShowForm End Sub  Sub DetectDimentions(Ran As Range) Dim S       As Shape Dim C       As Range Dim TwX     As Long Dim TwY     As Long Dim CorrX   As Long Dim CorrY   As Long Dim ScrRow  As Long Dim ScrCol  As Long Dim Cls     As Range Dim Ros     As Range Dim Zoom    As Integer  TwX = TwipsPerPixelX TwY = TwipsPerPixelY Set C = Cells(1, 1) Set S = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 0, 0, 1, 1) S.Top = C.Top S.Left = C.Left  ' find correction Zoom = ActiveWindow.Zoom ActiveWindow.Zoom = 100 ScrRow = ActiveWindow.ScrollRow ScrCol = ActiveWindow.ScrollColumn If ActiveWindow.ScrollRow > 1 Then Set Cls = Range(Cells(1, 1), Cells(ScrRow - 1, 1)) CorrY = Cls.Height * 20 / TwX End If If ActiveWindow.ScrollColumn > 1 Then Set Ros = Range(Cells(1, 1), Cells(1, ScrCol - 1)) CorrX = Ros.Width * 20 / TwX End If  With ActiveWindow     L = .PointsToScreenPixelsX(S.Left) + CorrX     T = .PointsToScreenPixelsY(S.Top) + CorrY End With ActiveWindow.Zoom = Zoom L = L * TwX / 20 T = T * TwY / 20  With Ran     W = .Width     If W < minW Then W = minW     H = .Height     If H < minH Then H = minH End With  S.Delete  End Sub  Sub SetLinkedCell(Target As Range)     Set LinkedCell = Target End Sub  Sub SetList() NamedRange = "Regions" On Error Resume Next     Set List = Range(NamedRange) If Err.Number  0 Then     MsgBox "Диапазона  не существует =("     End End If End Sub  Public Function InList(Find As String, List As Range)     InList = Application.Match(Find, List, 0)     If IsError(InList) Then InList = False End Function   Sub PopulateList(CB As MSForms.ListBox, List As Range, CBval As String)     Dim Cel     As Range     CB.Clear     If CBval = "" Or InList(CBval, List) Then         For Each Cel In List             CB.AddItem Cel         Next Cel     Else         CBval = UCase(CBval)         For Each Cel In List             If InStr(1, UCase(Cel), CBval) Then _                 CB.AddItem Cel         Next Cel     End If End Sub  Sub RemoveCaption(objForm As Object)           Dim lStyle          As Long     Dim hMenu           As Long     Dim mhWndForm       As Long           If Val(Application.Version) < 9 Then         mhWndForm = FindWindow("ThunderXFrame", objForm.Caption) 'XL97     Else         mhWndForm = FindWindow("ThunderDFrame", objForm.Caption) 'XL2000+     End If     lStyle = GetWindowLong(mhWndForm, -16)     lStyle = lStyle And Not &HC00000     SetWindowLong mhWndForm, -16, lStyle     DrawMenuBar mhWndForm       End Sub  Public Function TwipsPerPixelX()   Dim lngDC As Long     lngDC = GetDC(HWND_DESKTOP)   TwipsPerPixelX = TWIPSPERINCH / GetDeviceCaps(lngDC, LOGPIXELSX)   ReleaseDC HWND_DESKTOP, lngDC End Function   Public Function TwipsPerPixelY()   Dim lngDC As Long     lngDC = GetDC(HWND_DESKTOP)   TwipsPerPixelY = TWIPSPERINCH / GetDeviceCaps(lngDC, LOGPIXELSY)   ReleaseDC HWND_DESKTOP, lngDC End Function 

В этом коде найди строку NamedRange = «Regions» и слово Regions замени на свой диапазон. Это может быть адрес диапазона, например «Лист1!A1:A200», это может быть имя диапазона, как в моем случае.

Так же в строке

If Intersect(Target, Range(«B4:B500»))

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

B4:B500

на адрес своего диапазона. Этот адрес может не содержать имени листа, т.к. всегда используется текущий лист.

Дальше нужно вставить форму с двумя элементами управления: TestBox и ListBox.

Там же в редакторе кода вставляешь форму: Insert > UserForm. И на нее простыми кликами мыши переносишь TestBox и ListBox. Ты их можешь разместить как угодно. При запуске формы мы их разместим правильно.

как сделать поиск по выпадающему списку в excel

Теперь пора вставлять код формы. Выдели саму форму и нажми . Это перенесет тебя в окно с кодом самой формы. В это окно вставь код:

 Const ListBoxH = 100 Option Explicit Private Sub ListBox1_Change() If ListBox1.ListIndex > -1 Then     If ListBox1.Value  TextBox1.Value Then         CodeChange = True         TextBox1.Value = ListBox1.Value     End If End If End Sub Sub EndForm()     LinkedCell = ListBox1.Value     Unload Me End Sub Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)     EndForm End Sub  Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Select Case KeyCode Case 13     EndForm Case 38     If ListBox1.ListIndex = 0 Then TextBox1.SetFocus End Select End Sub  Private Sub TextBox1_Change() If CodeChange Then     CodeChange = False Else     LinkedCell.Value = TextBox1.Value     Call PopulateList(UserForm1.ListBox1, List, TextBox1.Value) End If End Sub  Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Select Case KeyCode Case 18     ListBox1.Value = "" Case 40     If ListBox1.ListCount > 0 Then         ListBox1.ListIndex = 0         ListBox1.SetFocus     End If End Select End Sub  Private Sub UserForm_Terminate()     If InList(LinkedCell.Value, List) = False Then         LinkedCell.Value = ""     End If End Sub Private Sub UserForm_Initialize()     Call RemoveCaption(Me) End Sub Private Sub UserForm_Activate()     With UserForm1         .Top = T         .Left = L         .Width = W + 4         .Height = H + ListBoxH - 4     End With     With ListBox1         .Top = H         .Left = 0         .Width = W         .Height = ListBoxH     End With     With TextBox1         .Top = 0         .Left = 0         .Width = W         .Height = H + 5         .Value = LinkedCell.Value     End With     If LinkedCell.Value = "" Then _     Call PopulateList(UserForm1.ListBox1, List, TextBox1.Value) End Sub    

Дальше ты почти готов к использованию списков с поиском. Тебе нужно создать сам список, из которого будут выпадать значения. Теперь стань в любую ячейку, которая находится внутри целевого диапазона и нажми +   и в списке макросов найди и запусти макрос:

ButtonLaunch.

И еще для удобства пользования ты можешь привязать макрос, который запускает код к кнопке или картинке.

И еще ты можешь заставить код срабатывать автоматически. Для этого в код целевого листа вставь следующее:

 Option Explicit  Private Sub Worksheet_SelectionChange(ByVal Target As Range) ' Change Range(...) to yours If Target.Columns.Count > 1 Then Exit Sub If Target.Rows.Count > 1 Then Exit Sub If Intersect(Target, Range("B4:B500")) Is Nothing Then     Exit Sub End If SetList Call DetectDimentions(Target) Call SetLinkedCell(Target) ShowForm End Sub  

В этом последнем коде так же замени диапазон. В строке

If Intersect(Target, Range(«B4:B500»))

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

B4:B500

на адрес своего диапазона.

***

Сложно мне было достичь такого результата… Что я только не перепробовал, пока не пришел к такому решению. И оно, разумеется, не идеально…

Привет разработчикам

В Экселе, оказывается, не все так просто, как на самом деле. При разработке данного проекта я пробовал использовать следующие средства:

Элементы ActiveX.  Результат: работают они красивее, чем формы, к тому же они самостоятельны (не привязаны к оболочке) и являются  частью рабочего пространства т.е. ячеек Экселя. Поэтому связанные списки у меня появлялись прямо в ячейках. Но при работе с ActiveX, оказалось, что они сплошь глючные, иногда неадекватно показывают событие выпадения самого списка. И когда, преодолев все сложности, я дописал код, оказалось, что он работает нестабильно. На более слабой машине, чем моя, Эксель пока последней 2013 версии вылетал каждый раз при попытке создания списка.

как сделать поиск по выпадающему списку в excel

Элементы управления формы.

Они, как я узнал на одном из форумов, более приятны в обращении, но оказалось, что выпадающий список форм не обладает всем функционалом, который мне был необходим. Так что это пока отпадает.

Выпадающий список в форме. Это уже ближе. С формой у меня есть отдельная боль — ее очень нелегко разместить в нужном месте экрана, на что ушло процентов 80 всего кода и столько же усилий. Но главное, что выпадающий список в стандартной форме Экселя тоже работал глючно. А именно, при попытке заставить его выпадать, он часто выдавал непредсказуемый результат на экран.

Сочетание элементов управления в форме. Наконец, я пришел к двум связанным элементам формы, которые симулируют один выпадающий список, а именно это простое текстовое поле (TestBox) и простой список(ListBox). Именно этот вариант привел меня к решению.

Решение это мне не нравится до сих пор: уж слишком оно громоздкое и неизящное. Слишком много усилий ради такой простой функции. Что ж, будем искать еще варианты. Но, тем не менее, приведенное выше решение работает стабильно и не приводит к перезагрузке программы (надеюсь, что это так). Поэтому предлагаю тебе адаптировать его.

Идея!

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

как сделать поиск по выпадающему списку в excel

В примере выше, который я как раз закончил делать, ты видишь динамический список, который появляется непосредственно на месте ячейки, которую мы форматируем. Замечу несколько моментов:

  1. Во-первых, качай пример себе и тестируй, адаптируй, развивай.
  2. Второе. Как его адаптировать. В коде листа есть обработчик событий, и в нем нужно заменить во второй строке Const DropDownRange = «B4:B500» на свой диапазон. С этим проблем не должно возникнуть. Дальше в модуле есть код, который обрабатывает большинство вещей. В нем ты тоже замени кое-что, а именно в строке Public Const NamedRange = «Regions» поменяй «Regions» на полный адрес диапазона со значениями для проверки. Тут удобнее использовать именованный диапазон, как в моем примере, но можно и прописать полный адрес, например Лист1!А1:А25
  3. Третье. Данным списком удобно пользоваться. Он работает шустро. Он отвечает на некоторые события: после редактирования текста меняется список, это само собой. Но еще ты можешь после ввода чего-нибудь нажать на стрелки Вниз — Вверх, при этом выделятся значения внутри списка, и потом нажать или ввести выбранное значение. Это, по-моему, совпадает с ожидаемым поведением элементов управления. Тут пока есть небольшая недоработка, которую ты легко заметишь, протестировав пример. А именно если в текстовое поле ничего не введено, то оно не реагирует на нажатие стрелок. Но с этим можно жить, а к тому же, думаю, пытливый ум найдет решение.
  4. Данный список не проверяет жестко введенный текст в ячейку, но с этим можно легко справиться, например, дополнительно сделав проверку данных по диапазону.

Это решение, по-моему, максимально отвечает поставленной задаче. Тут есть еще простор для улучшений, но начало задано. Смысл работы основывается на нескольких идеях:

Идея первая. Сделай качественную подделку. Можно подделать элементы управления, если их создавать прямо сверху ячейки, которую выделил пользователь.

Идея вторая. Использовать элементы ActiveX и элементы формы Ввиду множества проделанных неудачных опытов, я пришел к выводу, что напрямую добиться результата нельзя. Но можно отдельно использовать элемент со списком ListBox, и элемент поле TextBox, и заставить из совместно работать как ComboBox — выпадающий список. Повторюсь, что напрямую это сделать я не смог — уж очень много глюков обнаружилось. И вот я в решении соединил 2 элемента управления, причем один из них — ActiveX (поле), а второй — элемент формы (список). Это дало более стабильный результат, но при этом изящный и более легковесный, чем решение с пользовательскими формами. К тому же мне повезло найти пример с обработкой нажатия пользователем кнопок (KeyCode) при изменении Поля TextBox. Это дало возможность сделать список более дружелюбным к действиям пользователя.

Идея третья. Что еще можно сделать Еще можно сделать так, чтобы пользователь смог вручную отключать опцию выпадения списка. Дело в том, что это может быть слишком навязчиво и неудобно при форматировании таблицы в целом. Тут оставляю пробел и специально не дорабатываю код: это довольно просто сделать и способов множество, так что оставляю эту работу за тобой.

И еще, разумеется, можно повысить дружелюбность списков, и добавить жесткую проверку данных, которая не даст ошибиться при вводе. Но это потом.

***

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

Зависимый выпадающий список позволяет сделать трюк, который очень часто хвалят пользователи шаблонов Excel. Трюк, который делает работу проще и быстрее. Трюк, благодаря которому ваши формы будут удобны и приятны.

Пример создания зависимого выпадающего списка в ячейке Excel

Пример использования зависимого выпадающего списка для создания удобной формы заполнения документов, с помощью которых продавцы заказывали товары. Из всего ассортимента они должны были выбрать те продукты, которые они собирались продать.

Каждый продавец сначала определял товарную группу, а затем конкретный товар из этой группы. Форма должна включать полное имя группы и определенный индекс товара. Поскольку набирать это вручную было бы слишком трудоемким (и раздражающим) занятием, я предложил очень быстрое и простое решение — 2 зависимых выпадающих списка.

Первым был список всех категорий продуктов, второй — список всех продуктов, находящихся в выбранной категории. Поэтому я создал выпадающий список, зависимый от выбора, сделанного в предыдущем списке (здесь вы найдете материал о том, как создать два зависимых раскрывающихся списка).

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

Так, например, если мы выберем категорию Развлечения, то в списке подкатегорий должно быть: Кинотеатр, Театр, Бассейн. Очень быстрое решение, если в своем домашнем бюджете вы хотите проанализировать более подробную информацию.

Список категорий и подкатегорий в зависимом выпадающем списке Excel

Признаюсь, что в предложенном мной варианте домашнего бюджета я ограничиваюсь только категорией, поскольку для меня такого разделения расходов вполне достаточно (название расходов / доходов рассматривается как подкатегория). Однако, если вам нужно разделить их на подкатегории, то метод, который я описываю ниже, будет идеальным. Смело используйте!

А конечный результат выглядит следующим образом:

Зависимый выпадающий список подкатегорий

Для того чтобы этого достичь, необходимо сделать немного другую таблицу данных, чем если бы мы создавали один раскрывающийся список. Таблица должна выглядеть так (диапазон G2:H15):

Рабочая исходная таблица Excel

В эту таблицу необходимо ввести категорию и рядом с ней ее подкатегории. Имя категории должно повторяться столько раз, сколько есть подкатегорий. Очень важно, чтобы данные были отсортированы по столбцу Категория. Это будет чрезвычайно важно, когда позже будем писать формулу.

Можно было бы также использовать таблицы с первого изображения. Разумеется, формулы были бы разными. Однажды даже я нашел в сети такое решение, но оно мне не понравилось, потому что там была фиксированная длина списка: а значит, иногда список содержал пустые поля, а иногда и не отображал все элементы. Конечно, я могу избежать этого ограничения, но признаюсь, что мне больше нравится мое решение, поэтому к тому решению я больше не возвращался.

Ну хорошо. Теперь, по очереди я опишу шаги создания зависимого выпадающего списка.

1. Имена диапазонов ячеек

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

Присвоим имена двум диапазонам. Список всех категорий и рабочий список категорий. Это будут диапазоны A3:A5 (список категорий в зеленой таблице на первом изображении) и G3:G15 (список повторяющихся категорий в фиолетовой рабочей таблице).

Для того чтобы назвать список категорий:

  1. Выберите диапазон A3:A5.
  2. В поле имени (поле слева от строки формулы) введите название «Категория».
  3. Подтвердите с помощью клавиши Enter.

Такое же действие совершите для диапазона рабочего списка категорий G3:G15, который вы можете вызвать «Рабочий_Список». Этот диапазон мы будем использовать в формуле.

2. Создание раскрывающегося списка для категории

Это будет просто:

  1. Выберите ячейку, в которую вы хотите поместить список. В моем случае это A12.
  2. В меню «ДАННЫЕ» выберите инструмент «Проверка данных». Появится окно «Проверка вводимых значений».
  3. В качестве типа данных выберите «Список».
  4. В качестве источника введите: =Категория (рисунок ниже).
  5. Подтвердите с помощью OK.

Проверка вводимых значений – Категория.

Результат следующий:

Раскрывающийся список для категории.

3. Создание зависимого выпадающего списка для подкатегории

Сейчас будет весело. Создавать списки мы умеем — только что это сделали для категории. Только единственный вопрос: «Как сказать Excelю выбрать только те значения, которые предназначены для конкретной категории?» Как вы, наверное, догадываетесь, я буду использовать здесь рабочую таблицу и, конечно же, формулы.

Начнем с того, что мы уже умеем, то есть с создания раскрывающегося списка в ячейке B12. Поэтому выберите эту ячейку и нажмите «Данные» / «Проверка данных», а в качестве типа данных — «Список».

В источник списка введите следующую формулу:

Вид окна «Проверка вводимых значений»:

Проверка вводимых значений для подкатегории в зависимом выпадающем списке

Как видите, весь трюк зависимого списка состоит в использовании функции СМЕЩ. Ну хорошо, почти весь. Помогают ей функции ПОИСКПОЗ и СЧЕТЕСЛИ. Функция СМЕЩ позволяет динамически определять диапазоны. Вначале мы определяем ячейку, от которой должен начинаться сдвиг диапазона, а в последующих аргументах определяем его размеры.

В нашем примере диапазон будет перемещаться по столбцу Подкатегория в рабочей таблице (G2:H15). Перемещение начнем от ячейки H2, которая также является первым аргументом нашей функции. В формуле ячейку H2 записали как абсолютную ссылку, потому что предполагаю, что мы будем использовать раскрывающийся список во многих ячейках.

Поскольку рабочая таблица отсортирована по Категории, то диапазон, который должен быть источником для раскрывающегося списка, будет начинаться там, где впервые встречается выбранная категория. Например, для категории Питание мы хотим отобразить диапазон H6:H11, для Транспорта — диапазон H12: H15 и т. д. Обратите внимание, что все время мы перемещаемся по столбцу H, а единственное, что изменяется, это начало диапазона и его высота (то есть количество элементов в списке).

Начало диапазона будет перемещено относительно ячейки H2 на такое количество ячеек вниз (по числу), сколько составляет номер позиции первой встречающейся категории в столбце Категория. Проще будет понять на примере: диапазон для категории Питание перемещен на 4 ячейки вниз относительно ячейки H2 (начинается с 4 ячейки от H2). В 4-ой ячейке столбца Подкатегория (не включая заголовок, так как речь идет о диапазоне с именем Рабочий_Список), есть слово Питание (его первое появление). Мы используем этот факт собственно для определения начала диапазона. Послужит нам для этого функция ПОИСКПОЗ (введенная в качестве второго аргумента функции СМЕЩ):

Высоту диапазона определяет функция СЧЕТЕСЛИ. Она считает все встречающиеся повторения в категории, то есть слово Питание. Сколько раз встречается это слово, сколько и будет позиций в нашем диапазоне. Количество позиций в диапазоне — это его высота. Вот функция:

Конечно же, обе функции уже включены в функцию СМЕЩ, которая описана выше. Кроме того, обратите внимание, что как в функции ПОИСКПОЗ, так и в СЧЕТЕСЛИ, есть ссылка на диапазон названный Рабочий_Список. Как я уже упоминал ранее, не обязательно использовать имена диапазонов, можно просто ввести $H3: $H15. Однако использование имен диапазонов в формуле делает ее проще и легко читаемой.

Вот и все:

Скачать пример зависимого выпадающего списка в Excel

Одна формула, ну не такая уж и простая, но облегчающая работу и защищает от ошибок при вводе данных!

Читайте также: Связанные выпадающие списки и формула массива в Excel

Два варианта использования этого трюка я уже представил. Интересно, как вы его будете использовать?

Выпадающие списки в Microsoft Excel незаменимы при создании объемных таблиц, работе с базами данных. В чем же конкретно заключается удобство этого инструмента?
• Если при заполнении таблицы некоторые данные периодически повторяются, нет необходимости каждый раз вбивать вручную постоянное значение — например, наименование товара, месяц, ФИО сотрудника. Достаточно один раз закрепить повторяющийся параметр в списке.
• Ячейки списка защищены от введения посторонних значений, что снижает вероятность допустить ошибку в работе.
• Таблица, оформленная таким образом, выглядит аккуратно.
В статье я расскажу, как в Экселе сделать выпадающий список в ячейке и как с ним работать.

Формирование выпадающего списка

Один из распространенных примеров использования выпадающих списков – интернет-магазины, в которых вся продукция распределена по категориям – такая структура облегчает пользователям поиск по сайту.
Рассмотрим наглядно:

Все товары, перечисленные в таблице, нужно отнести к категории «Одежда». Чтобы создать выпадающий список для этого перечня, потребуется выполнить следующие действия:
• Выделить любую ячейку, в которой будет создан список.
• Зайти на вкладку «Данные», в раздел «Проверка данных».
• В открывшемся окне выбрать вкладку «Параметры», а в перечне «Тип данных» вариант – «Список».
• В появившейся строке необходимо указать все имеющиеся наименования списка. Сделать это можно двумя способами: выделить мышкой диапазон данных в таблице (в примере – ячейки А1-А7) или вбить названия вручную через точку с запятой.
• Выделить все ячейки с нужными значениями, и, щелкнув правой кнопкой мыши, выбрать в контекстном меню пункт «Присвоить имя».
• В строке «Имя» указать наименование списка – в данном случае, «Одежда».
• Выделить ячейку, в которой создан список, и вписать созданное имя в строку «Источник» со знаком «=» вначале.
Итоговый результат выглядит так. Это самый простой вариант выпадающего списка. В зависимости от версии Excel, действий может быть больше или меньше, но в целом, инструкция универсальна для любой программы.

Как добавлять значения в список

Иногда возникает необходимость дополнить уже имеющийся перечень. В раскрывающемся списке все новые пункты отображаются автоматически при добавлении. Однако чтобы связать диапазон ячеек с добавленным вновь элементом, список требуется оформить в виде таблицы. Для этого нужно выделить диапазон значений, найти на вкладке «Главная» пункт «Форматировать как таблицу» и выбрать любой понравившийся стиль, например:

В дальнейшем фиксированный список будет пополняться каждый раз при подстановке нового значения: