Разработка · VBA
Вёрстка интерфейсов пользовательских форм в VBA
Как создавать элементы управления формой из кода, хранить ссылки на события и строить предсказуемый интерфейс в Microsoft Office.
В редакторе Visual Basic for Applications форму обычно собирают мышью. Но динамическое создание элементов полезно, когда состав интерфейса зависит от данных или один и тот же шаблон нужно повторить много раз.
Создание элемента управления
Элемент можно добавить в коллекцию Controls формы:
Dim inputBox As MSForms.TextBox
Set inputBox = Me.Controls.Add("Forms.TextBox.1", "customerName", True)
With inputBox
.Left = 24
.Top = 36
.Width = 220
.Height = 24
End With
Координаты в VBA задаются в пунктах. Поэтому полезно заранее определить единую сетку: отступы, высоту строки, ширину колонок и шаг между элементами.
Почему события сложнее
Для статического элемента обработчик можно создать прямо в модуле формы. Для динамического элемента нужна отдельная обёртка класса с WithEvents.
Public WithEvents Control As MSForms.TextBox
Private Sub Control_Change()
Debug.Print Control.Name, Control.Value
End Sub
Экземпляр класса должен храниться всё время жизни формы. Если создать его только в локальной переменной, сборщик освободит объект и события перестанут приходить. Практичный вариант — коллекция обработчиков на уровне формы.
Отделяйте данные от интерфейса
Не стоит описывать каждое поле отдельным фрагментом кода. Удобнее завести структуру данных: имя, подпись, тип, позиция и правила проверки. Затем один генератор строит интерфейс по этой структуре.
Такой подход упрощает изменение формы, но не отменяет требований доступности: у каждого поля должна быть понятная подпись, логичный порядок перехода клавишей Tab и предсказуемая реакция на ошибку.