← Все статьи

Разработка · 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 и предсказуемая реакция на ошибку.