Связанные (зависимые) выпадающие списки

Способ 1. Функция ДВССЫЛ (INDIRECT)

Этот фокус основан на применении функции ДВССЫЛ (INDIRECT), которая умеет делать одну простую вещь - преобразовывать содержимое любой указанной ячейки в адрес диапазона, который понимает Excel. То есть, если в ячейке лежит текст "А1", то функция выдаст в результате ссылку на ячейку А1. Если в ячейке лежит слово "Маша", то функция выдаст ссылку на именованный диапазон с именем Маша и т.д. Такой, своего рода, "перевод стрелок" ;)

Возьмем, например, вот такой список моделей автомобилей Toyota, Ford и Nissan:

Связанные списки с ДВССЫЛ

Выделим весь список моделей Тойоты (с ячейки А2 и вниз до конца списка) и дадим этому диапазону имя Toyota на вкладке Формулы (Formulas) с помощью Диспетчера имен (Name Manager). Затем повторим то же самое со списками моделей Ford и Nissan, задав соответственно имена диапазонам Ford и Nissan.

При задании имён помните о том, что имена диапазонов в Excel не должны содержать пробелов, знаков препинания и начинаться обязательно с буквы. Поэтому если бы в одной из марок автомобилей присутствовал бы пробел (например Ssang Yong), то его пришлось бы заменить в ячейке и в имени диапазона на нижнее подчеркивание (т.е. Ssang_Yong).

Теперь создадим первый выпадающий список для выбора марки автомобиля. Выделите пустую ячейку (на картинке выше - зелёную) и нажмите кнопку Проверка данных (Data Validation) на вкладке Данные (Data). Затем из выпадающего списка Тип данных (Allow)  выберите вариант Список (List) и в поле Источник (Source) выделите ячейки с названиями марок (желтые ячейки в нашем примере). После нажатия на ОК первый выпадающий список готов.

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

=ДВССЫЛ(F2)

где F2 - адрес ячейки с первым выпадающим списком (замените на свой).

Все. После нажатия на ОК содержимое второго списка будет выбираться по имени диапазона, выбранного в первом списке.

Минусы такого способа:

  • Надо руками создавать много именованных диапазонов (если у нас много марок автомобилей).
  • В качестве вторичных (зависимых) диапазонов не могут выступать динамические диапазоны задаваемые формулами типа СМЕЩ (OFFSET). Для первичного (независимого) списка их использовать можно, а вот вторичный список должен быть определен жестко, без формул. Однако, это ограничение можно обойти, создав справочник соответствий марка-модель (см. Способы 3 и 4).
  • Имена вторичных диапазонов должны совпадать с элементами первичного выпадающего списка. Т.е. если в нем есть текст с пробелами, то придется их заменять на подчеркивания с помощью функции ПОДСТАВИТЬ (SUBSTITUTE), т.е. формула будет выглядеть как:

=ДВССЫЛ(ПОДСТАВИТЬ(F2;" ";"_"))

Способ 2. Умные таблицы

Этот подход очень похож на предыдущий, но использует вместо именованных диапазонов - "умные" динамические таблицы, которые будут выступать источником данных для вторичного списка:

Связанные списки на умных таблицах и ДВССЫЛ

Таким образом, мы:

  1. Сначала преобразуем наши справочники в "умные" таблицы, используя сочетание клавиш Ctrl+T или команду Главная - Форматировать как таблицу (Home - Format as Table) и
  2. Даём им имена (Фрукты, Овощи, Зелень) на вкладке Конструктор (Design) в поле Имя таблицы (Table Name).
  3. Создаём первый и второй (связанный) выпадающие списки точно так же, как в предыдущем способе с функцией ДВССЫЛ (INDIRECT).
Главным плюсом и отличием такого способа является возможность легко добавлять новые товары в каждую категорию - динамическая "умная" таблица автоматически расширится, и нам не придется вручную исправлять ссылку на диапазон (как это требуется в предыдущем способе).

Способ 3. Отсортированный справочник

Этот способ требует наличия отсортированного списка соответствий марка-модель вот такого вида:

Связанные списки на отсортированном справочнике

Для создания первичного выпадающего списка можно марок можно воспользоваться обычным способом, описанным выше, т.е.  выбрать на вкладке Данные (Data) команду Проверка данных (Data validation) и указать в качестве источника жёлтые ячейки с марками

А вот для зависимого списка моделей придется создать именованный диапазон с функцией СМЕЩ (OFFSET), который будет динамически ссылаться только на ячейки моделей определенной марки. Для этого:

  • Нажмите сочетание клавиш Ctrl+F3 или воспользуйтесь кнопкой Диспетчер имен (Name manager) на вкладке Формулы (Formulas).
  • Создайте новый именованный диапазон с любым именем (например Модели) и в поле Ссылка (Reference) в нижней части окна введите руками следующую формулу:

=СМЕЩ($A$1;ПОИСКПОЗ($G$7;$A:$A;0)-1;1;СЧЁТЕСЛИ($A:$A;$G$7);1)

=OFFSET($A$1;MATCH($G$7;$A:$A;0)-1;1;COUNTIF($A:$A;$G$7);1)

Ссылки должны быть абсолютными (со знаками $). После нажатия Enter к формуле будут автоматически добавлены имена листов - не пугайтесь.

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

=СМЕЩ(начальная_ячейка; сдвиг_вниз; сдвиг_вправо; высота_диапазона_в_строках; ширина_диапазона_в_столбцах)

Таким образом:

  • начальная ячейка - берем первую ячейку нашего списка, т.е. А1
  • сдвиг_вниз - нам считает функция ПОИСКПОЗ (MATCH), которая, попросту говоря, выдает порядковый номер ячейки с выбранной маркой (G7) в заданном диапазоне (столбце А)
  • сдвиг_вправо = 1, т.к. мы хотим сослаться на модели в соседнем столбце (В)
  • высота_диапазона_в_строках  - вычисляем с помощью функции СЧЕТЕСЛИ (COUNTIF), которая умеет подсчитать количество встретившихся в списке (столбце А) нужных нам значений - марок авто (G7)
  • ширина_диапазона_в_столбцах = 1, т.к. нам нужен один столбец с моделями

В итоге должно получиться что-то вроде этого:

linked_dropdowns4.gif

Осталось добавить выпадающий список на основе созданной формулы к ячейке G8. Для этого:

  • выделяем ячейку G8 
  • выбираем на вкладке Данные (Data) команду Проверка данных (Data validation)
  • из выпадающего списка выбираем вариант проверки Список (List) и вводим в качестве Источника (Source) знак равно и имя нашего диапазона, т.е.  =Модель

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

Способ 4. Неотсортированный справочник

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

Связанный выпадающий список по неотсортированному справочнику

Первый уровень выпадающего списка (диапазон А2:А14 на рисунке выше) здесь делается классическим образом через команду Данные - Проверка данных - Список (Data - Validation - List) и в качестве источника указать зелёные ячейки с названиями категорий.

А для связанных выпадающих списков во втором столбце (B2:B14) в поле Источник (Source) мы используем хитрую формулу:

=СМЕЩ($E$2;1;ПОИСКПОЗ(A2;$E$2:$G$2;0)-1;СЧЁТЗ(СМЕЩ($E$2;1;ПОИСКПОЗ(A2;$E$2:$G$2;0)-1;10;1));1)

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

 Ссылки по теме




Страницы: 1  2  3  4  
11.05.2014 15:28:59
Не знаю, коллеги, замечали ли вы. Но при создании связанного списка для "умной" таблицы при задании элемента первичного списка, который так же вносится в эту таблицу (т.е. "является" столбцом, например, Расходы[Группа затрат]) для корректного ввода необходимо в формуле указывать Расходы[@[Группа затрат]] - тогда зависимый список будет корректно отрабатывать каждую строку в таблице. Иначе идет жесткая привязка к первому элементу таблицы в столбце, содержащем элемент первого списка.
19.05.2014 09:54:27
Спасибо за статью, очень понятно объясняет всё, но что делать если я хочу сделать так, что бы список был зависим от результата нескольких списков?....то есть к примеру (речь идёт о мебельной сфере) сейчас я могу выбрать "фабрику", и у меня будут отражаться "коллекции" этой фабрики, а я хочу, что бы я ещё мог выбрать "стиль"...к примеру "классика", и тогда в рамках этой фабрики отражались бы только те коллекции, которые производят классическую мебель. Помогите пожалуйста!))
21.06.2014 17:23:04
Подскажите пожалуйста, а как сделать зависимость цвета, т.е например,  есть выпадающий список с тремя значениями: А, В и С. при выборе из списка А - ячейка со значением должна окрашиваться в красный цвет, с В - в синий, а с С - в зеленый? Спасибо!
27.06.2014 18:07:16
Николай, что скажете о таком способе создания связанных динамических списков?
http://www.contextures.com/xlDataVal15.html
03.07.2014 17:48:30
А можно ли сделать, чтобы значения именованного списка отображались в определенном месте в таблице? Выбрал из списка а значения отобразились ниже.
19.07.2014 17:08:02
2 варианта: через элемент ActiveX - тогда значения будут отображаться в заданной ячейке, или через элемент форм "выпадающий список", тогда в заданной ячейке будет порядковый номер из списка, который можно через функцию ИНДЕКС использовать для получения значения.
08.07.2014 14:36:00
Господа!

у меня вопрос по выпадающим спискам. У меня есть центры и их коды, хотелось бы сделать так, что бы при выборе центра в одной ячейке, в соседней выпадал его код. С выпадающими списками ознакомился, впринципе, получается, но там надо ручками выбирать код есть ли возможность сделать, что бы при выборе центра, код появлялся самостоятельно, без второго выпадающего столбца?  
19.07.2014 17:01:59
если где-то есть список соответствия центр-код, то формула ВПР поможет
08.09.2014 06:23:20
Если код к каждому центру привязан свой (не у нескольких центров один код) , то легко при помощи функции ВПР
PS: Упс, не проскроллил страницу ниже, и не сразу увидел что ответ уже есть :-)
22.09.2014 15:00:06
Огромное спасибо!!!!
15.11.2014 10:07:55
Подскажите пожалуйста, раньше встречал вроде, а теперь не могу найти, мне нужна информация по связанным, динамическим, фильтрующимся по первым введенным буквам спискам.
20.11.2014 15:01:36
Добрый день!
Пытаюсь сделать Связанные (зависимые) выпадающие списки по варианту 2.

Почему-то для части списка формула СМЕЩ работает, но часть не работает с ошибкой ЗНАЧ!
Пож, подскажите, что делаю неправильно?
Хотела вложить файл с ошибкой, но как это сделать?
Спасибо!
Анжела
28.02.2015 23:30:23
Подскажите, а как создать зависимые выпадающие списки, чтобы данные брались с другого листа?

Заранее благодарю.
26.05.2015 16:04:04
Добрый день.
Есть ли какой способ создать выпадающий список в случае если (пример из способа 2) признаки в столбце А будут вразнобой?
Т.е. TOYOTA не с 1 по 7 строки, а вперемешку с FORD и NISSAN.
Отсортировать по возрастанию/убыванию не получается, т.к. вытаскиваю уникальные наименования из массива.
31.07.2015 10:52:20
Подскажите, пожалуйста.
По способу № 2 - у меня 4 марки. 3 марки по 10 моделей, и 1 марка с одной моделью.
И при выпадении списка моделей, для выбора всегда появляется 1 ячейка из чужого диапазона.
А при выборе 4 марки - вообще выбор модели пустой.
Что делать? Как исправить?
03.08.2015 09:15:25
Не видя вашего файла, сказать сложно.
Открывайте Диспетчер Имен на вкладке Формулы, выделяйте по очереди каждый именованный диапазон и щелкайте в формулу со СМЕЩ - если все правильно, то диапазон будет подсвечен на листе. Если не подсвечивает - значит в формуле косяк.
Здравствуйте.
Николай. Спасибо за статью и видеоурок.
У меня вопрос: " Как сделать, чтобы в выпадающем списке можно было выбирать слово по первым буквам ?"
Когда в списке 30 наименований утомительно искать.

Заранее благодарен за ответ.
24.08.2015 19:18:55
Здравствуйте. На моём сайте это рассматривалось.
24.08.2015 21:48:05
Если нужны не связанные списки, то можно использовать элемент ActiveX - 4-й способ в этой статье.
Спасибо за ответ.
01.09.2015 06:19:42
Здравствуйте!
Сделал выпадающий список по третьему способу с помощью данных из другой книги по формуле
=СМЕЩ([ИСТ.xlsm]номенклатор!$A$1;ПОИСКПОЗ('ЦЭКС (2)'!$F4;[ИСТ.xlsm]номенклатор!$A:$A;0);1;СЧЁТЕСЛИ([ИСТ.xlsm]номенклатор!$A:$A;'ЦЭКС (2)'!$F4);1)
Проблема в том, что при выборе первого выпадающего списка "Группа ТМЦ" во второй список "Товары"  добавляются данные со смещением в одну позицию, т.е. если в группе выбрано ГСМ, то во второй список попадают все значения с группы ГСМ со второй позиции и добавляется одна, первая, позиция со второй группы (з/ч к авто) и т.д.
06.10.2015 15:52:44
здравствуйте. подскажите, пожалуйста, как можно реализовать, что бы при выборе какого-то значения из первого выпадающего списка, это же значение выбиралось и из всех остальных выпадающих списков в этом столбце. но оставалась возможность изменения некоторых из них?

т.е. для примера (строк очень много. допустим машины с номерами. выпадающий список автоматически привод или ручной). большинство машин из 300 (допустим) у нас автоматы. и хотелось бы выбрав значение в первом списке - автомат получить его для всех остальных выпадающих списков столбца (тяжело щелкать каждый раз по 300). но допустим 5-7 из них ручные - вот их что бы можно было поменять в списке ручками.

можно такое реализовать как-то? спасибо огромное
16.10.2015 15:22:18
Николай, добрый день!
Спасибо за Ваши советы, очень познавательно и во многом помогают. Но сейчас у меня возникла проблема, которую прошу Вас мне помочь решить. Сейчас работаю на созданием опросного листа для моей скромной компании и зашел в тупик. У меня к Вам несколько вопросов:
1. вопрос как у меня, Вам уже задавали  вот здесь http://planetaexcel.ru/techniques/1/38/#532 , только вот я не разобрался с Вашим ответом:"Щелкаем правой по ярлычку листа со списками, выбираем команду Исходный текст и вставляем туда такой код:" - о каком ярлычке идет речь и где его найти?
2. я делаю связанные (зависимые) выпадающие списки (научился их делать из Вашего видео). Можно ли сделать такое: у Вас на видео от основного выдающего списка (овощи, фрукты, зелень) зависит только одна ячейка, в которой выбирается абрикос, огурец или лук, в зависимости от того, что выбрать в первой ячейке. А мне нужно, чтобы от основной ячейки было 2 отдельные зависимые ячейки. у меня не получается это сделать, потому что я написал название диапазону для первой зависимой ячейки, а для другой зависимой ячейки тот самый диапазон excel не принимает. Вообщем мне нужна такая цепочка: если в основной ячейке выпадающего списка выбрать овощи, то в первой зависимой ячейке будет картошка, помидор, огурец, а в другой зависимой ячейке будет, например название компаний, кто производит эти овощи, если выбрать в основной ячейке фрукты, то в первой зависимой ячейке будет перечень фруктов, а в другой - перечень компаний, кто производит эти фрукты.
3. Если у меня содержание ячеек в выпадающем списке состоит не из одного слова - овощи, а из 2 или более - свежие и вкусные овощи - тогда их нужно писать ТОЛЬКО через нижнее подчеркивание - свежие_и_вкусные_овощи - или есть какой то вариант их написать через пробел? ( если их записать через пробел, тогда я не могу записать название столбца(диапазона))
Спасибо Вам за внимание и помощь!
16.10.2015 18:42:52
Здравствуйте.
Вопрос по примеру.
Если выбрать сначала, например, ford и конкретную модель из связанного списка, а потом переключить, например, на nissan, то значение в связанном списке мгновенно не обновляется. Можно ли, чтобы связанный список обновлялся? Дело в том, что я хочу использовать данные списков в макросе, и если не будет обновления, то макрос получит не те данные на вход. Что посоветуете?
Спасибо.
30.10.2015 19:01:34
Добрый день!
Спасибо за Ваши советы, очень помогают. Вопрос как у меня, Вам уже задавали - http://planetaexcel.ru/techniques/1/38/#532 , только вот я не разобрался с Вашим ответом. Все хорошо работает только для одной строки таблицы. А в остальных все по прежнему - при изменении значения в первом поле, второе не очищается, а сохраняет старое значение. Подскажите, как нужно дописать макрос, чтобы он относился ко всем строкам таблицы.
Спасибо.
03.11.2015 08:25:38
подскажите а как сделать связанные выпадающие списки, с мульти выбором?
Николай,добрый день!
Огромное спасибо за сайт!
Подскажите пожалуйста,как увеличить высоту выпадающего списка,что бы было не 8 строк,а больше (например 30).
Спасибо!
19.01.2016 12:37:34
Использовать другой способ создания списка - например элемент ActiveX
25.12.2015 12:11:36
Добрый день!

Такая задача: есть два столбца с данными 1 - Компания (данные - список должностей), 2 - Подрядчик. Необходимо, чтобы при выборе из выпадающего списка Компании в соседней ячейке также из списка можно было выбрать должность (это сделано), но при выборе Подрядчика ячейка рядом оставалась пустой (текстовой), чтобы можно было заносить данные вручную (т.е. без выпадающего списка). Возможно ли такое?

С уважением.
16.01.2016 22:02:39
Здравствуйте, большое спасибо! Но у меня имеется легкий пример с которым я не могу справиться и заключение его вот в чем:
как сделать чтобы,  когда  происходит выбор одной ячейки из выпадающего списка одного значения (Х) автоматически происходило заполнение того же значения (Х) в другой ячейки? Короче говоря: при выборе ячейки К18 список Х нужно чтобы в ячейки М 18 также ставилось значение Х. Спасибо.
19.01.2016 12:36:23
Введите в ячейку M18:
=К18
и нажмите Enter ;)
23.01.2016 21:55:10
Здравствуйте! Все получилось! Ваш сайт очень полезен для людей!
16.02.2016 14:31:40
я пока далеко не супер пользователь и при попытке создании зависимого списка возникла проблема.
Одно из наименований пишется через тире и при выдаче названия списку потом не подцепляется нужное значение

Может кто, что подскажет.

Спасибо
28.04.2016 06:36:07
Добрый День!
У меня в таблице 2 зависимых списка, но один получается пустым. Почему такая проблема?
Страницы: 1  2  3  4  
Наверх