Программное создание элементов управления и добавление их на пользовательскую форму в VBA Excel. Метод Controls.Add — синтаксис, компоненты, примеры.
Метод Controls.Add пользовательской формы
Программное (динамическое) создание элементов управления пользовательской формы в VBA Excel осуществляется с помощью метода Controls.Add
.
Синтаксис метода Controls.Add
1 |
Set Var = Form.Controls.Add(ProgID, [Name], [Visible]) |
Описание компонентов метода
- Var — объектная переменная, которой будет присвоен созданный элемент управления. Она может быть объявлена как Control, Object или Variant.
- Form — имя пользовательской формы, на которую добавляется элемент управления.
- ProgID — программный идентификатор создаваемого элемента управления.
- Name — необязательный параметр, задающий имя добавляемого элемента управления.
- Visible — необязательный параметр, определяющий видимость создаваемого элемента управления. Может принимать значение True или False.
ProgID и Name, используемые в выражениях метода Controls.Add заключаются в прямые кавычки. Смотрите в примерах.
Идентификаторы элементов управления формы
Элемент управления | Программный идентификатор |
---|---|
CheckBox | Forms.CheckBox.1 |
ComboBox | Forms.ComboBox.1 |
CommandButton | Forms.CommandButton.1 |
Frame | Forms.Frame.1 |
Image | Forms.Image.1 |
Label | Forms.Label.1 |
ListBox | Forms.ListBox.1 |
OptionButton | Forms.OptionButton.1 |
ScrollBar | Forms.ScrollBar.1 |
SpinButton | Forms.SpinButton.1 |
TextBox | Forms.TextBox.1 |
ToggleButton | Forms.ToggleButton.1 |
Программное создание элементов управления
Для реализации примеров необходимо открыть рабочую книгу Excel с поддержкой макросов (.xls или .xlsm) и в редакторе VBA создать пользовательскую форму UserForm1.
Пример 1
Программное создание элемента управления TextBox с присвоением его свойству «Text» значения «Привет!». Так как это свойство TextBox является свойством по умолчанию, вместо «myCont.Text» используем в коде для присвоения значения только имя переменной «myCont».
1 2 3 4 5 6 |
Sub Primer_1() Dim myCont As Control Set myCont = UserForm1.Controls.Add("Forms.TextBox.1", "myTextBox1") myCont = "Привет!" UserForm1.Show End Sub |
Так как мы присвоили вновь созданному элементу управления TextBox имя «myTextBox1», теперь обращаться к нему можно и по этому имени, например:
UserForm1.Controls("myTextBox1") = "Привет!"
Этой строкой можно заменить строку:
myCont = "Привет!"
Как видим, обращаться к добавленному элементу управления удобнее через переменную, чем по присвоенному имени.
Пример 2
Создание с помощью кода VBA Excel группы элементов управления ComboBox, присвоение соответствующим параметрам значений размеров и отступов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub Primer_2() Dim myCont(1 To 5) As Control, i As Byte With UserForm1 For i = 1 To 5 Set myCont(i) = .Controls.Add("Forms.ComboBox.1") With myCont(i) 'Заполняем все ComboBox одинаковыми списками .List = Array("Привет1", "Привет2", _ "Привет3", "Привет4", "Привет5") 'Добавляем размеры и отступы .Width = 200 .Height = 20 .Left = 20 .Top = i * 10 + (i - 1) * 20 End With Next .Caption = "Пять полей со списком" .Height = 190 .Width = 250 .Show End With End Sub |
Как привязать стандартные события к динамически созданным элементам управления читайте в статье Привязка события к элементу управления.
В эксель 2007 выдает ошибку компил. User defined-type not defined
Не исключаю такую возможность, так как примеры тестировались в Excel 2016.
Как созданный методом Controls.Add SpinButton использовать? Пробовал через переменную к нему обращаться, пробовал по присваиваемому имени, не происходит изменения числа.
Как отследить событие изменения созданного спина?
Добрый день, Станислав!
Ответ читайте в статье Привязка события к элементу управления.
При закрывании формы с Вашим кодом выдает ошибку №91.
Добрый день, Андрей!
Только что проверил, у меня форма закрывается без ошибки.
Обсуждение закрыто.