Элемент управления ComboBox VBA языка позволяет формировать комбинированный список. Он предоставляет возможность, как выбирать готовые значения, так и вводить собственные данные. Вообще, стоит сказать, что робота со списками требует отдельной темы по определению, так как наиболее ярким примером создания сложных и комбинированных списков является — формирование базы данных.
Однако и тут есть один момент – большая часть возможностей языка VBA отходит на задний план. Даже продукт Microsoft Access (работа с базами данных), который в былые времена я скрупулезно изучал на уроках информатики, мне на практике ни разу не пригодился.
Поэтому, и в этой статье я не буду вникать во все премудрости компонента ComboBox.
Базовые свойства элемента управления ComboBox VBA языка:
- ColumnCount – позволяет задать количество столбиков в списке
- ColumnWidth – ширина столбиков
- ColumnHeads – определяет, отображать (значение true) или не отображать (значение false) заголовки столбиков.
- RowSource – позволяет задать диапазон для элементов списка
- Value и Text – собственно, текущее значение, что хранится в списке.
Как и для компонента TextBox, для ComboBox главным событием является Change. Событие Change возникает при вводе данных в список.
Ладно, пора приступать к практике. Сначала мы напишем пример использования объекта языка VBA ComboBox в Excel, а потом в Word.
VBA ComboBox Excel
И так, добавьте в окно Проекта новый модуль и новую форму. Модуль назовите ComboBox, а форму – CB_Form, за имена отвечает свойство Name. В редакторе кода для модуля пропишите следующую процедуру:
Sub ComboBox() CB_Form.Show End Sub
Процедура сделает форму видимой.
Теперь нужно приступить к созданию и настройке формы. Как она выглядит, вы можете просмотреть на картинке, но… для “слепого” браузера я ее опишу.
Параметры формы (UserForm): название (Caption) — работа с ComboBox в VBA, ширина – 340, высота – 190.
Параметры надписи (Label): Имя (Name) L_CB, свойство Caption оставляете пустым, ширина 324, высота 30, отступ слева и сверху равен 6.
Далее нам следует добавить четыре элемента управления vba ComboBox excel, разместите их так: по два в одну строку, имена для каждого компонента задайте такие: CB_A, CB_B, CB_C и CB_D. Я выбрал такие имена потому, что в каждом списке будет отображаться содержимое текущего листа Excel для колонок A, B, C и D.
Это важно!!! Позаботьтесь, что бы содержимое колонок A-B не было пустым и что бы количество в них элементов не было слишком огромным, достаточно 100 записей максимум. В противном случае у вас возникнут ошибки.
Для наглядности над каждым объектом ComBox vba можете поставить надписи вида: Ячейка А, Ячейка В и так далее.
В самом низу, разместите, кнопку с именем CommandButton1 и напишите на ней “Объединить”.
Ладно, теперь в редакторе кода для форму пропишите следующие процедуры:
Private Sub CommandButton1_Click() L_CB.Caption = CB_A.Value & " " & _ CB_B.Value & " " & _ CB_C.Value & " " & _ CB_D.Value End Sub Private Sub UserForm_Initialize() Dim oColumn As Range Dim oCell As Range 'Заполняем первый список Set oColumn = Columns("A") For Each oCell In oColumn.Cells If oCell.Value <> "" Then CB_A.AddItem oCell.Value End If Next CB_A.ListIndex = 0 'Заполняем второй список Set oColumn = Columns("B") For Each oCell In oColumn.Cells If oCell.Value <> "" Then CB_B.AddItem oCell.Value End If Next CB_B.ListIndex = 0 'Заполняем третий список Set oColumn = Columns("C") For Each oCell In oColumn.Cells If oCell.Value <> "" Then CB_C.AddItem oCell.Value End If Next CB_C.ListIndex = 0 'Заполняем четвертый список Set oColumn = Columns("D") For Each oCell In oColumn.Cells If oCell.Value <> "" Then CB_D.AddItem oCell.Value End If Next CB_D.ListIndex = 0 End Sub
Процедура CommandButton1_Click – тут происходит обработка клика по кнопке. После клика, произойдет считывание выбранных данных для каждого объекта ComboBox vba excel, далее, все четыре значения объединяются и записываются в содержимое свойства Caption объекта Надпись.
Процедура UserForm_Initialize – тут происходит заполнение списков содержимым колонок сразу после инициализации формы. Происходит выбор заданной колонки листа Excel, потом циклично идет перебор всех ее значений и их добавление (метод AddItem) в выбранный список.
VBA ComboBox Word
Тут мы создадим список, состоящий из трех колонок, как он выглядит, можно посмотреть на рисунке. Не буду вникать во все премудрости, а сразу покажу код:
Private Sub UserForm_Initialize() With ComboBox1 .ColumnCount = 3 .ColumnWidths = "50;50;50" .ColumnHeads = False .RowSource = "" End With ComboBox1.AddItem "Украина" ComboBox1.List(0, 1) = "Киев" ComboBox1.List(0, 2) = "Украинский" ComboBox1.AddItem "Россия" ComboBox1.Column(1, 1) = "Москва" ComboBox1.Column(2, 1) = "руский" ComboBox1.AddItem "Белоруссия" ComboBox1.List(2, 1) = "Минск" ComboBox1.List(2, 2) = "русский" ComboBox1.ListIndex = 0 End Sub
Как видим, при инициализации мы сначала заполняем свойства объекта ComboBox1 в блоке with … wend: три колонки, равной длины, заголовки отсутствуют. Далее происходит ручное заполнение списка. Как видим, элемент первой колонки добавляется с помощью метода AddItem, остальные колонки заполняются как массивы с помощью метода List.
0 / 0 / 0 Регистрация: 15.03.2014 Сообщений: 3 |
|
1 |
|
15.03.2014, 06:14. Показов 9521. Ответов 4
Есть форма, которая создает список литературы в ворде 2010. Необходимо создать combobox, чтобы задать тип источника. Не показывает, собака, данные! Ни через additem, ни через массив. Есть userform1_activate, если добавлять код туда, тоже не отображает элементы. Помогите пожалуйста!
0 |
2784 / 716 / 106 Регистрация: 04.02.2011 Сообщений: 1,443 |
|
15.03.2014, 11:33 |
2 |
Странно, у меня показывает. Смотри:
0 |
mc-black 2784 / 716 / 106 Регистрация: 04.02.2011 Сообщений: 1,443 |
||||||
15.03.2014, 11:46 |
3 |
|||||
Вложения
0 |
0 / 0 / 0 Регистрация: 15.03.2014 Сообщений: 3 |
|
15.03.2014, 12:45 [ТС] |
4 |
Добавлено через 1 минуту
0 |
0 / 0 / 0 Регистрация: 09.04.2015 Сообщений: 1 |
|
16.06.2015, 09:35 |
5 |
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
16.06.2015, 09:35 |
5 |
Заполнение ComboBox данными с помощью кода VBA Excel. Добавление значений в поле со списком методом AddItem, из массива и из диапазона рабочего листа. Примеры.
Заполнение ComboBox методом AddItem
Создайте пользовательскую форму UserForm1 и разместите на ней поле со списком ComboBox1. Используйте метод AddItem для заполнения элемента управления значениями:
Sub Test1() With UserForm1.ComboBox1 .AddItem «Кружка» .AddItem «Стакан» .AddItem «Бокал» .AddItem «Пиала» .AddItem «Фужер» End With UserForm1.Show End Sub |
Скопируйте код и запустите его выполнение, на открывшейся форме раскройте поле со списком, в результате увидите, что элемент управления ComboBox1 заполнен соответствующими значениями:
Для заполнения элемента управления ComboBox значениями из массива будем использовать свойство поля со списком List и функцию Array:
Sub Test2() With UserForm1 .ComboBox1.List = Array(«Кружка», «Стакан», «Бокал», «Пиала», «Фужер») .Show End With End Sub |
Результат выполнения кода будет таким же, как и на предыдущем изображении.
Таким же образом можно использовать не только функцию Array, но и переменную массива, предварительно объявленную и заполненную значениями:
Sub Test3() Dim a(4) As String a(0) = «Кружка» a(1) = «Стакан» a(2) = «Бокал» a(3) = «Пиала» a(4) = «Фужер» With UserForm1 .ComboBox1.List = a .Show End With End Sub |
Заполнение ComboBox значениями из ячеек
Для заполнения поля со списком значениями из диапазона ячеек рабочего листа будем использовать свойство комбинированного списка RowSource, предварительно заполнив диапазон «A1:A5» активного листа уже известными значениями:
Sub Test4() With UserForm1 .ComboBox1.RowSource = «A1:A5» .Show End With End Sub |
Чтобы присвоить элементу управления ComboBox значения из диапазона ячеек любого рабочего листа, добавьте ссылку на него перед наименованием диапазона, например, замените «A1:A5» на «Лист1!A1:A5», и поле со списком будет заполнено значениями ячеек «A1:A5», расположенных на листе с именем «Лист1». Имя листа берется из наименования ярлыка.
Очистка ComboBox от значений
Очистить ComboBox можно как от всех значений сразу, так и удалить один или несколько значений (по одному) из списка.
Очистка ComboBox от всего списка значений:
Очистка ComboBox от одного значения:
ComboBox1.RemoveItem Index |
где Index — порядковый номер элемента в списке ComboBox, нумерация начинается с нуля.
Автоматическое заполнение ComboBox
Предполагается, что, при открытии пользовательской формы или рабочего листа с ComboBox, поле со списком должно быть уже заполнено значениями. Как это сделать?
Заполнение ComboBox на форме
Автоматическое заполнение элемента управления ComboBox на пользовательской форме осуществляется с помощью процедуры UserForm_Initialize, размещенной в модуле этой формы:
Private Sub UserForm_Initialize() ComboBox1.List = Лист8.[A1:A15].Value End Sub |
Или по одному:
Private Sub UserForm_Initialize() With ComboBox1 .Clear .AddItem «Апельсин» .AddItem «Банан» .AddItem «Виноград» .AddItem «Груша» .AddItem «Хурма» End With End Sub |
Заполнение ComboBox на листе
Автоматическое заполнение элемента управления ComboBox из коллекции «Элементы ActiveX» на рабочем листе осуществляется с помощью процедуры Workbook_Open, размещенной в модуле «ЭтаКнига»:
Private Sub Workbook_Open() Лист8.ComboBox1.List = Лист8.[A1:A15].Value End Sub |
Или по одному:
Private Sub Workbook_Open() With Лист8.ComboBox1 .Clear .AddItem «Апельсин» .AddItem «Банан» .AddItem «Виноград» .AddItem «Груша» .AddItem «Хурма» End With End Sub |
Более подробно о заполнении данными ComboBox можно прочитать в статье о заполнении ListBox, так как оба эти элемента управления используют одинаковые способы заполнения.
Иногда возникает необходимость заполнения элементов управления ListBox и ComboBox уникальными значениями из диапазона ячеек с повторяющимся содержимым. Смотрите, как отсортировать уникальные элементы из списка с помощью объектов Collection и Dictionary.
Вы можете скачать файл Excel с представленными выше примерами. Файл упакован в ZIP-архив. Для проверки работоспособности кода, непосредственно в редакторе VBA помещайте курсор внутри тела каждой процедуры и нажимайте кнопку «Run Sub».
ComboBox — значение по умолчанию
Добавление значения по умолчанию вручную
Значение по умолчанию для текстового поля ComboBox можно задать вручную в окне свойств (Properties) выбранного элемента управления:
Выберите ComboBox на форме в редакторе VBA и в окне Properties в поле Value впишите нужное значение.
Программное добавление значения по умолчанию
Добавление произвольного значения по умолчанию в текстовое поле ComboBox при инициализации пользовательской формы:
Private Sub UserForm_Initialize() With ComboBox1 .AddItem «Камень» .AddItem «Ножницы» .AddItem «Бумага» ‘Добавление произвольного значения по умолчанию .Value = «Выберите значение» End With End Sub |
Добавление значения по умолчанию в текстовое поле ComboBox из имеющегося списка:
Private Sub UserForm_Initialize() With ComboBox1 .AddItem «Камень» .AddItem «Ножницы» .AddItem «Бумага» ‘Добавление значения по умолчанию из списка .ListIndex = 0 End With End Sub |
Нумерация списка ComboBox начинается с нуля, поэтому приведенный выше код отобразит значение по умолчанию — «Камень».
Формулировка задачи:
Есть форма, которая создает список литературы в ворде 2010. Необходимо создать combobox, чтобы задать тип источника. Не показывает, собака, данные! Ни через additem, ни через массив. Есть userform1_activate, если добавлять код туда, тоже не отображает элементы. Помогите пожалуйста!
Код к задаче: «Заполнение Combobox в Word»
textual
Option Explicit Private Sub UserForm_Activate() ComboBox1.Clear ComboBox1.AddItem "Один" ComboBox1.AddItem "Два" ComboBox1.AddItem "Три" ComboBox1.AddItem "Четыре" ComboBox1.AddItem "Пять" ComboBox1.AddItem "Шесть" ComboBox1.AddItem "Семь" ComboBox1.AddItem "Восемь" ComboBox1.AddItem "Девять" ComboBox1.AddItem "Десять" ComboBox1.ListIndex = 0 End Sub
Полезно ли:
13 голосов , оценка 4.077 из 5
- Remove From My Forums
-
Question
-
Hi MSDN ,
I Hav e A Word Document in which i hav placed a Combobox .. I want to Add Some items to That Combo box ,
Can Any one please suggest me regarding the Same !!!
Thanks And Regards
Satya Ranjan Biswal ….
Answers
-
Hi Satya
Try substituting DropDownListEntries for ContentControlListEntries
Cindy Meister, VSTO/Word MVP
-
Marked as answer by
Satya, _S_ Sense
Friday, December 4, 2009 9:56 AM
-
Marked as answer by
All replies
-
What do you mean by item?? is it lists or data??
You can right click on combobox, choose Edit item for adding lists
Or you can click arrow at the top of combobox,check use data bound item, then select your Data Source (it’s used for adding data from database)
-
Hi Satya
There are a number of differnt kinds of «combo boxes» a Word document can host. Before we can answer your question, we need to know:
1. What version of Word?
2. What version of VSTO?
3. What kind of Combobox? (If you don’t know, describe the exact steps you used to insert the combobox.)
Cindy Meister, VSTO/Word MVP
-
Hi Cindy ,
I Am Using 2007 Word.,
i hav Added The Combobox By Following Line Of Codes
Dim oWord As Word.Application Dim oDoc As Word.Document oWord = CreateObject("Word.Application") oWord.Visible = True oDoc = oWord.Documents.Add oDoc.ContentControls.Add(WdContentControlType.wdContentControlText) oDoc.ContentControls.Add(WdContentControlType.wdContentControlComboBox)
Now i want to Add The Items/Data to that Combobox ,
How can i do thatThanks And Regards
Satya Ranjan Biswal ….
-
is this data from database?? if yes, then what database you are using?? do you have connection string to that database??
-
Hi ,
In Some Cases i hav hard Coded Data Like «YES» Or ‘NO» , in Some cases i hav to fetch data from Database .
I am using Sql Server 2008 And Yes i Do hav a connection string ….
Thanks And Regards
Satya Ranjan Biswal ….
-
Hi Satya
I’ll try to help you get started, but it’s important for you to realize that the VSTO forum is not the correct place for you to ask questions for your application as you’re not using the VSTO technology. You’ll find a description about what VSTO is, what the forum supports, and links to places where you can ask non-VSTO, Office-related questions in the forum’s Please Read First message.
The combobox type of Content control has a ContentControlListEntries property, which in turn gives you access to an Add method. This method will let you populate the dropdown list for the control. You must assign a value that the user can see. Optionally, you can also assign a different «value» for the entry, and you can give an index value (for placing the entry at a specific position in the list).
I urge you to create an object for the Content Control you’re inserting, and work with that. For example:
Dim ccComboBox as Word.ContentControl = oDoc.ContentControls.Add(WdContentControlType.wdContentControlComboBox)
ccComboBox.ContentControlListEntries.Add(«The text», «The value», 1)
Cindy Meister, VSTO/Word MVP
-
hi Harrie ,
I think u r not getting the question perfectly ,
I am Asking about Filling the Combobox in WordDcoument, Not A Normal Combobox.
By d Way i know Multiple Type of Data Fetching Techniques .i m placing the combo nby following Code
Dim oWord As Word.Application
Dim oDoc As Word.Document
oWord = CreateObject("Word.Application" )
oWord.Visible = True
oDoc = oWord.Documents.AddoDoc.ContentControls.Add(WdContentControlType.wdContentControlText)
oDoc.ContentControls.Add(WdContentControlType.wdContentControlComboBox)
Satya Ranjan Biswal ….
-
Hi Cindy , I pasted Code But It is showimng Error For The Following Line
ccComboBox.ContentControlListEntries.Add(«The text», «The value», 1)
And The Error Desc isContentControlListEntries’ is not a member of ‘Microsoft.Office.Interop.Word.ContentControl’.
Thanks ANd Regards
Satya Ranjan Biswal ….
-
Hi Satya
Try substituting DropDownListEntries for ContentControlListEntries
Cindy Meister, VSTO/Word MVP
-
Marked as answer by
Satya, _S_ Sense
Friday, December 4, 2009 9:56 AM
-
Marked as answer by
-
Try this:
Sub SetPlaceholderText() Dim objCC As ContentControl Set objCC = Selection.ContentControls _ .Add(wdContentControlComboBox) objCC.Title = "Favorite Animal" objCC.SetPlaceholderText _ Text:="Please select your favorite animal " 'List entries objCC.DropdownListEntries.Add "Cat" objCC.DropdownListEntries.Add "Dog" objCC.DropdownListEntries.Add "Horse" objCC.DropdownListEntries.Add "Monkey" objCC.DropdownListEntries.Add "Snake" objCC.DropdownListEntries.Add "Other" End Sub
or this to fetch data from database
Function PopulateTestComboBox(cmbName As String) Dim dbDatabase As Database Dim rst As Recordset Dim i As Integer Dim objCC As ContentControl strDBPath = "C:MyPathMyDB.mdb" Set dbDatabase = OpenDatabase(strDBPath) Set rst = dbDatabase.OpenRecordset("SELECT TestName FROM tbl_Tests ORDER BY TestName", dbOpenSnapshot) ActiveDocument.ContentControls("ComboBox11").Range.Select Set objCC = Selection.ContentControls _ .Add(wdContentControlComboBox) i = 0 With objCC 'Add initial blank value .DropdownListEntries.Add ("") i = i + 1 Do Until rst.EOF .DropdownListEntries.Add (rst.Fields("TestName")) rst.MoveNext i = i + 1 Loop 'Add final value "Other" .DropdownListEntries.Add ("Other") 'Set to initial blank value .SetPlaceholderText Text:="" End With End Function
-
Thanks Harrie i Did the Same ……
Satya Ranjan Biswal ….