Связанные (зависимые) выпадающие списки
Способ 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. Умные таблицы
Этот подход очень похож на предыдущий, но использует вместо именованных диапазонов - "умные" динамические таблицы, которые будут выступать источником данных для вторичного списка:
Таким образом, мы:
- Сначала преобразуем наши справочники в "умные" таблицы, используя сочетание клавиш Ctrl+T или команду Главная - Форматировать как таблицу (Home - Format as Table) и
- Даём им имена (Фрукты, Овощи, Зелень) на вкладке Конструктор (Design) в поле Имя таблицы (Table Name).
- Создаём первый и второй (связанный) выпадающие списки точно так же, как в предыдущем способе с функцией ДВССЫЛ (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, т.к. нам нужен один столбец с моделями
В итоге должно получиться что-то вроде этого:
Осталось добавить выпадающий список на основе созданной формулы к ячейке 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)
Она ищет нужную категорию в зелёной шапке таблицы, спускается на одну ячейку вниз и ссылается затем на диапазон, по высоте равный количеству товаров в выбранной категории.
Ссылки по теме
- 4 способа создать выпадающий список в ячейках листа
- Автоматическое создание выпадающих списков при помощи инструментов надстройки PLEX
- Выбор фото из выпадающего списка
- Выпадающий список с автоматическим удалением уже использованных элементов
- Динамическая выборка данных для выпадающего списка функциями ИНДЕКС и ПОИСКПОЗ
Народ, спасайте, как все-таки размножить данную функцию на множество ячеек.
При простом копировании формулы зависимый список не открывается вообще.
В формуле =ДВССЫЛ($G$7)перед копированием ячейки убрать $:=ДВССЫЛ(G7). И будет Вам счастье..
для 1 ячейки с маркой машин (F3) при создании источника данных использовать имя диапазона (в моем примере "Фирмы")со следующим источником:
=СМЕЩ('Способ1'!$A$2;0;0;1;СЧЁТЗ('Способ1'!$2:$2))
Для 2 ячейки с моделью машин (F4) при создании источника данных использовать имя диапазона со следующим источником:
=СМЕЩ('Способ1'!$A$2;1;ПОИСКПОЗ('Способ1'!$F$3;Фирмы;0)-1;СЧЁТЗ(ДВССЫЛ(АДРЕС(3;ПОИСКПОЗ('Способ1'!$F$3;Фирмы;0);;1;"Способ1")&":"&АДРЕС(20000;ПОИСКПОЗ('Способ1'!$F$3;Фирмы;0);;1)));1)
Кстати, не обязательно вручную вбивать длинные формулы в описание источника диапазона. Правая кнопка мыши не работает, зато копирование и вставка на панели и в меню доступны и работают, когда непосредственно редактируешь формулу источника данных.
Если немного усложнить, то можно сделать автоматизированный ввод новых элементов, как в примере "Выпадающий список с добавлением новых элементов". В таком случае будет рабочий двухуровневый список с автоматическим добавлением новых элементов 1-го и 2-го уровня.
Прав оказался Тема (письмо от 31.01.2009) - функция ДВССЫЛ (INDIRECT) напрочь НЕ УМЕЕТ РАБОТАТЬ с динамическими массивами, точнее она не умеет работать ни с чем, что ТРЕБУЕТ ВЫЧИСЛЕНИЯ при её вызове.
Поэтому, если вы пытаетесь совместить "в одном флаконе" советы
по созданию динамических именованных диапазонов (т.е. определяемых через строку типа =СМЕЩ(Лист1!$A$1;1;0;СЧЁТЗ(Лист1!$A:$A)-1;1))
и
по созданию связанных выпадающих списков (как в этой теме), то это
НЕ ПОЛУЧИТСЯ!
Создание связанных выпадающих списков с использованием функции ДВССЫЛ (INDIRECT) и именованных диапазонов возможно только для диапазонов, заданных напрямую, без использования дополнительных вычислений.
Но!
Не всё так уж безнадёжно
Помучившись нашёл выход:
1. не надо использовать именованные динамические диапазоны (от них в данном случае нет пользы)
2. если функция INDIRECT не умеет вычислять, то достаточно зараннее вычислить динамический диапазон самому!
Если взять тот пример, что указан в данной теме, то надо
создать ячейку (пусть, например E3), которая вычислит примерно такую формулу:
=ADDRESS(1;1;1;1)&":"&ADDRESS(1;COUNTA($1:$1);1;1)
и при создании первого выпадающего списка (скажем, в ячейке F3) откройте меню Данные - Проверка (Data - Validation), затем из выпадающего списка Тип данных выберите вариант Список и в поле Источник введите формулу
=ДВССЫЛ(E3)
(=INDIRECT(E3))
где E3 - адрес ячейки с вычисленным адресом диапазона, содержащего наименования производителей авто.
Далее перед созданием второго выпадающего списка надо создать ячейку (скажем, G3), в которую поместить вычисление адреса того диапазона, который выбран в первом выпадающем списке.
Это делается примерно такой формулой:
=ADDRESS(2;MATCH($F3;$1:$1;0);1;1)&":"&ADDRESS(COUNTA(INDIRECT(ADDRESS(2;MATCH($F3;$1:$1;0);1;1)&":"&ADDRESS(999;MATCH($F3;$1:$1;0);1;1)));MATCH($F3;$1:$1;0);1)
Если в первом выпадающем списке выбрано какое-либо значение, то вычисленный адрес диапазона марок должен выглядеть примерно так:
$A$2:$A$25
иначе так
#N/A
Не пугайтесь
Тогда в при создании второго выпадающего списка в поле Источник (Данные - Проверка (Data - Validation) - Список - Источник) надо ввести формулу
=ДВССЫЛ(G3)
где G3 - адрес ячейки с вычисленным адресом диапазона.
Вот так вот. Кривовато, но что сделаешь, если имеешь дело с кривоватыми мелкомягкими функциями ....
Зато работает
Кстати, такой способ позволяет и размножать строки с выпадающими списками и увеличивать количество и размер списков (производителей и их марок), ничего нигде дополнительно не описывая и не меняя. Кроме всего прочего, можно списки производителей и их марок поместить на один лист, а выпадающие списки - на другой лист.
=ЕСЛИ($G7="Toyota";ДВССЫЛ("Таблица1[Toyota]");ЕСЛИ($G7="Ford";ДВССЫЛ("Таблица1[Ford]");
ДВССЫЛ("Таблица1[Nissan]"))
В квадратных скобках названия столбцов Таблицы1. При добавлении моделей в таблицу они автоматически появляются в выпадающем списке.
У этого способа есть и свои недостатки:
1. Ограничена длина формулы, которая вставляется в Проверку данных;
2. Если один столбец заполнен больше другого, то при выборе марки с числом моделей меньше, будут видны пустые строки.
А чтобы не было пустых лишних строк можно использовать разные таблицы, а не разные столбцы в одной таблице.
2) Создал несколько "умных таблиц", по совету
1) В таблицах выделил диапазоны с моделями и назвал каждый по названиям марок как было описано в
PS: знак &1 прикрепляет "1" к моим именам диапазонов
При этом список моделей может увеличиваться (выпадающий список будет пополняться автоматически)
не могли бы вы ответить на такой вопрос:
задача та же что и выше (обнулять зависимый список)
но у меня ячейка объединенная. макрос работает если разъединить, а вот с объединенными не хочет. не могли бы вы подсказать решение (если оно есть). спасибо.
В столбце А - услуга, в столбце В - тариф.
Заранее спасибо.
Подскажите как написать такую же запись для соответсвующих (соседних) ячеек умной таблицы из разных столбцов:
[@Бренд] [@Модель] [@Поставщики]]
Если в одной происходят изменения, то во второй и третей происходит очистка
Этот макрос только на две ячейки (А1 и А2).
Если сделать целую таблицу, чтобы в каждой строке были связанные списки (столбец А - марка, Столбец В - модель), то как будет выглядеть вышеуказанный макрос, чтобы он работал на весь диапазон?
Пример формулы в зависимом списке такой:
=СМЕЩ(Соглашения!$A$1;ПОИСКПОЗ($A7;Соглашения!$A:$A;0)-1;3;СЧЁТЕСЛИМН(Соглашения!$A:$A;$A7;Соглашения!$C:$C;$B4);1)
Спасибо.
Интересно!
Итак. Представьте себе, что на рис.3 сего примера перед столбцом "А" есть еще столбец в котором содержатся типы авто (купе, седан, внедорожник и т.п.), и в итоге мы получаем список повторяющихся фирм производителей (столбец "А", а необходим список уникальных значений. В этом и состоит мой вопрос: как реализовать фильтрацию посредством формулы, а ни в коим случаи макросов, которые безусловно имею место быть.
Я уже собрал кое-какую формулу для фильтрации значений:
3
Пытался подставить формулу Смещения, описанную в данном примере на место именованного диапозона "list", но чем заменить диапозон "$B$1:B1" не знаю.
например в ячейке А1 - располагается марка, в ячейке В1 - располагается модель.
Как распространить взаимосвязанный список на ячейки А2 и В2, А3 и В3, и т.д.
Спасибо.
чтобы ссылка на марку бралась из соседней ячейки.
А потом копируете обе ячейки с маркой и моделью вниз - настолько, насколько вам надо.
Так что вопрос остается открытым
Уберите доллары в именованном диапазоне Модель в адресе ($G$7 -> G7)
Скопируйте обе ячейки G7 и H7 вниз.
Все работает - вопрос закрыт
Что касается способа с использованием "умной таблицы", то его недостаток в том, что данные в таблицу необходимо заносить только вручную (т.е. формулой пополнять таблицу не получится - таблица не увидит новые значения).
А почему бы вам не сделать заранее несколько разных выпадающих списков со всеми категориями (Овощи, Конфеты, Шоколад и т.д.) сразу. Пусть каждый отдел выбирает свое. Или будут косячить?
Понадобилось сделать таблицу с выпадающими списками,у меня это получилось по способу 2(но без возможности добавлять новые строчки списка прямо в ячейку).Но это не беда,мне подходит и такой вариант.Большая проблема для меня в другом.Я не вижу практического применения голого выпадающего списка(как в примере с именами),также не вижу смысла применения голого связанного списка(как в примере с марками и моделями машин).Мне,и думаю всем другим кто пользуется такими списками, нужно нечто другое. Может то что я сейчас напишу для вас покажется дилетантством,но я не постесняюсь спросить хотя бы потому что больше негде искать ответа и помощи.Не судите строго,я не продвинутый пользователь Exel пока что.Итак мне от такой таблицы с выпадающими списками нужно следующее:например в примере с машинами после выбора марки в первом выпадающем списке и после выбора модели во втором выпадающем списке в этой же строке в последующих пяти,десяти или даже двадцати ячейках должна появиться информация типа-цвет машины,цена,скорость,объем двигателя,расход топлива и другая подобная ей информация. Каждому параметру естественно будет соответствовать название столбца.Тогда при смене марки-модели в таблице будет меняться всё связанное с конкретной моделью.Я понимаю что для всей этой информации мне потребуется создать на отдельном листе что-то с названием библиотека или база данных,меня это не пугает я осилю такую работу.Но вот заставить эту информацию появляться в нужном месте после смены параметра в выпадающем списке я не могу додуматься как сделать такое.Возможно для вас этот ответ очевиден,раз никто не спрашивает об этом,я прочитал почти весь форум на тему выпадающих списков и не нашел ответа.
Если вас не затруднит я вас очень прошу ответьте мне на мой вопрос,желательно с примером,я буду очень благодарен .
Мне необходимо указать не один, а много раз марку и модель. Т.е. Марка1 Модель1, Марка2 Модель2 и т.д. список, где в каждой ячейке выбирается значение из выпадающего списка. В примере это сделано только один раз (Марка1 Моедль1). Если рядом сделать вторые выпадающие списки с маркой и моделью (Марка2 Модель2), то выпадающий список с моделью (Модель2) будет реагировать всё равно на выбор в первом списке марки (Марка1).
Единственный способ решения, который вижу я, это создание новое "define name" для каждой новой строки с заменой в формуле следующего:
=OFFSET($A$1;MATCH($G$7;$A:$A;0)-1;1;COUNTIF($A:$A;$G$7);1)
на
=OFFSET($A$1;MATCH($Н$7;$A:$A;0)-1;1;COUNTIF($A:$A;$Н$7);1) (для Марка2 Модель2)
затем
=OFFSET($A$1;MATCH($I$7;$A:$A;0)-1;1;COUNTIF($A:$A;$I$7);1) (для Марка3 Модель3)
и т.д.
Как решить это более автоматически.
=OFFSET($A$1;MATCH(G7;$A:$A;0)-1;1;COUNTIF($A:$A;G7);1)
и потом спокойно копируйте обе ячейки G7 и G8 вправо
2-я проблема.
Если и таблицу возможных вариантов и наш конкретный список располагать на одном листе, то работает отлично.
Если располагать на разных для удобства, то тоже работает отлично.
=OFFSET(Sheet0!$A$1;MATCH(Sheet1!G7;Sheet0!$A:$A;0)-1;1;COUNTIF(Sheet0!$A:$A;Sheet1!G7);1)
Если нужен ряд листов с подобными списками (Разными - например план продаж за день - один лист), то при копировании на Sheet2! второй зависимый список (Модель Sheet2!) будет всё ещё ссылаться на первый список (Марка Sheet1!).
Опять-таки единственным выходом, который я вижу, это создавать новое имя "Define Name" для каждого нового листа.
=OFFSET(Sheet0!$A$1;MATCH(Sheet2!G7;Sheet0!$A:$A;0)-1;1;COUNTIF(Sheet0!$A:$A;Sheet2!G7);1)
=OFFSET(Sheet0!$A$1;MATCH(Sheet3!G7;Sheet0!$A:$A;0)-1;1;COUNTIF(Sheet0!$A:$A;Sheet3!G7);1) и т.д.
Подскажите, как решить данный вопрос с более простым созданием каждого следующего листа.
Пытаюсь сделать третий выпадающий список на примере способа 2 из колонки "С" и столкнулся с проблемой.
При повторяющихся значениях в колонке "В" оные отображаются во втором выпадающем списке! - Возможно ли как-нибудь убрать эти повторяющиеся значения формулой в списке без удаления повторений из колонки "В"?
Например, у Toyota (колонка - "А";) три Altezza (колонка - "В";) с тремя разными движками в колонке "C"
Спасибо!
Моя таблица вида:
А| B | C
а| 1 | а
а| 2 | а
а| 2 | б
а| 2 | в
Для столбца "А" мы создаем отдельный столбец с уникальными значениями. Т.е. в выпадающем списке уникальные значения.
А вот со столбцом "B" сложней, в вываливающимся списке мы видим "1" и далее повторяющиеся три раза значения "2". Т.е. формула не группирует их. В результате список получается очень длинным и работать с ним не удобно.
Со столбцом "C" проблем нет.
Знаете как справиться с этой задачей?
В Вашем файлике все решилось, но при попытки повторить тоже самое в моем документе, возникает вышеуказанная ошибка. Может быть проблема во включенных макросах?
Можно ли сделать так, чтобы при выборе значения в первой ячейке (G7 из Способа2), в зависимой ячейке появлялось одно (например первое) значение из соответствующего зависимого списка? Иными словами, значение по умолчанию?
Нашел только как обновлять:
Подскажите, пожалуйста. Я в макросах вообще ничег не понимаю.
Тогда я пошла по другому пути макросом создала табличку для ДВССЫЛ... Но некоторые города содержат пробелы....
И вот Вы написали, что можно макросом отслеживать изменение первого списка. А не подскажите как? Моё предположение - написать событие "Worksheet_SelectionChange" в теле листа... Что-то типа Если выбран такой город, то = такому-то Range. Подскажите, пожалуйста?
У меня вопрос следующий. Я сделал по способу №1 все прекрасно работает, но как сделать так, чтобы при изменении выбора в первой ячейки, автоматически обнулялась вторая ячейка?
То есть, изменяется значение в первой ячейке, а данные во второй остаются без изменения, нужно чтобы изменялись или обнулялись.
стоит задача такого рода, нужно связанные списки, но что бы при выборе из первого сразу подставлялось со второго и если во втором более одного элемента то уже выбирать ручками или что бы второй список самораскрывался для последующего выбора (что предпочтительней). а также нужно что бы можно было выбирать со второго списка в обход первого и первый не обязательно заполнять.
расскажу на примере:
фирма А получает через грузоперевозки груз от от диапазона фирм (у всех есть свое название). но эти фирмы отправлят груз не от своего имени а по фамилии директора или же водителя. вот поэтому надо чтобы в первом списке были фамилии, при выборе необходимой во втором сразу подставлялось значение или же сразу выбрать из второго списка название фирмы не выбирая фамилиии. ну как то так
Огромное спасибо за материал!
Я создала два таких зависимых списка (по таблице с численностью населения, порядок списков: область-населенный пункт-район), но во втором столбце встречаются повторяющие значения, т.к. в разных областях есть города с одинаковым названием. Из-за этого в третьем списке выпадает значение района, идущего первым по порядку, а за ним то значение, которое находится в столбце с районами в строке ниже. Как исправить эту ошибку и сделать так, чтобы третий список "видел" все одинаковые значения городов во втором и в нем можно было выбрать один из тех районов, в которых есть такой город.
Заранее огромное спасибо за помощь!
решение на указанной странице не подходит.
Есть другой способ?
шаг1 ) в ячейке А1 выбираем регион из предложенного списка
шаг2 ) в ячейке А2 выбираем страну из предложенного списка который зависит от выбранного региона
шаг3 ) в ячейке А3 выбираем город из предложенного списка который зависит от выбранной страны
шаг4 ) в ячейке А4 видим результат, получаемый по раннее внесённым формулам, в зависимости выбранной страны. Для каждой страны 5 параметров для формулы занесены в базу заранее.
Но такой вопрос - а как разбить по разным листам? Данные на одном, а перечень заказов на другом.
но, кажется, и среди них нет варианта без летучих функций ДВССЫЛ и СМЕЩ
для способа 2, Модель:
этому наименованию и чтобы остальное (длина, вес, м и т.д. по таблице) выходило автоматом??? И как сделать чтобы можно было выбирать несколько позиций подряд?