Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Элемент управления ComboBox (поле со списком)

    Элемент управления пользовательской формы ComboBox для выбора и ввода информации в VBA Excel. Свойства поля с раскрывающимся списком, заполнение, извлечение данных, примеры кода.

    Элемент управления ComboBox

    Элемент управления ComboBox на пользовательской форме

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

    ComboBox представляет из себя комбинацию двух элементов управления: текстового поля (TextBox) и списка (ListBox), поэтому его еще называют «комбинированным списком» или «полем со списком». Также ComboBox сочетает в себе свойства этих двух элементов управления.

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

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

    Элемент управления ComboBox незаменим при больших списках. При списках из нескольких позиций его можно заменить на ListBox, который отображает позиции для выбора сразу после загрузки формы, не требуя дополнительных действий от пользователя.

    Свойства поля со списком

    Свойство Описание
    AutoSize Автоподбор размера комбинированного поля. True – размер автоматически подстраивается под длину выбранной или введенной строки. False – размер элемента управления определяется свойствами Width и Height.
    AutoTab Включение автоматической табуляции – передачи фокуса следующему элементу управления при достижении максимального числа символов при значениях свойства MaxLenght > 0. True – автоматическая табуляция включена, False – выключена.
    ColumnCount Указывает количество столбцов в раскрывающемся списке. Значение по умолчанию = 1.
    ColumnHeads Добавляет строку заголовков в раскрывающийся список. True – заголовки столбцов включены, False – заголовки столбцов выключены. Значение по умолчанию = False.
    ColumnWidths Ширина столбцов в раскрывающемся списке. Значения для нескольких столбцов указываются в одну строку через точку с запятой (;).
    ControlSource Ссылка на ячейку для ее привязки к элементу управления ComboBox.
    ControlTipText Текст всплывающей подсказки при наведении курсора на элемент управления.
    Enabled Доступ пользователя к полю и раскрывающемуся списку. True – доступ разрешен, False – доступ запрещен*. Значение по умолчанию = True.
    Font Шрифт, начертание и размер текста в поле.
    Height Высота элемента управления ComboBox.
    Left Расстояние от левого края внутренней границы пользовательской формы до левого края комбинированного списка.
    List Позволяет заполнить ComboBox данными из одномерного или двухмерного массива, а также обращаться к отдельным элементам раскрывающегося списка по индексам для записи и чтения.
    ListIndex Номер выбранной пользователем строки в раскрывающемся списке. Нумерация начинается с нуля. Если ничего не выбрано, ListIndex = -1.
    ListRows Количество видимых строк в раскрытом списке. Если общее количество строк больше ListRows, появляется полоса прокрутки. Значение по умолчанию = 8.
    Locked Запрет на отображение раскрывающегося списка, ввод и редактирование данных в поле. True – ввод и редактирование запрещены**, False – ввод и редактирование разрешены. Значение по умолчанию = False.
    MatchRequired Задает проверку вводимых в поле строк с элементами списка. True – проверка включена (допускается ввод только строк, совпадающих с элементами списка), False – проверка выключена (допускается ввод любых строк). Значение по умолчанию = False.
    MaxLenght Максимальная длина строки в поле. Значение по умолчанию = 0, что означает – ограничений нет.
    RowSource Источник строк для раскрывающегося списка (адрес диапазона на рабочем листе Excel).
    TabIndex Целое число, определяющее позицию элемента управления в очереди на получение фокуса при табуляции. Отсчет начинается с 0.
    Text Текстовое содержимое (значение) поля (=Value).
    TextAlign Выравнивание текста в поле: 1 (fmTextAlignLeft) – по левому краю, 2 (fmTextAlignCenter) – по центру, 3 (fmTextAlignRight) – по правому краю.
    Top Расстояние от верхнего края внутренней границы пользовательской формы до верхнего края комбинированного списка.
    Value Текстовое содержимое (значение) поля (=Text).
    Visible Видимость поля со списком. True – ComboBox отображается на пользовательской форме, False – ComboBox скрыт.
    Width Ширина элемента управления.

    * При Enabled в значении False пользователь не может раскрывать список, а также вводить или редактировать данные в поле.
    ** Для элемента управления ComboBox действие свойства Locked в значении True аналогично действию свойства Enabled в значении False.

    В таблице перечислены только основные, часто используемые свойства поля со списком. Еще больше доступных свойств отображено в окне Properties элемента управления ComboBox, а все методы, события и свойства – в окне Object Browser.

    Вызывается Object Browser нажатием клавиши «F2». Слева выберите объект ComboBox, а справа смотрите его методы, события и свойства.

    Свойства BackColor, BackStyle, BorderColor, BorderStyle отвечают за внешнее оформление комбинированного списка и его границ. Попробуйте выбирать доступные значения этих свойств в окне Properties, наблюдая за изменениями внешнего вида элемента управления ComboBox на проекте пользовательской формы.

    Способы заполнения ComboBox

    Используйте метод AddItem для загрузки элементов в поле со списком по одному:

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

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

    Используйте свойство RowSource, чтобы загрузить в ComboBox значения из диапазона ячеек рабочего листа:

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

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

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

    Привязка поля со списком к ячейке

    Чтобы привязать комбинированный список к ячейке на рабочем листе Excel, необходимо свойству ControlSource присвоить адрес ячейки. Это можно сделать непосредственно в окне Properties элемента управления ComboBox или в коде VBA:

    UserForm1.ComboBox1.ControlSource = "Лист1!B2"

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

    В результате привязки образуется взаимосвязь между свойством Value комбинированного списка и значением ячейки. Все изменения в поле ComboBox дублируются в привязанной ячейке и наоборот, изменения в ячейке приводят к изменению текста в поле.

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

    В результате работы кода пользовательская форма откроется в немодальном окне со значением в поле, скопированном из ячейки «A1» активного листа. Немодальное окно формы позволит редактировать ячейку «A1», не закрывая форму.

    Меняйте значение ячейки «A1», нажимайте клавишу «Tab» или «Enter», поле комбинированного списка примет значение ячейки. Меняйте значение поля ComboBox1 с помощью клавиатуры или выбирайте из раскрывающегося списка, нажимайте клавишу «Tab» или «Enter», ячейка «A1» примет значение поля со списком.

    Дополнительный элемент управления на форме нужен для передачи ему фокуса нажатием клавиши «Tab» или «Enter», чтобы завершить ввод значения в поле ComboBox1. Иначе новое значение поля будет передано в ячейку «A1» только при закрытии формы.

    Значение ComboBox по умолчанию

    В раскрывающийся список элемента управления ComboBox1 загружены названия семи основных цветов:

    Есть несколько вариантов сделать так, чтобы при открытии пользовательской формы в поле ComboBox1 было отображено значение по умолчанию. Код следует вставлять перед строкой «End With».

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

    UserForm1.ComboBox1.ControlTipText = "Выберите значение из списка"

    Извлечение информации из ComboBox

    Первоначально элемент управления ComboBox открывается с пустым полем или значением по умолчанию. Свойства Value и Text в этом случае возвращают пустую строку или текст по умолчанию.

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

    Вторую строку кода можно записать myTxt = UserForm1.ComboBox1, так как Value является свойством поля со списком по умолчанию.

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

    Иногда перед загрузкой в ComboBox требуется отобрать уникальные элементы из имеющегося списка. Смотрите, как это сделать с помощью объектов Collection и Dictionary.

    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    26 комментариев для “VBA Excel. Элемент управления ComboBox (поле со списком)”

    1. Евгений

      Доброе утро, Евгений
      Хочу чтобы в пользовательской форме, при каждом обновлении combobox1.value, менялось textbox1.value в зависимости от значения комбобокса1.
      Подскажите, пожалуйста, как запускать процедуру, при каждом обновлении значения комбобокса

      1. Евгений Ф

        Здравствуйте, Евгений!
        Добавьте в модуль формы следующий код:

        Процедура будет запускаться автоматически.

        1. Евгений

          Спасибо
          Но теперь другая напасть. Вот кусок кода:

          Он работает если вставлять наименование полностью (ctrl+C, ctrl+V), если писать по буквам выдает ошибку «рантайм эрор 1004». То есть VLookup не может найти такого значения в диапазоне unit1 и прекращает процедуру.

          1. Евгений

            Пока решил так)

            1. Евгений Ф

              Думаю, так будет лучше:

    2. Здравствуйте!
      Имеется таблица (например, фамилия, имя, отчество, номер телефона, дата рождения, город проживания), при нажатии на кнопку «Редактировать», размещенную на листе с таблицей, открывается форма, где выбирается одно из значений определенного поля (например, фамилия) через ComboBox.
      Подскажите, пожалуйста, как реализовать открытие новой формы, в которой будут указаны данные в TextBox, соответствующие остальным значениям столбцов (имя, отчество и тд). Нужно их просто отредактировать и вернуть в ту же строку, без создания новой записи.
      Не могу понять, как правильно это все организовать, поэтому никаких набросков своего кода не могу скинуть…
      Буду очень благодарна, если Вы подскажете что-то. Заранее спасибо!

      1. Евгений

        Здравствуйте, Дарья!
        Возможно, вам подойдет автоформа Excel. Перейти быстро к нужной строке можно с помощью бегунка, расположенного справа от полей. После редактирования текста в полях, нажимаете кнопку «Закрыть», и значения в таблице изменяются. При закрытии автоформы крестиком, значения в таблице не меняются. Где найти автоформу, смотрите в параграфе Работа с «Умной таблицей». Автоформа работает с любой таблицей, а не только с «Умной».

    3. наталья

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

    4. Здравствуйте! Как связать между собой два списка, принцип:
      Есть список — категории, к примеру: томат, баклажаны, перец и т.д.; и есть сорта каждой категории.
      Задача: чтобы после выбора из списка категории и заполнения в ячейку, в следующем столбце Сорта при выборе использовался список соответствующий выбранной категории.
      На примере:
      Имеется три списка Томат, Баклажаны, Перец, которые содержат соответственно к ним сорта.
      В таблице для заполнения в столбце категория выбираю из списка Томат.
      В столбце сорта при вводе использовался только список сортов, указанных в данных Томат.
      Спасибо!

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

    5. Здравствуйте. Подскажите пожалуйста, как VBA в список "ComboBox1" вставить названия ярлычков листов книги. И затем при выборе строки в "ComboBox1" перейти на выбранный лист.

      1. Евгений

        Здравствуйте, Васил!
        Разместите обе процедуры в модуле формы:

        1. Евгений, спасибо. Подскажите где то место в коде(в модуле формы), куда вставить Ваш код. При работе с вставленными на форму объектами открывается их код. Код формы не могу найти, тем более для инициализации формы.

          1. Имею ввиду, как попасть к этому месту кода или где конкретно это вставлять
            "Private Sub UserForm_Initialize()"
            🙁

            1. Нашел "..сочетанием клавиш Alt+F11 и нажмите на пункт меню «Insert».." (раньше не получалось, поэтому и спрашивал). Код вставил для инициализации. Но выдает ошибку. При F5 выдает ошибку 424. При Debug подкрашивает код "ComboBox1.AddItem mySh.Name". 🙂 ???

      2. Евгений

        1. Создайте новую пользовательскую форму Insert > UserForm.
        2. Перетащите с окошка Toolbox элемент управления ComboBox на форму, он, по умолчанию, будет называться ComboBox1.
        3. Сделайте двойной клик по форме, тогда откроется модуль формы.
        4. Удалите из модуля формы код, который автоматически сгенерировался при переходе к модулю.
        5. Вставьте вместо удаленного кода две мои процедуры.
        6. Вставьте курсор мыши в любое место внутри процедуры Private Sub UserForm_Initialize() и нажмите F5.
        7. Выбирайте в ComboBox1 имя листа, и он будет активирован.

    6. Так как работаем с разным направлением информации, на листе размещаю три CommandButton. Подскажите пожалуйста код чтобы подтягивать данные из разных файлов, например "Ресурсы", "Предприятия", "Услуги". Потом программа пробежится по ярлыкам открытого файла, загрузит наименования ярлыков в список ComboBox и при выборе строки ComboBox перейдет на лист выбранного ярлыка. Возможно предложите делать все в одном файле, но наименования ярлыков начинать с кодовой строки "Рес…" от Ресурс, "Пре…" от Предприятие, "Усл…" от Услуга. После кодовой части пойдет наименование позиции: "РесХлеб", "РесЗерно"; "ПреПекарня1", "ПреПекарня2"; "УслВыпечка", "УслПродажа". Если второй вариант практичнее (не будет нескольких файлов, всё в одном), то как делать выбор среди ярлыков при нажатии на разные кнопки?

    7. Подскажите пожалуйста, как в список ComboBox собрать наименования ярлыков из другой книги xls?

      1. Евгений

        Вместо "НоваяКнига.xlsx" впишите имя своей книги, которая должна быть предварительно открыта:

        1. Евгений, спасибо! Извиняюсь, что нагружаю. Как это сделать если другие книги закрыты но лежат в той же папке, что и файл в котором работаю?
          И риторический вопрос. Смотрю на пользовательскую форму UserForm (модальную) и не вижу надобности в ней в своем проекте, тем более, что пока модальная форма открыта нельзя работать с основной. Подскажите пожалуйста где можно почитать о свойствах и возможностях UserForm.

          1. Евгений

            Добрый день, Васил!
            Открытие файла из той же папки:

            Открытие формы в немодальном окне:

    8. Здравствуйте. Можно ли сделать, если Да, то как, чтобы ярлык с рабочего стола открывал не рабочую книгу с листами xls, а UserForm ? А с пользовательской формы побежим уже по листам (или разным книгам).

      1. Евгений

        В VBA Excel можно автоматически открыть форму только вместе с книгой. Для этого надо поместить в модуль книги следующую процедуру:

    Обсуждение закрыто.