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

Янв 9, 2025 | Возможности Excel | Нет комментариев

Home 9 Возможности Excel 9 Выпадающий список и выбор нескольких значений в Excel

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

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

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

Возможность предотвращения дублирования выбранного и удаления ненужных элементов поможет оптимизировать ввод данных и повысить точность в ваших электронных таблицах Excel.

Содержание

Как создать выпадающий список с несколькими значениями

Создание выпадающего списка с множественным выбором в Excel включает два шага:

  1. Создайте стандартный список проверки данных в одной или нескольких ячейках. Подробные инструкции вы найдете в статье: 5 способов создать выпадающий список в ячейке Excel.
  2. Вставьте код VBA на лист, где находится ваш выпадающий список.

Вы можете выполнить эти шаги в любом порядке.

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

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

Подробные инструкции и примеры вы можете найти здесь: Выпадающий список Excel при помощи ДВССЫЛ. Здесь же мы рассмотрим альтернативный метод создать выпадающий список из таблицы Excel, который в рекомендованных вам статьях не рассматривался.

Мы будем использовать таблицу Excel с именем Table1, расположенную в диапазоне A2:A25, как показано на скриншоте ниже. Для создания выпадающего списка с данными из этой таблицы выполните следующие действия:

  1. Выберите одну или несколько ячеек для создания выпадающего списка (например, D3:D7).
  2. На вкладке «Данные» в группе «Работа с данными» нажмите кнопку «Проверка данных» и далее выберите «Список».
  3. В поле «Источник» введите функцию ДВССЫЛ, которая косвенно ссылается на столбец в Table1 с именем «Продукты»:
=ДВССЫЛ("Table1[Продукты]")
  1. Когда закончите, нажмите OK.
Как создать выпадающий список из таблицы Excel

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

Шаг 2. Вставка кода VBA для выбора нескольких значений

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

  • Код VBA для множественного выбора с дубликатами
  • Код VBA для выбора нескольких значений без дубликатов
  • Код VBA для выпадающего списка с множественным выбором с удалением дублирующихся элементов

Для добавления кода VBA выполните следующие шаги:

  1. Откройте редактор Visual Basic, нажав Alt + F11.
  2. На панели VBA Project слева дважды щелкните имя рабочего листа, содержащего ваш выпадающий список. Это откроет окно «Код» для этого листа. Или щелкните правой кнопкой мыши на вкладке с именем листа и выберите «Просмотреть код» в контекстном меню.
  3. В окне «Код» вставьте код VBA.
  4. Закройте редактор VBA и сохраните файл как рабочую книгу с поддержкой макросов (.xlsm).
как правильно вставить код VBA

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

Excel выпадающий список с  возможностью несколько раз выбрать одно и то же значение

Код VBA для выбора нескольких элементов

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

Option Explicit
Private Sub Worksheet_Change(ByVal Destination As Range)
Dim DelimiterType As String
Dim rngDropdown As Range
Dim oldValue As String
Dim newValue As String
DelimiterType = ", "
If Destination.Count > 1 Then Exit Sub

On Error Resume Next
Set rngDropdown = Cells.SpecialCells(xlCellTypeAllValidation)
On Error GoTo exitError

If rngDropdown Is Nothing Then GoTo exitError

If Intersect(Destination, rngDropdown) Is Nothing Then
   'do nothing
Else
  Application.EnableEvents = False
  newValue = Destination.Value
  Application.Undo
  oldValue = Destination.Value
  Destination.Value = newValue
    If oldValue = "" Then
      'do nothing
    Else
      If newValue = "" Then
        'do nothing
      Else
        Destination.Value = oldValue & DelimiterType & newValue
        ' add new value with delimiter
      End If
    End If
End If

exitError:
  Application.EnableEvents = True
End Sub

Как работает этот код:

  • Код позволяет выбор нескольких значений во всех выпадающих списках на данном листе.
  • Код работает только на текущем листе, поэтому добавьте его на каждый лист, где требуется множественный выбор.
  • Код позволяет дублировать элементы, то есть выбирать один и тот же элемент несколько раз.
  • Выбранные элементы разделены запятой и пробелом. Чтобы изменить разделитель, замените «, » на нужный символ в строке DelimiterType = «, » (строка 7 в коде).

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

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

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

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

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

Option Explicit
Private Sub Worksheet_Change(ByVal Destination As Range)
Dim rngDropdown As Range
Dim oldValue As String
Dim newValue As String
Dim DelimiterType As String
DelimiterType = ", "

If Destination.Count > 1 Then Exit Sub

On Error Resume Next
Set rngDropdown = Cells.SpecialCells(xlCellTypeAllValidation)
On Error GoTo exitError

If rngDropdown Is Nothing Then GoTo exitError

If Intersect(Destination, rngDropdown) Is Nothing Then
   'do nothing
Else
  Application.EnableEvents = False
  newValue = Destination.Value
  Application.Undo
  oldValue = Destination.Value
  Destination.Value = newValue
    If oldValue <> "" Then
    If newValue <> "" Then
        If oldValue = newValue Or _
            InStr(1, oldValue, DelimiterType & newValue) Or _
            InStr(1, oldValue, newValue & Replace(DelimiterType, " ", "")) Then
            Destination.Value = oldValue
                Else
            Destination.Value = oldValue & DelimiterType & newValue
        End If
    End If
    End If
End If

exitError:
  Application.EnableEvents = True
End Sub

Несколько значений из выпадающего списка с возможностью удаления элемента

При необходимости пользователи могут удалить ненужные или ошибочно выбранные элементы. 

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

Option Explicit
Private Sub Worksheet_Change(ByVal Destination As Range)
Dim rngDropdown As Range
Dim oldValue As String
Dim newValue As String
Dim DelimiterType As String
DelimiterType = ", "
Dim DelimiterCount As Integer
Dim TargetType As Integer
Dim i As Integer
Dim arr() As String

If Destination.Count > 1 Then Exit Sub
On Error Resume Next

Set rngDropdown = Cells.SpecialCells(xlCellTypeAllValidation)
On Error GoTo exitError

If rngDropdown Is Nothing Then GoTo exitError

TargetType = 0
    TargetType = Destination.Validation.Type
    If TargetType = 3 Then  ' is validation type is "list"
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        newValue = Destination.Value
        Application.Undo
        oldValue = Destination.Value
        Destination.Value = newValue
        If oldValue <> "" Then
            If newValue <> "" Then
                If oldValue = newValue Or oldValue = newValue & Replace(DelimiterType, " ", "") Or oldValue = newValue & DelimiterType Then ' leave the value if there is only one in the list
                    oldValue = Replace(oldValue, DelimiterType, "")
                    oldValue = Replace(oldValue, Replace(DelimiterType, " ", ""), "")
                    Destination.Value = oldValue
                ElseIf InStr(1, oldValue, DelimiterType & newValue) Or InStr(1, oldValue, " " & newValue & DelimiterType) Then
                    arr = Split(oldValue, DelimiterType)
                If Not IsError(Application.Match(newValue, arr, 0)) = 0 Then
                    Destination.Value = oldValue & DelimiterType & newValue
                        Else:
                    Destination.Value = ""
                    For i = 0 To UBound(arr)
                    If arr(i) <> newValue Then
                        Destination.Value = Destination.Value & arr(i) & DelimiterType
                    End If
                    Next i
                Destination.Value = Left(Destination.Value, Len(Destination.Value) - Len(DelimiterType))
                End If
                ElseIf InStr(1, oldValue, newValue & Replace(DelimiterType, " ", "")) Then
                    oldValue = Replace(oldValue, newValue, "")
                    Destination.Value = oldValue
                Else
                    Destination.Value = oldValue & DelimiterType & newValue
                End If
                Destination.Value = Replace(Destination.Value, Replace(DelimiterType, " ", "") & Replace(DelimiterType, " ", ""), Replace(DelimiterType, " ", "")) ' remove extra commas and spaces
                Destination.Value = Replace(Destination.Value, DelimiterType & Replace(DelimiterType, " ", ""), Replace(DelimiterType, " ", ""))
                If Destination.Value <> "" Then
                    If Right(Destination.Value, 2) = DelimiterType Then  ' remove delimiter at the end
                        Destination.Value = Left(Destination.Value, Len(Destination.Value) - 2)
                    End If
                End If
                If InStr(1, Destination.Value, DelimiterType) = 1 Then ' remove delimiter as first characters
                    Destination.Value = Replace(Destination.Value, DelimiterType, "", 1, 1)
                End If
                If InStr(1, Destination.Value, Replace(DelimiterType, " ", "")) = 1 Then
                    Destination.Value = Replace(Destination.Value, Replace(DelimiterType, " ", ""), "", 1, 1)
                End If
                DelimiterCount = 0
                For i = 1 To Len(Destination.Value)
                    If InStr(i, Destination.Value, Replace(DelimiterType, " ", "")) Then
                        DelimiterCount = DelimiterCount + 1
                    End If
                Next i
                If DelimiterCount = 1 Then ' remove delimiter if last character
                    Destination.Value = Replace(Destination.Value, DelimiterType, "")
                    Destination.Value = Replace(Destination.Value, Replace(DelimiterType, " ", ""), "")
                End If
            End If
        End If
        Application.EnableEvents = True
        Application.ScreenUpdating = True
    End If

exitError:
  Application.EnableEvents = True
End Sub
Как работает выпадающий список с выбором нескольких значений из списка

Как изменить вид разделителя в списке

Символ, разделяющий элементы, установлен в параметре DelimiterType. По умолчанию используется запятая c пробелом («, «). Этот параметр находится в строке 7 кода. Чтобы изменить разделитель, замените «, » на нужный символ или группу символов.

Например:

  • Чтобы разделить выбранные элементы пробелом, DelimiterType = » «.
  • Чтобы отделить при помощи точки с запятой — DelimiterType = «; » или DelimiterType = «;» (с пробелом или без него).
  • Чтобы разделить несколько значений из выпадающего списка вертикальной чертой, примените DelimiterType = » | «.

Например:

Использование собственного разделителя между выбранными значениями

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

Чтобы записать выбранные значения в несколько строк внутри ячейки, установитезначение DelimiterType – vbCrlf. В VBA это означает возврат каретки и перевод строки.

Итак, вы заменяете эту строку кода:

DelimiterType = «,»

на это:

DelimiterType = vbCrLf

В результате каждой выбранный элемент будет размещён в новой строке:

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

Как установить возможность множественного выбора только для определенных столбцов, строк, ячеек

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

Для этого найдите эту строку кода:

If rngDropdown Is Nothing Then GoTo exitError

Добавьте сразу после него ещё кусочек кода, в котором укажете, в каком месте рабочего листа можно разрешить несколько вариантов выбора.

Выпадающий список множественного выбора для конкретных столбцов.

Чтобы разрешить выбор нескольких элементов в определенном столбце, добавьте этот код:

If Not Destination.Column = 4 Then GoTo exitError

Где «4» — это номер целевого столбца. В данном случае раскрывающийся список с возможностьювыбора нескольких значений будет активен только в столбце D (четвертый по счёту столбец). Во всех других столбцах выпадающий список будет работать как обычно.

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

If Destination.Column <> 4 And Destination.Column <> 6 Then GoTo exitError

В этом случае выпадающий список с несколькими значениями будет доступен в столбцах D (4) и F (6).

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

Чтобы разрешить выбор нескольких значений только в определенных строках, используйте этот код:

If Not Destination.Row = 3 Then GoTo exitError

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

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

If Destination.Row <> 3 And Destination.Row <> 6 Then GoTo exitError

Где «3» и «6» — это строки, в которых разрешено выбирать несколько значений из выпадающего списка.

Выбор нескольких значений только в конкретных ячейках.

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

Для одной ячейки:

If Not Destination.Address = «$D$3» Then GoTo exitError

Для нескольких ячеек:

If Destination.Address <> «$D$3» And Destination.Address <> «$F$6» Then GoTo exitError

Конечно, не забудьте заменить «$D$3» и «$F$6» реальными адресами ваших ячеек.

Как включить возможность выбора нескольких значений на защищенном листе.

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveSheet.Unprotect password:="password"
On Error GoTo exitError2

If Target.Validation.Type = 3 Then
Else
    ActiveSheet.Protect password:="password"
End If

Done:
Exit Sub

exitError2:
  ActiveSheet.Protect password:="password"
End Sub

Замените слово “password” на ваш реальный пароль.

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

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

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

Надеюсь эти статьи также вам будут полезны: