Элемент управления пользовательской формы ComboBox для выбора и ввода информации в VBA Excel. Свойства поля с раскрывающимся списком, заполнение, извлечение данных, примеры кода.
Элемент управления ComboBox
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 для загрузки элементов в поле со списком по одному:
1 2 3 4 5 |
With UserForm1.ComboBox1 .AddItem "Элемент 1" .AddItem "Элемент 2" .AddItem "Элемент 3" End With |
Используйте свойство List, чтобы скопировать одномерный массив значений в элемент управления ComboBox:
1 2 |
UserForm1.ComboBox1.List = Array("Строка 1", _ "Строка 2", "Строка 3", "Строка 4", "Строка 5") |
Вместо функции Array можно использовать переменные одномерных и двухмерных массивов. При загрузке значений из двухмерного массива, требуется предварительно указать количество столбцов в комбинированном списке.
Используйте свойство RowSource, чтобы загрузить в ComboBox значения из диапазона ячеек рабочего листа:
1 |
UserForm1.ComboBox1.RowSource = "Лист5!B1:B15" |
При загрузке данных из диапазона, содержащего более одного столбца, требуется предварительно указать количество столбцов в комбинированном списке:
1 2 3 4 5 |
With UserForm1.ComboBox1 'Указываем количество столбцов .ColumnCount = 5 .RowSource = "'Таблица с данными'!A1:E20" End With |
В качестве имени листа используется имя ярлыка. Если имя листа содержит пробелы, оно заключается в одинарные кавычки.
Подробнее о заполнении элемента управления ComboBox вы можете ознакомиться в отдельной статье с наглядными примерами. И еще более подробно – в статье о заполнении ListBox, так как ListBox заполняется теми же способами, что и ComboBox.
Привязка поля со списком к ячейке
Чтобы привязать комбинированный список к ячейке на рабочем листе Excel, необходимо свойству ControlSource присвоить адрес ячейки. Это можно сделать непосредственно в окне Properties элемента управления ComboBox или в коде VBA:
UserForm1.ComboBox1.ControlSource = "Лист1!B2"
Имя листа для составного адреса ячейки берется из названия ярлыка. Если имя листа содержит пробелы, оно заключается в одинарные кавычки. При указании адреса без имени листа, ComboBox привязывается к ячейке на активном листе.
В результате привязки образуется взаимосвязь между свойством Value комбинированного списка и значением ячейки. Все изменения в поле ComboBox дублируются в привязанной ячейке и наоборот, изменения в ячейке приводят к изменению текста в поле.
Чтобы протестировать результаты привязки ячейки к полю со списком ComboBox1, разместите на пользовательской форме UserForm1 еще какой-нибудь элемент управления и запустите следующий код VBA Excel:
1 2 3 4 5 6 7 8 9 10 11 |
Sub Test() With UserForm1.ComboBox1 'Заполняем список ComboBox1 данными .List = Array("Красный", "Оранжевый", "Желтый", _ "Зеленый", "Голубой", "Синий", "Фиолетовый") 'Привязываем ComboBox1 к ячейке "A1" .ControlSource = "A1" 'Открываем форму в немодальном окне End With UserForm1.Show 0 End Sub |
В результате работы кода пользовательская форма откроется в немодальном окне со значением в поле, скопированном из ячейки «A1» активного листа. Немодальное окно формы позволит редактировать ячейку «A1», не закрывая форму.
Меняйте значение ячейки «A1», нажимайте клавишу «Tab» или «Enter», поле комбинированного списка примет значение ячейки. Меняйте значение поля ComboBox1 с помощью клавиатуры или выбирайте из раскрывающегося списка, нажимайте клавишу «Tab» или «Enter», ячейка «A1» примет значение поля со списком.
Дополнительный элемент управления на форме нужен для передачи ему фокуса нажатием клавиши «Tab» или «Enter», чтобы завершить ввод значения в поле ComboBox1. Иначе новое значение поля будет передано в ячейку «A1» только при закрытии формы.
Значение ComboBox по умолчанию
В раскрывающийся список элемента управления ComboBox1 загружены названия семи основных цветов:
1 2 3 4 5 6 7 |
Private Sub UserForm_Initialize() With Me.ComboBox1 .List = Array("Красный", "Оранжевый", "Желтый", _ "Зеленый", "Голубой", "Синий", "Фиолетовый") 'Сюда добавляем код вставки значения по умолчанию End With End Sub |
Есть несколько вариантов сделать так, чтобы при открытии пользовательской формы в поле ComboBox1 было отображено значение по умолчанию. Код следует вставлять перед строкой «End With».
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'Вариант 1 (произвольная строка) .Value = "Моя строка по умолчанию" 'или .Value = "Синий" 'Вариант 2 (произвольная строка) .ControlSource = "A1" Range("A1") = "Моя строка по умолчанию" 'или .ControlSource = "A1" Range("A1") = "Желтый" 'Вариант 3 (строка из списка) .ListIndex = 0 'Красный 'или .ListIndex = 3 'Зеленый |
Кроме значения по умолчанию, в свойства комбинированного списка можно добавить текст всплывающей подсказки, который будет отображаться при наведении на ComboBox курсора:
UserForm1.ComboBox1.ControlTipText = "Выберите значение из списка"
Извлечение информации из ComboBox
Первоначально элемент управления ComboBox открывается с пустым полем или значением по умолчанию. Свойства Value и Text в этом случае возвращают пустую строку или текст по умолчанию.
Если пользователь выбрал новое значение из раскрывающегося списка или ввел его с клавиатуры, оно перезапишет значения свойств Value и Text. Из этих свойств мы с помощью кода VBA Excel извлекаем информацию, выбранную или введенную пользователем:
1 2 3 4 |
Dim myTxt As String myTxt = UserForm1.ComboBox1.Value 'или myTxt = UserForm1.ComboBox1.Text |
Вторую строку кода можно записать myTxt = UserForm1.ComboBox1
, так как Value является свойством поля со списком по умолчанию.
Если вас интересует, как извлечь значение из многостолбцового раскрывающегося списка, смотрите об этом в статье с описанием элемента управления ListBox. Извлечение данных из комбинированного поля аналогично извлечению данных из ListBox. Знакомясь со статьей, следует учесть, что у ComboBox отсутствует многострочный выбор.
Иногда перед загрузкой в ComboBox требуется отобрать уникальные элементы из имеющегося списка. Смотрите, как это сделать с помощью объектов Collection и Dictionary.
Доброе утро, Евгений
Хочу чтобы в пользовательской форме, при каждом обновлении combobox1.value, менялось textbox1.value в зависимости от значения комбобокса1.
Подскажите, пожалуйста, как запускать процедуру, при каждом обновлении значения комбобокса
Здравствуйте, Евгений!
Добавьте в модуль формы следующий код:
Процедура будет запускаться автоматически.
Спасибо
Но теперь другая напасть. Вот кусок кода:
Он работает если вставлять наименование полностью (ctrl+C, ctrl+V), если писать по буквам выдает ошибку «рантайм эрор 1004». То есть VLookup не может найти такого значения в диапазоне unit1 и прекращает процедуру.
Пока решил так)
Думаю, так будет лучше:
Спасибо
Здравствуйте!
Имеется таблица (например, фамилия, имя, отчество, номер телефона, дата рождения, город проживания), при нажатии на кнопку «Редактировать», размещенную на листе с таблицей, открывается форма, где выбирается одно из значений определенного поля (например, фамилия) через ComboBox.
Подскажите, пожалуйста, как реализовать открытие новой формы, в которой будут указаны данные в TextBox, соответствующие остальным значениям столбцов (имя, отчество и тд). Нужно их просто отредактировать и вернуть в ту же строку, без создания новой записи.
Не могу понять, как правильно это все организовать, поэтому никаких набросков своего кода не могу скинуть…
Буду очень благодарна, если Вы подскажете что-то. Заранее спасибо!
Здравствуйте, Дарья!
Возможно, вам подойдет автоформа Excel. Перейти быстро к нужной строке можно с помощью бегунка, расположенного справа от полей. После редактирования текста в полях, нажимаете кнопку «Закрыть», и значения в таблице изменяются. При закрытии автоформы крестиком, значения в таблице не меняются. Где найти автоформу, смотрите в параграфе Работа с «Умной таблицей». Автоформа работает с любой таблицей, а не только с «Умной».
Добрый день, помогите, пожалуйста с такой проблемой: в форме есть ComboBox, какой должен быть код, чтобы при появлении значений полей в форме, соответствующие записи выделялись в исходном списке. А при нажатии на другую кнопку в исходном списке должна быть удалена запись, представленная в форме.
Здравствуйте! Как связать между собой два списка, принцип:
Есть список — категории, к примеру: томат, баклажаны, перец и т.д.; и есть сорта каждой категории.
Задача: чтобы после выбора из списка категории и заполнения в ячейку, в следующем столбце Сорта при выборе использовался список соответствующий выбранной категории.
На примере:
Имеется три списка Томат, Баклажаны, Перец, которые содержат соответственно к ним сорта.
В таблице для заполнения в столбце категория выбираю из списка Томат.
В столбце сорта при вводе использовался только список сортов, указанных в данных Томат.
Спасибо!
С помощью выпадающих списков получилось сделать, однако без возможности поиска по части слова очень сложно искать нужное значение если выпадающий список содержит множество значений.
Здравствуйте. Подскажите пожалуйста, как VBA в список "ComboBox1" вставить названия ярлычков листов книги. И затем при выборе строки в "ComboBox1" перейти на выбранный лист.
Здравствуйте, Васил!
Разместите обе процедуры в модуле формы:
Евгений, спасибо. Подскажите где то место в коде(в модуле формы), куда вставить Ваш код. При работе с вставленными на форму объектами открывается их код. Код формы не могу найти, тем более для инициализации формы.
Имею ввиду, как попасть к этому месту кода или где конкретно это вставлять
"Private Sub UserForm_Initialize()"
🙁
Нашел "..сочетанием клавиш Alt+F11 и нажмите на пункт меню «Insert».." (раньше не получалось, поэтому и спрашивал). Код вставил для инициализации. Но выдает ошибку. При F5 выдает ошибку 424. При Debug подкрашивает код
"ComboBox1.AddItem mySh.Name"
. 🙂 ???1. Создайте новую пользовательскую форму Insert > UserForm.
2. Перетащите с окошка Toolbox элемент управления ComboBox на форму, он, по умолчанию, будет называться ComboBox1.
3. Сделайте двойной клик по форме, тогда откроется модуль формы.
4. Удалите из модуля формы код, который автоматически сгенерировался при переходе к модулю.
5. Вставьте вместо удаленного кода две мои процедуры.
6. Вставьте курсор мыши в любое место внутри процедуры Private Sub UserForm_Initialize() и нажмите F5.
7. Выбирайте в ComboBox1 имя листа, и он будет активирован.
Отлично! Спасибо!
Так как работаем с разным направлением информации, на листе размещаю три CommandButton. Подскажите пожалуйста код чтобы подтягивать данные из разных файлов, например "Ресурсы", "Предприятия", "Услуги". Потом программа пробежится по ярлыкам открытого файла, загрузит наименования ярлыков в список ComboBox и при выборе строки ComboBox перейдет на лист выбранного ярлыка. Возможно предложите делать все в одном файле, но наименования ярлыков начинать с кодовой строки "Рес…" от Ресурс, "Пре…" от Предприятие, "Усл…" от Услуга. После кодовой части пойдет наименование позиции: "РесХлеб", "РесЗерно"; "ПреПекарня1", "ПреПекарня2"; "УслВыпечка", "УслПродажа". Если второй вариант практичнее (не будет нескольких файлов, всё в одном), то как делать выбор среди ярлыков при нажатии на разные кнопки?
Подскажите пожалуйста, как в список ComboBox собрать наименования ярлыков из другой книги xls?
Вместо "НоваяКнига.xlsx" впишите имя своей книги, которая должна быть предварительно открыта:
Евгений, спасибо! Извиняюсь, что нагружаю. Как это сделать если другие книги закрыты но лежат в той же папке, что и файл в котором работаю?
И риторический вопрос. Смотрю на пользовательскую форму UserForm (модальную) и не вижу надобности в ней в своем проекте, тем более, что пока модальная форма открыта нельзя работать с основной. Подскажите пожалуйста где можно почитать о свойствах и возможностях UserForm.
Добрый день, Васил!
Открытие файла из той же папки:
Открытие формы в немодальном окне:
Здравствуйте. Можно ли сделать, если Да, то как, чтобы ярлык с рабочего стола открывал не рабочую книгу с листами xls, а UserForm ? А с пользовательской формы побежим уже по листам (или разным книгам).
В VBA Excel можно автоматически открыть форму только вместе с книгой. Для этого надо поместить в модуль книги следующую процедуру:
СПАСИБО!!!
Обсуждение закрыто.