Пример программного создания элементов управления формы в VBA Excel как дополнение к статьям о динамическом создании форм и методе Controls.Add.
Введение
В дополнение к статьям о программном создании формы в VBA Excel и Метод Controls.Add пользовательской формы, рассмотрим динамическое добавление на пользовательскую форму элементов управления и взаимодействие с ними на примере отображения расстояний от Солнца до планет Солнечной системы. В данном обзоре будет разобрано программное создание двух меток (Label) и выпадающего списка (ComboBox), который будет реагировать на действия пользователя благодаря событию ComboBox_Change().
Пример создания элементов управления
Для реализации проекта по программному созданию элементов управления формы потребуется всего два шага:
- Создание пользовательской формы
Для начала, в редакторе Visual Basic for Applications (VBA) необходимо создать новую пользовательскую форму. Это можно сделать, кликнув правой кнопкой мыши в окне проекта и выбрав Insert > UserForm. - Размещение кода в модуле формы
Весь приведенный ниже код следует разместить в модуле только что созданной пользовательской формы. Двойной клик по форме в окне проекта откроет ее модуль.
Код VBA Excel для вставки в модуль формы:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
Option Explicit 'Объявляем переменные для создания меток Dim lb1, lb2 'Объявляем переменную для поля со списком, 'которая будет обрабатывать события 'благодаря ключевому слову WithEvents Private WithEvents cb1 As MSForms.ComboBox Private Sub UserForm_Initialize() With Me .Height = 170 .Width = 305 .Caption = "Расстояние от Солнца до планет Солнечной системы" 'Программно создаем элементы управления Set lb1 = .Controls.Add("Forms.Label.1") Set lb2 = .Controls.Add("Forms.Label.1") Set cb1 = .Controls.Add("Forms.ComboBox.1") End With With lb1 .Height = 22 .Width = 290 .Top = 60 .Left = 18 .Font.Size = 12 .Caption = "Расстояние от Солнца до выбранной планеты" End With With lb2 .Caption = "" .Height = 22 .Width = 290 .Top = 90 .Left = 18 .Font.Size = 14 End With With cb1 .Height = 22 .Width = 150 .Top = 20 .Left = 18 .Font.Size = 12 .List = Array("Меркурий", "Венера", "Земля", _ "Марс", "Юпитер", "Сатурн", "Уран", "Нептун") .Value = "Выберите планету" End With End Sub Private Sub cb1_Change() Dim pl(), km() pl = Array("Меркурия", "Венеры", "Земли", _ "Марса", "Юпитера", "Сатурна", "Урана", "Нептуна") km = Array("57,91 млн км (0,387 а. е.)", "108 млн км (0,723 а. е.)", _ "149,6 млн км (1 а. е.)", "228 млн км (1,52 а. е.)", _ "778,57 млн км (5,2 а. е.)", "1,43 млрд км (9,58 а. е.)", _ "2,87 млрд км (19,1914 а. е.)", "4,55 млрд км (30,1 а. е.)") If cb1.ListIndex > -1 Then lb1.Caption = "Расстояние от Солнца до " & pl(cb1.ListIndex) & ":" lb2.Caption = km(cb1.ListIndex) End If End Sub |
Запустить код можно непосредственно из окна формы или модуля формы, нажав пункт меню Run > Run Sub/UserForm или на его треугольную кнопку.
Разбор кода
Объявление переменных
В начале кода объявляются переменные lb1 и lb2 для двух меток (Label), а также переменная cb1 для выпадающего списка (ComboBox). Ключевое слово WithEvents перед cb1 позволяет этому элементу управления реагировать на события, такие, как выбор элемента из списка.
Инициализация формы
Событие UserForm_Initialize() происходит перед отображением формы на экране. В этом блоке кода задаются начальные размеры и заголовок формы. Затем, с помощью метода .Controls.Add(), на форму программно добавляются две метки и один выпадающий список. Для каждого созданного элемента управления в блоках With... End With настраиваются его свойства: размеры, положение, размер шрифта и начальные значения.
Обработка события Change
Процедура cb1_Change() автоматически вызывается каждый раз, когда пользователь выбирает новый элемент в выпадающем списке cb1. Внутри этой процедуры:
- Два массива,
pl()иkm(), содержат названия планет в родительном падеже и соответствующие им расстояния до Солнца. - Условие
If cb1.ListIndex > -1проверяет, был ли сделан выбор в списке. - Если выбор сделан, то свойству
Captionпервой метки (lb1) присваивается текст с названием выбранной планеты, а второй метке (lb2) — расстояние до Солнца из массиваkm.
Таким образом, при выборе планеты из списка, информация на форме динамически обновляется, демонстрируя эффективное взаимодействие между программно созданными элементами управления и действиями пользователя.