Excel vba зависимые выпадающие списки

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

Способ 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)

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

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

  • 4 способа создать выпадающий список в ячейках листа
  • Автоматическое создание выпадающих списков при помощи инструментов надстройки PLEX
  • Выбор фото из выпадающего списка
  • Выпадающий список с автоматическим удалением уже использованных элементов
  • Динамическая выборка данных для выпадающего списка функциями ИНДЕКС и ПОИСКПОЗ 

Зависимый выпадающий список VBA

Sobirjon

Дата: Четверг, 16.05.2019, 08:03 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

2

±

Замечаний:
0% ±


2016

Не могу подружить comboboxы. Второй ни как не хочет слушать первого :'( .
Пытаюсь сделать аналог зависимого выпадающего списка через макрос, так как стандартный жудко не удобно.
Из-за не хватки опыта (точнее абсолютно 0) у меня не как не получается. Буду премного благодарен за содействия в данном решении.
Как положено образец прикрепил. Вроде первый комбобокс удалось настроить с товарищем YouTube. Оказался и у него знаний пока не хватает yes

К сообщению приложен файл:

5181707.xlsm
(23.5 Kb)

Сообщение отредактировал SobirjonЧетверг, 16.05.2019, 08:05

 

Ответить

and_evg

Дата: Четверг, 16.05.2019, 08:47 |
Сообщение № 2

Группа: Проверенные

Ранг: Обитатель

Сообщений: 416


Репутация:

72

±

Замечаний:
0% ±


Excel 2007

И вам добрый день.
так?
[vba]

Код

Private Sub Список01_Change()
    Me.Список02.ListFillRange = Me.Список01
End Sub

[/vba]

К сообщению приложен файл:

4010897.xlsm
(21.6 Kb)

 

Ответить

Sobirjon

Дата: Четверг, 16.05.2019, 08:50 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

2

±

Замечаний:
0% ±


2016

and_evg, Гениально hands . Чудо свершилась :D . Пошел изучать :D

 

Ответить

Sobirjon

Дата: Четверг, 16.05.2019, 09:18 |
Сообщение № 4

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

2

±

Замечаний:
0% ±


2016

and_evg, Задача была не правильно поставлена :'( . Можно исправить код?
Проблема в том что, в рабочем файле диапазон из таблицы. Соответственно во втором списке формируется из первого столбца, а надо чтобы формировался из второго столбца.
Образец прикрепил

К сообщению приложен файл:

6660851.xlsm
(26.5 Kb)

Сообщение отредактировал SobirjonЧетверг, 16.05.2019, 09:20

 

Ответить

_Boroda_

Дата: Четверг, 16.05.2019, 09:31 |
Сообщение № 5

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Вообще без кода. Не нужна эта куча имен Список1, Список2, …
Достаточно одного имени Спис с формулой

Код

=СМЕЩ(Списки!$A$2;;(ПОИСКПОЗ(Лист1!$A$2;Список;)-1)*4+2;10)

Вешаем его на второй список в ListFillRange и наслаждаемся
Только в таблице с данными нужно удалить столбец О


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

and_evg

Дата: Четверг, 16.05.2019, 09:35 |
Сообщение № 6

Группа: Проверенные

Ранг: Обитатель

Сообщений: 416


Репутация:

72

±

Замечаний:
0% ±


Excel 2007

тогда так.
Смотрите свойства второго списка. ColumnCount и ColumnWidths
Код остается преждним

К сообщению приложен файл:

8423299.xlsm
(25.2 Kb)

 

Ответить

Sobirjon

Дата: Четверг, 16.05.2019, 09:37 |
Сообщение № 7

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

2

±

Замечаний:
0% ±


2016

_Boroda_,

Вообще без кода. Не нужна эта куча имен Список1, Список2,

К сожалению в жизни таблицы не такие красивые как на примере :'( . Их много и расположены не в ряд а кирпичиками. Еще и в разных книгах. Последующем мне тяжело будет отслеживать диапазон :'(

 

Ответить

Sobirjon

Дата: Четверг, 16.05.2019, 09:45 |
Сообщение № 8

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

2

±

Замечаний:
0% ±


2016

and_evg, Похоже у меня руки «кривые» . В чем магия таки не понял booze
При анализе обнаружил что в строке ColumnCount 4 вместо 1. Исправил у себя и стал отображать сразу 4 столбца :cranky: :angel:

Сообщение отредактировал SobirjonЧетверг, 16.05.2019, 09:46

 

Ответить

and_evg

Дата: Четверг, 16.05.2019, 09:53 |
Сообщение № 9

Группа: Проверенные

Ранг: Обитатель

Сообщений: 416


Репутация:

72

±

Замечаний:
0% ±


Excel 2007

стал отображать сразу 4 столбца

так свойством ColumnWidths установите ширину столбцов например 0; 100 ;0 ;0

 

Ответить

Sobirjon

Дата: Четверг, 16.05.2019, 09:54 |
Сообщение № 10

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

2

±

Замечаний:
0% ±


2016

and_evg, Еще в самой связанной ячейке B2 попадает не названия а номер. Можно сделать чтобы всё-таки названия попадала, формула индекс находит по названии :(

 

Ответить

Sobirjon

Дата: Четверг, 16.05.2019, 09:55 |
Сообщение № 11

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

2

±

Замечаний:
0% ±


2016

and_evg,

так свойством ColumnWidths установите ширину столбцов например 0; 100 ;0 ;0

вот где крился магия hands

 

Ответить

_Boroda_

Дата: Четверг, 16.05.2019, 10:21 |
Сообщение № 12

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Ну извините

К сожалению в жизни таблицы не такие красивые как на примере

И это снова возвращает нас к Правилам форума. Пункт 3 —

Цитата

сохранить структуру, расположение таблиц, имена листов — аналогично оригиналу


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

Sobirjon

Дата: Четверг, 16.05.2019, 10:41 |
Сообщение № 13

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

2

±

Замечаний:
0% ±


2016

_Boroda_,

И это снова возвращает нас к Правилам форума. Пункт 3 —

впредь учту. Но всё равно спасибо за ответ. В будущем кто нибудь как вариант может использовать.
Ответов здесь ни когда ни бывает лишним
thumb
Всем огромное спасибо!

Сообщение отредактировал SobirjonЧетверг, 16.05.2019, 10:47

 

Ответить

Sobirjon

Дата: Четверг, 16.05.2019, 10:46 |
Сообщение № 14

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 151


Репутация:

2

±

Замечаний:
0% ±


2016

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

Еще в самой связанной ячейке B2 попадает не названия а номер. Можно сделать чтобы всё-таки названия попадала, формула индекс находит по названии

Нашел ответ методом тыка B) . Надо изменить значения BoundColumn с 1 на 2, или какой нужен столбец

Сообщение отредактировал SobirjonЧетверг, 16.05.2019, 10:47

 

Ответить

and_evg

Дата: Четверг, 16.05.2019, 11:22 |
Сообщение № 15

Группа: Проверенные

Ранг: Обитатель

Сообщений: 416


Репутация:

72

±

Замечаний:
0% ±


Excel 2007

изменить значения BoundColumn с 1 на 2

Верно

 

Ответить

Содержание

  1. Excel vba зависимые выпадающие списки
  2. Связанные выпадающие списки
  3. VBA Excel. Заполнение списка ComboBox по условию
  4. Пример для заполнения ComboBox по условию
  5. Заполнение ComboBox1 уникальными фамилиями
  6. Связанные (зависимые) выпадающие списки
  7. Способ 1. Функция ДВССЫЛ (INDIRECT)
  8. Способ 2. Умные таблицы
  9. Способ 3. Отсортированный справочник
  10. Способ 4. Неотсортированный справочник

Excel vba зависимые выпадающие списки

Добрый вечер!
Столкнулся с проблемой — никак не могу заставить VBA генерировать зависимые выпадающие списки.
Проблема проиллюстрирована в файле «пример».

Если лист «данные», в нем три столбца — «модель», «тип двигателя» и «объем двигателя». В столбце «модель» независимый выпадающий список, с ним проблем не возникает. В столбце «тип двигателя» список зависимый; ссылается на динамический диапазон, зависящий от выбранной модели. В последнем столбце список также не статичный, но он ссылается на различные диапазоны в зависимости от типа двигателя.

Я хочу сделать так, чтобы в любой строке листа «данные» при двойном клике на любую ячейку строки макрос программно проставлял выпадающие списки, аналогичные «образцевой» строчке. Для этого я макросом «getformulas» на лист «формулы» собираю следующую инфу — Type, Operator, Formula1, Formula2 всех выпадающих списков.

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

А дальше начинаются проблемы.
При первом дабл-клике появляется список в первом столбце (он статичен), на втором столбце макрос выкидывает ошибку. После того, как в ячейке 1го столбца есть значение, повторный запуск макроса по дабл-клику дает выпадающий список во втором столбце. На третьем — ошибка. И даже если в 1м и 2м столбце есть значения, то на третьем появляется ошибка и выпадающего списка нет.

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

Заранее спасибо за любые советы и рекомендации!

PS вариант с копированием ячеек из второй строки не подходит..

PPS перезалил пример — в предидущий раз не сохранились макросы.

Источник

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

Связанные выпадающие списки.xls (216,5 KiB, 3 056 скачиваний)

Чтобы понять о чем пойдет речь в статье сначала необходимо понимать что такое выпадающий список и как его создать. Теперь попробуем разобраться что значит выражение «связанный выпадающий список». Я бы еще назвал такой список зависимым. Т.е. когда список значений одного выпадающего списка зависит от значения, выбранного в другом выпадающем списке или просто забитого в ячейку. Представим ситуацию: есть ячейка А2 . В ней создан выпадающий список со значениями: Овощи, Фрукты, Мясо, Напитки . А в ячейке В2 нам нужен такой список, чтобы значения этого самого списка изменялись в зависимости от того, какое значение мы укажем в ячейке А2 — т.е. список выбранной категории продуктов. Например выбрали в А2 значение Овощи — в В2 появился выпадающий список, содержащий значения: Морковь, Капуста, Картошка, Редиска, Помидоры. Выбрали в А2 Мясо — в В2 появился выпадающий список, содержащий значения: Говядина, Телятина, Свинина, Курица, Индейка . И т.д.

Подготовка
Для начала нам потребуется создать все эти списки. Что-то вроде этого:

Далее для каждого из этих списков необходимо назначить именованный диапазон. Создать можно любым способом из описанных в этой статье. Главное помнить — если сами списки расположено на листе, отличном от того, на котором списки выпадающие — то обязательно создавать именованный диапазон с назначением области действия — Книга.
В приложенном к статье примере диапазоны имеют имена категорий — их можно видеть в заголовках.
Если ваши категории содержат пробел — необходимо заменить его на нижнее подчеркивание (_) или удалить, т.к. в качестве именованного диапазона такое значение не подойдет и ничего в результате не получится.

Создание зависимых списков
В ячейке А2 создаем «список списков» — основной список, на основании значений которого будет создаваться второй список. Этот список может быть создан любым способом (как создать выпадающий список). Назовем его Список категорий.
В ячейке В2 потребуется создать список на основании формулы, хоть по сути и так же, как и остальные: вкладка Данные (Data)Проверка данных (Data validation)Список (List) . Но теперь вместо прямого указания имени списка необходимо указать ссылку на именованный диапазон, который мы выберем в Списке категорий(ячейка А2 ), на основании его имени. В этом нам поможет функция ДВССЫЛ (INDIRECT) . Просто записываем эту формулу в поле Источник (Source) : =ДВССЫЛ( $A2 )

На что обратить внимание: если вы планируете распространять такой список на столбец, то ссылка должна выглядеть именно так: $A2. Перед цифрой не должно быть знака доллара ($A$2 — неправильно). Иначе зависимый список будет всегда формироваться исключительно на основании значении ячейки А2.

Источник из другой книги
Сами списки товара могут находится и в другой книге. Если книга называется Книга со списком.xls и на Лист1 в ячейке А1 в этой книге находится имя нужного нам списка, то формула будет выглядеть так:
=ДВССЫЛ(«‘[Книга со списком.xls]Лист1’!»&$A$1)
На что обратить внимание: лучше всегда перед именем книги и после имени листа ставить апостроф — ‘. Так вы избежите проблем и недопонимания, если имя листа или книги содержит пробелы и иные специфические символы. В отличии от списков внутри одной книги в данном случае знак доллара должен быть и перед буквой и перед цифрой. В ином случае возможны ошибки (если, конечно, это не было сделано специально с пониманием того, что делалось).

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

  1. обе книги должны быть открыты. Если вы закроете книгу со списками, то получите ошибку — выпадающие списки просто перестанут работать
  2. созданные подобным образом связанные списки не будут работать с динамическими именованными диапазонами

И ничего с этими ограничениями не поделать при подобном подходе.

Tips_Lists_Connect_Validation.xls (26,5 KiB, 18 091 скачиваний)

Статья помогла? Поделись ссылкой с друзьями!

Источник

VBA Excel. Заполнение списка ComboBox по условию

Заполнение списка ComboBox из кода VBA Excel по условию в зависимости от выбранного значения в другом элементе управления ComboBox на примере ФИО.

Пример для заполнения ComboBox по условию

Описание примера по заполнению списка ComboBox по условию в зависимости от выбранного значения в другом элементе управления ComboBox.

1. Исходная таблица со списками фамилий, имен и отчеств для заполнения элементов управления ComboBox из кода VBA Excel:

Список ФИО отсортирован по алфавиту, что позволит без использования дополнительного кода VBA Excel заполнить ComboBox1 только уникальными фамилиями, а также облегчит поиск фамилии для выбора в раскрывающемся списке.

2. Пользовательская форма с элементами управления ComboBox1, ComboBox2 и ComboBox3 для фамилий, имен и отчеств с соответствующими им надписями:

3. Необходимо с помощью кода VBA Excel:

  • заполнить список элемента ComboBox1 уникальными фамилиями;
  • заполнить ComboBox2 именами, соответствующими выбранной фамилии в ComboBox1;
  • заполнить ComboBox3 отчествами, соответствующими выбранной фамилии в ComboBox1 и выбранному имени в ComboBox2.

Условие заполнения следующего элемента ComboBox — выбранное значение в предыдущем поле со списком.

Заполнение ComboBox1 уникальными фамилиями

Заполняем список ComboBox1 фамилиями из таблицы с помощью кода VBA Excel при открытии пользовательской формы, используя событие UserForm_Initialize :

Источник

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

Способ 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 — адрес ячейки с первым выпадающим списком (замените на свой).

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

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

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

Способ 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) в нижней части окна введите руками следующую формулу:

Ссылки должны быть абсолютными (со знаками $). После нажатия 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) мы используем хитрую формулу:

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

Источник

Заполнение списка ComboBox из кода VBA Excel по условию в зависимости от выбранного значения в другом элементе управления ComboBox на примере ФИО.

Описание примера по заполнению списка ComboBox по условию в зависимости от выбранного значения в другом элементе управления ComboBox.

1. Исходная таблица со списками фамилий, имен и отчеств для заполнения элементов управления ComboBox из кода VBA Excel:

Таблица со списками фамилий, имен и отчеств

Список ФИО отсортирован по алфавиту, что позволит без использования дополнительного кода VBA Excel заполнить ComboBox1 только уникальными фамилиями, а также облегчит поиск фамилии для выбора в раскрывающемся списке.

2. Пользовательская форма с элементами управления ComboBox1, ComboBox2 и ComboBox3 для фамилий, имен и отчеств с соответствующими им надписями:

Пользовательская форма с элементами управления Label и ComboBox

3. Необходимо с помощью кода VBA Excel:

  • заполнить список элемента ComboBox1 уникальными фамилиями;
  • заполнить ComboBox2 именами, соответствующими выбранной фамилии в ComboBox1;
  • заполнить ComboBox3 отчествами, соответствующими выбранной фамилии в ComboBox1 и выбранному имени в ComboBox2.

Условие заполнения следующего элемента ComboBox — выбранное значение в предыдущем поле со списком.

Заполнение ComboBox1 уникальными фамилиями

Заполняем список ComboBox1 фамилиями из таблицы с помощью кода VBA Excel при открытии пользовательской формы, используя событие UserForm_Initialize:

Private Sub UserForm_Initialize()

Dim arr() As Variant, n As Long, i As Long

    With Worksheets(«Лист5»)

        ‘Определяем количество строк в таблице

        n = .Cells(1, 1).CurrentRegion.Rows.Count

        ‘Копируем фамилии из диапазона в массив

        arr = .Range(.Cells(1, 1), .Cells(n, 1)).Value

    End With

    For i = 2 To n

        ‘Условие используем для добавления в список уникальных фамилий

        If arr(i 1, 1) <> arr(i, 1) Then

            ‘Добавляем очередную фамилию в список ComboBox1

            ComboBox1.AddItem arr(i, 1)

        End If

    Next

End Sub

Фамилии из столбца таблицы копируются в массив для ускорения цикла, так как в массивах циклы работают быстрее, чем в диапазонах.

Заполнение ComboBox2 именами по условию

Когда мы выбираем значение в поле со списком ComboBox1, происходит событие ComboBox1_Change, которое будем использовать для автоматического заполнения элемента ComboBox2 именами, соответствующими выбранной фамилии:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Private Sub ComboBox1_Change()

Dim arr() As Variant, n As Long, i As Long

    With Worksheets(«Лист5»)

        ‘Определяем количество строк в таблице

        n = .Cells(1, 1).CurrentRegion.Rows.Count

        ‘Копируем фамилии и имена из диапазона в массив

        arr = .Range(.Cells(1, 1), .Cells(n, 2)).Value

    End With

‘Очищаем ComboBox2 от элементов предыдущего списка

ComboBox2.Clear

    For i = 2 To n

        ‘Условие используем для добавления в список имен, соответствующих выбранной фамилии

        If arr(i, 1) = ComboBox1.Value Then

            ‘Добавляем очередное имя в список ComboBox2

            ComboBox2.AddItem arr(i, 2)

        End If

    Next

    With ComboBox2

        ‘Если в списке один элемент, автоматически его выбираем

        If .ListCount = 1 Then .ListIndex = 0

    End With

End Sub

Имена в ComboBox2 могут повторяться, так как отбор уникальных значений не производится. Если имена в списке ComboBox2 должны быть уникальными, можно сначала добавить их в объект Collection с отбором уникальных значений, а потом из объекта Collection скопировать имена с помощью цикла For Each ... Next в ComboBox2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

Private Sub ComboBox1_Change()

Dim arr() As Variant, n As Long, i As Long, myCollection As New Collection, myElement As Variant

    With Worksheets(«Лист5»)

        ‘Определяем количество строк в таблице

        n = .Cells(1, 1).CurrentRegion.Rows.Count

        ‘Копируем фамилии и имена из диапазона в массив

        arr = .Range(.Cells(1, 1), .Cells(n, 2)).Value

    End With

‘Очищаем ComboBox2 от элементов предыдущего списка

ComboBox2.Clear

    For i = 2 To n

        ‘Условие используем для добавления в список имен, соответствующих выбранной фамилии

        If arr(i, 1) = ComboBox1.Value Then

            ‘Добавляем очередное уникальное имя в Collection

            On Error Resume Next

                myCollection.Add CStr(arr(i, 2)), CStr(arr(i, 2))

            On Error GoTo 0

        End If

    Next

    With ComboBox2

        ‘Заполняем список элемента ComboBox2 именами из коллекции

        For Each myElement In myCollection

            .AddItem myElement

        Next myElement

        ‘Если в списке один элемент, автоматически его выбираем

        If .ListCount = 1 Then .ListIndex = 0

    End With

End Sub

Заполнение ComboBox3 отчествами по условию

Выбор одного из элементов в ComboBox2, как и автоматический выбор единственного элемента предыдущим кодом, вызывает событие ComboBox2_Change, которое будем использовать для автоматического заполнения элемента ComboBox3 отчествами, соответствующими выбранной фамилии в ComboBox1 и выбранному имени в ComboBox2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Private Sub ComboBox2_Change()

Dim arr() As Variant, n As Long, i As Long

    With Worksheets(«Лист5»)

        ‘Определяем количество строк в таблице

        n = .Cells(1, 1).CurrentRegion.Rows.Count

        ‘Копируем фамилии, имена и отчества из диапазона в массив

        arr = .Range(.Cells(1, 1), .Cells(n, 3)).Value

    End With

‘Очищаем ComboBox3 от элементов предыдущего списка

ComboBox3.Clear

    For i = 2 To n

        ‘Условие для добавления в список отчеств, соответствующих выбранным фамилии и имени

        If arr(i, 1) = ComboBox1.Value And arr(i, 2) = ComboBox2.Value Then

            ‘Добавляем очередное отчество в список ComboBox3

            ComboBox3.AddItem arr(i, 3)

        End If

    Next

    With ComboBox3

        ‘Если в списке один элемент, автоматически его выбираем

        If .ListCount = 1 Then .ListIndex = 0

    End With

End Sub

Отчества в ComboBox3 повторяться не могут, так как это означало бы, что в таблице есть два или более совершенно одинаковых ФИО.

Один из результатов работы кода VBA Excel по заполнению полей со списком ComboBox в зависимости от выбранного значения в другом элементе управления ComboBox на примере ФИО:

Выбор ФИО с помощью полей со списком ComboBox

Если фамилия в списке встречается один раз, и ей соответствует одно имя, а фамилии и имени — одно отчество, тогда при выборе этой фамилии в элементе управления ComboBox1, имя и отчество в ComboBox2 и ComboBox3 выберутся автоматически.


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

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

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

Путь: меню «Данные» — инструмент «Проверка данных» — вкладка «Параметры». Тип данных – «Список».

Создание выпадающего списка.

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

  1. Вручную через «точку-с-запятой» в поле «Источник».
  2. Ввод значений.

  3. Ввести значения заранее. А в качестве источника указать диапазон ячеек со списком.
  4. Проверка вводимых значений.

  5. Назначить имя для диапазона значений и в поле источник вписать это имя.

Имя диапазона.
Раскрывающийся список.

Любой из вариантов даст такой результат.



Выпадающий список в Excel с подстановкой данных

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

  1. Выделяем диапазон для выпадающего списка. В главном меню находим инструмент «Форматировать как таблицу».
  2. Форматировать как таблицу.

  3. Откроются стили. Выбираем любой. Для решения нашей задачи дизайн не имеет значения. Наличие заголовка (шапки) важно. В нашем примере это ячейка А1 со словом «Деревья». То есть нужно выбрать стиль таблицы со строкой заголовка. Получаем следующий вид диапазона:
  4. Выпадающий список.

  5. Ставим курсор в ячейку, где будет находиться выпадающий список. Открываем параметры инструмента «Проверка данных» (выше описан путь). В поле «Источник» прописываем такую функцию:

Ввод значения в источник.

Протестируем. Вот наша таблица со списком на одном листе:

Список и таблица.

Добавим в таблицу новое значение «елка».

Добавлено значение елка.

Теперь удалим значение «береза».

Удалено значение береза.

Осуществить задуманное нам помогла «умная таблица», которая легка «расширяется», меняется.

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

Ввод данных из списка.

  1. Сформируем именованный диапазон. Путь: «Формулы» — «Диспетчер имен» — «Создать». Вводим уникальное название диапазона – ОК.
  2. Создание имени.

  3. Создаем раскрывающийся список в любой ячейке. Как это сделать, уже известно. Источник – имя диапазона: =деревья.
  4. Снимаем галочки на вкладках «Сообщение для ввода», «Сообщение об ошибке». Если этого не сделать, Excel не позволит нам вводить новые значения.
  5. Сообщение об ошибке.

  6. Вызываем редактор Visual Basic. Для этого щелкаем правой кнопкой мыши по названию листа и переходим по вкладке «Исходный текст». Либо одновременно нажимаем клавиши Alt + F11. Копируем код (только вставьте свои параметры).
  7. Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim lReply As Long
     
        If Target.Cells.Count > 1 Then Exit Sub
        If Target.Address = "$C$2" Then
         If IsEmpty(Target) Then Exit Sub
           If WorksheetFunction.CountIf(Range("Деревья"), Target) = 0 Then
              lReply = MsgBox("Добавить введенное имя " & _
                             Target & " в выпадающий список?", vbYesNo + vbQuestion)
              If lReply = vbYes Then
                  Range("Деревья").Cells(Range("Деревья").Rows.Count + 1, 1) = Target
              End If
           End If
         End If
    End Sub
     
  8. Сохраняем, установив тип файла «с поддержкой макросов».
  9. Сообщение об ошибке.

  10. Переходим на лист со списком. Вкладка «Разработчик» — «Код» — «Макросы». Сочетание клавиш для быстрого вызова – Alt + F8. Выбираем нужное имя. Нажимаем «Выполнить».

Макрос.

Когда мы введем в пустую ячейку выпадающего списка новое наименование, появится сообщение: «Добавить введенное имя баобаб в выпадающий список?».

Нажмем «Да» и добавиться еще одна строка со значением «баобаб».

Выпадающий список в Excel с данными с другого листа/файла

Когда значения для выпадающего списка расположены на другом листе или в другой книге, стандартный способ не работает. Решить задачу можно с помощью функции ДВССЫЛ: она сформирует правильную ссылку на внешний источник информации.

  1. Делаем активной ячейку, куда хотим поместить раскрывающийся список.
  2. Открываем параметры проверки данных. В поле «Источник» вводим формулу: =ДВССЫЛ(“[Список1.xlsx]Лист1!$A$1:$A$9”).

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

Как сделать зависимые выпадающие списки

Возьмем три именованных диапазона:

Три именованных диапазона.

Это обязательное условие. Выше описано, как сделать обычный список именованным диапазоном (с помощью «Диспетчера имен»). Помним, что имя не может содержать пробелов и знаков препинания.

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

  3. Когда поставили курсор в поле «Источник», переходим на лист и выделяем попеременно нужные ячейки.
  4. Таблица со списком.

  5. Теперь создадим второй раскрывающийся список. В нем должны отражаться те слова, которые соответствуют выбранному в первом списке названию. Если «Деревья», то «граб», «дуб» и т.д. Вводим в поле «Источник» функцию вида =ДВССЫЛ(E3). E3 – ячейка с именем первого диапазона.
  6. Второй раскрывающийся список.

    Выбор нескольких значений из выпадающего списка Excel

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

    1. Создаем стандартный список с помощью инструмента «Проверка данных». Добавляем в исходный код листа готовый макрос. Как это делать, описано выше. С его помощью справа от выпадающего списка будут добавляться выбранные значения.
    2. Private Sub Worksheet_Change(ByVal Target As Range)
          On Error Resume Next
          If Not Intersect(Target, Range("Е2:Е9")) Is Nothing And Target.Cells.Count = 1 Then
              Application.EnableEvents = False
              If Len(Target.Offset(0, 1)) = 0 Then
                  Target.Offset(0, 1) = Target
              Else
                  Target.End(xlToRight).Offset(0, 1) = Target
              End If
              Target.ClearContents
              Application.EnableEvents = True
          End If
      End Sub
       
    3. Чтобы выбранные значения показывались снизу, вставляем другой код обработчика.
    4. Private Sub Worksheet_Change(ByVal Target As Range)
          On Error Resume Next
          If Not Intersect(Target, Range("Н2:К2")) Is Nothing And Target.Cells.Count = 1 Then
              Application.EnableEvents = False
              If Len(Target.Offset(1, 0)) = 0 Then
                  Target.Offset(1, 0) = Target
              Else
                  Target.End(xlDown).Offset(1, 0) = Target
              End If
              Target.ClearContents
              Application.EnableEvents = True
          End If
      End Sub
       
    5. Чтобы выбираемые значения отображались в одной ячейке, разделенные любым знаком препинания, применим такой модуль.

    6. Private Sub Worksheet_Change(ByVal Target As Range)
          On Error Resume Next
          If Not Intersect(Target, Range("C2:C5")) Is Nothing And Target.Cells.Count = 1 Then
              Application.EnableEvents = False
              newVal = Target
              Application.Undo
              oldval = Target
              If Len(oldval) <> 0 And oldval <> newVal Then
                  Target = Target & "," & newVal
              Else
                  Target = newVal
              End If
              If Len(newVal) = 0 Then Target.ClearContents
              Application.EnableEvents = True
          End If
      End Sub

    Не забываем менять диапазоны на «свои». Списки создаем классическим способом. А всю остальную работу будут делать макросы.

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

    1. На вкладке «Разработчик» находим инструмент «Вставить» – «ActiveX». Здесь нам нужна кнопка «Поле со списком» (ориентируемся на всплывающие подсказки).
    2. Вставить ActiveX.

    3. Щелкаем по значку – становится активным «Режим конструктора». Рисуем курсором (он становится «крестиком») небольшой прямоугольник – место будущего списка.
    4. Элемент ActiveX.

    5. Жмем «Свойства» – открывается перечень настроек.
    6. Свойства ActiveX.

    7. Вписываем диапазон в строку ListFillRange (руками). Ячейку, куда будет выводиться выбранное значение – в строку LinkedCell. Для изменения шрифта и размера – Font.

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

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

Понравилась статья? Поделить с друзьями:
  • Excel vba длина ячейки
  • Excel vba есть ли формула
  • Excel vba длина текста в ячейке
  • Excel vba есть ли такой лист
  • Excel vba длина string