Выпадающий список с мультивыбором

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

Давайте рассмотрим несколько типовых вариантов реализации такого списка с мультивыбором.

Вариант 1. Горизонтальный

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

dropdown-multi-select1.gif

Выпадающие списки в ячейках С2:С5 в данном примере создаются стандартным образом, т.е.

  1. выделить ячейки С2:С5
  2. на вкладке или в меню Данные (Data) выбрать команду Проверка данных (Data Validation)
  3. в открывшемся окне выбрать вариант Список (List) и указать в качестве диапазона Источник (Source) ячейки с исходными данными для списка A1:A8

Затем в модуль листа нужно добавить макрос, который и будет делать всю основную работу, т.е. добавлять выбранные значения справа от зеленых ячеек. Для этого щелкните правой кнопкой мыши по ярлычку листа с выпадающими списками и выберите команду Исходный текст (Source code). В открывшееся окно редактора Visual Basic нужно вставить следующий код:

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
        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

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

Вариант 2. Вертикальный

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

dropdown-multi-select2.gif

Делается совершенно аналогично, но немного меняется код макроса обработчика:

Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Not Intersect(Target, Range("C2:F2")) 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

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

Вариант 3. С накоплением в той же ячейке

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

dropdown-multi-select3.gif

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

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

При желании, можно заменить символ-разделитель (запятую) в 9-й строке кода на свой (например, пробел или точку с запятой).

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


Страницы: 1  2  3  
25.01.2015 12:02:51
Добрый день!
Подскажите, пожалуйста, как редактировать файл с этим макросом (способ 3)? Его необходимо отключать постоянно, чтобы внести изменения или есть другой способ?
Файл постоянно дополняется данными, а этот макрос упрощает работу в 1000 раз....
Спасибо!
25.01.2015 23:38:37
Похоже мне одному не повезло - не работает макрос вообще у меня. Точнее не идет добавление данных, выбирается только какое-либо одно....
29.01.2015 08:07:02
А как сделать, что бы во втором варианте, вертикальном, слева от ячейки порядковый номер добавлялся?
17.02.2015 17:39:27
А как в третьем варианте сделать так чтобы каждое новое значение ставилось не через запятую, а с новой строки.
02.07.2015 15:41:25
Добрый день Николай, спасибо за такой интересный и главное полезный ресурс, для меня как новичка здесь много полезных вещей.
У меня вопрос в следующем:

"Вариант 3. С накоплением в той же ячейке"-используется для составления списка запчастей в ячейке  I3, выпадающий список берет названия из определенного прайс листа ( сделанном на отдельном листе EXEL).
В прайс листе есть соответственно ячейка с названием, артикулом и ценой
Как теперь сделать чтобы в ячейке К3 производилось суммирование цен на эти запчасти взятые из прайс листа.
Буду очень благодарен совету и помощи в реализации.

P.S. В перспективе надеюсь сделать общую форму в которой будут прописываться артикулы названия и цены для заказа запчастей на производстве.
20.07.2015 02:48:16
Добрый день Николай. Есть возможность сделать по первому варианту используя выпадающий список activeX потом отформатировать как таблицу для получения сводной?
24.07.2015 11:20:40
Здравствуйте Николай! Нашел применение варианту № 3 с накоплением в одной ячейке. Подскажите как можно объединить это с заполнением в соседней ячейке и тоже с накоплением. Например выбираю из списка имена они накапливаются, а рядом автоматом накапливаются должности этих людей. для одного сотрудника хорошо работало через =СМЕЩ(Код_должность;ПОИСКПОЗ(H76;Сотрудники;0)-1;0;1;1) как сюда привязать накопление? Не могу сообразить!
12.08.2015 14:39:41
Николай, добрый день! Подскажите пожалуйста, чем вызвана следующая проблема: использую вариант 3 (накопление в одной ячейке), в трех столбцах использую макрос, как и рекомендовалось выше дописала инфо в коде на несколько диапазонов, но как только вручную указываю какие-либо данные в других строках таблицы  макрос перестает работать в заданном диапазоне,  Excel на долго зависает и в ячейке в которой внесла какие-либо данные дублируется текст через запятую несколько раз, такое ощущение, что макрос работает за пределом указанного диапазона в коде :(

Заранее большое спасибо!
19.08.2015 16:12:01
Николай, привет.
Как создать выпадающий список из всех значений А1 по всем листам из другой книги.
06.09.2015 01:30:20
Доброго времени суток.
Вот я на Вашем сайте нашел очень много полезного для себя.
И тут совершенно недавно передо мной встала проблема - мне необходимо сделать "мини калькулятор"
Объясню:
Такая проблема -  мне необходимо сделать выпадающий список, как только я в этом списке выбираю ингредиент - то хочу что бы в соседней колонке сразу прописывалась его цена. Соответственно затем уже  эта цена уже работала с другой формулой.
Такое возможно?
16.10.2015 07:33:46
Николай, добрый день!

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

Как это реализовать?
28.10.2015 19:42:06
Добрый вечер! Подскажите, возможно ли увеличить шрифт/масштаб в выпадающем списке?  На листе масштаб 20-25%, и в списке очень мелко. Сразу уточню, макросы с увеличением масштаба листа при нажатии на ячейку отпадает, неудобно, необходимо именно увеличение размера шрифта/масштаба в списке при неизменном масштабе листа.
01.11.2015 20:43:20
Здравствуйте Николай! Спасибо за полезный материал. Подскажите пожалуйста, как можно применить вариант 3 для использования его в форме VBA для элемента ComboBox?
27.11.2015 09:58:31
Добрый день. Подскажите, пожалуйста, как сделать первый вариант чтобы данные заполнялись не рядом справа от списка, а на одну строчку ниже и вправо, как в примере. спасибо за Вашу помощь;)
05.12.2015 12:42:21
Здравствуйте
При использовании второго примера "Вертикальный список" столкнулся с такой проблемой. Если ячейка выбора значений является объединенной из двух макрос не работает. И еще одна просьба. Возможно ли ячейку выбора списка совместить с "шапкой" столбца. Что бы она была не пустой, а допустим с надписью "Фамилия" или любой другой. Это было бы полезно. Спасибо.
Здравствуйте!  Подскажите, как использовать два варианта (1-й и 3-й) в одном листе ?
Здравствуйте. Office Excel 2007. Применил в файле решение по Варианту 3. "С накоплением в той же ячейке". Дополнительно в 3 строке кода указал через запятую второй диапазон (Range("F:F;I:I";)). Стал наблюдать следующее:
- в таблице файла несколько столбцов со списками и все они стали работать по варианту "С накоплением в той же ячейке", не только "F" и "I";
- в случае, если что-то забыл набрать и требуется вписать строку таблицы между двумя существующими строками, то чистая строка не вставляется (как это работает без кода VBA);
- при попытке скопировать строку таблицы, чтобы её затем вставить ниже, скопированная строка таблицы не вставляется;
- при попытке вырезать строку таблицы, строка принимает очертания скопированной области (но остаётся видимой), а при операции "вставить" просто удаляется из таблицы (информация, содержащаяся в строке удаляется полностью);
- стрелка "Отменить ввод" после каждого ввода становиться неактивной (отменить операцию невозможно).

Вопросы.
1. Как сделать так, чтобы файл позволял вставлять строку между уже набранными строками таблицы, не удаляя существующую в таблице информацию?
2. Как сделать так, чтобы файл позволял копировать (вырезать), а затем вставлять скопированную строку в нужном месте таблицы без потери информации?
3. Как сделать так, чтобы файл позволял отменять операции?
4. Как сделать так, чтобы файл распространял код VBA только на указанные столбцы, а не на всю таблицу?
22.12.2023 08:34:45
потому что через запятую нужно указывать диапазоны, а не точку с запятой
05.05.2016 23:18:49
Большое спасибо за примеры! Очень помогли. Но, в Варианте-3 проблема с клонированием не решена. Вы писали, что подправили, но нынешний код на этой странице видимо не исправлен, и комментах пользователи пишут, что проблема осталась... посмотрите еще раз, пожалуйста.
28.06.2016 10:21:13
Добрый день!

Приобрела вашу книгу, пока тестирую).
Пытаюсь создать связанные выпадающие списки с помощью формулы СМЕЩ(..) .
В вашем примере на стр.22 поняла как вы  исключаете дублирование наименований для марки авто (1уровень), то есть диапазон списка составлен из уникальных наименований марок.
А что если уровней несколько и для последующих необходимо сделать то же самое.
Как сделать так, чтобы в выпадающем списке наименования не дублировались: например, выбрав toyota в следующем уровне чтобы corolla camry carina, а не corolla corolla corolla camry camry camry и т.д.
Спасибо заранее
12.08.2016 13:08:36
Здравствуйте. Мне очень нужен вариант 3 (С накоплением в той же ячейке), в т.ч. для применения в таблицах Google, а они не поддерживают скрипты VB. Я не программист (((. Подскажите, как можно эту функцию реализовать через скрипт Java?
07.10.2016 21:12:50
извините но у меня такой вопрос как удалить ячейку с выпадающими списками
спасибо
25.10.2016 10:50:03
Спасибо за полезный материал!
Подскажите пожалуйста как создать выпадающий список заполняющий сразу несколько ячеек и с определённым периодом в 2-3 ячейки.
01.11.2016 00:05:00
Добрый день! Николай, большое спасибо за ваши труды и помощь.
Хотел поинтересоваться, можно ли совместить элемент ActiveX (поле со списком) и второй вариант (добавление выбранных значений вниз от указанной ячейки)?
07.12.2016 20:54:04
простите за дурацкий вопрос.
Сделала выпадающий список с мультивыбором по варианту № 3 .
Но не могу редактировать ячейку, если выбор сделан неверный - захожу в ячейку, удаляю лишнее, нажимаю Ввод - все удаленное восстанавливается в двойном виде (защита от введения данных не из предустановленного списка снята).
Добрый день!

Спасибо за информативный и очень полезный материал!

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

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

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