Вёрстка интерфейсов пользовательских форм в продуктах Microsoft с помощью Visual Basic for Application
Вступление (писала нейросеть)
Сегодня я хочу поделиться с вами моим опытом работы с VBA (Visual Basic for Applications) в продуктах Microsoft Office, таких как Excel, Word, Access и PowerPoint. Если вы уже знакомы с VBA и хотите расширить свои навыки, то эта статья для вас! Мы сфокусируемся на вёрстке интерфейсов пользовательских форм с помощью кода, а не графического редактора, что позволит динамически адаптировать интерфейс и автоматизировать рутинные задачи.
В статье мы рассмотрим настройку пользовательских форм и элементов управления, таких как текстовые поля, кнопки и выпадающие списки, при помощи кода VBA. Благодаря программированию на VBA, вы сможете изменять внешний вид и функциональность форм “на лету”, что делает ваш интерфейс более гибким и пригодным для различных задач.
Также я хотел бы обратить ваше внимание на то, что VBA доступен для пользователей с ограниченными возможностями, например, для слепых пользователей. Работа с VBA предоставляет им возможность создавать и настраивать пользовательские формы без обращения к графическому редактору, который несовместим с программами чтения с экрана.
Надеюсь, эта статья будет для вас полезной, поможет улучшить ваши навыки в создании пользовательского интерфейса в приложениях Microsoft Office с использованием языка VBA и расширит возможности вашего повседневного инструментария. Желаю вам приятного чтения и успехов в изучении мира VBA!
Лирическое отступление
Статья предназначена для тех, кто уже немного знаком с VBA, понимает, что такое процедура и как изменять свойства объектов. Я пишу её потому, что мне самому такая статья сильно бы упростила жизнь ещё 2 месяца назад.
Добавление элемента управления на форму
Для того, чтобы добавить элемент на форму с помощью кода, необходимо:
1. Инициализировать переменную объекта с соответствующим типом
Для всех элементов управления можно использовать тип Control
, но он не поддерживает отправку событий (вы не сможете реагировать на взаимодействие с ним). Выглядеть это будет так:
Dim MyElement As Control
Я же, вместе с официальной документацией Microsoft, рекомендую использовать для каждого элемента управления соответствующий ему тип (таблица с типами приведена ниже), например:
Dim MyCommandButton As CommandButton
Для того, чтобы элемент отправлял события, в строку нужно добавить параметр WithEvents
. Вот так:
Dim WithEvents MyCommandButton As CommandButton
2. С помощью оператора Set и метода Controls.Add добавить элемент управления на форму и присвоить ссылку на него в переменную.
Программное (динамическое) создание элементов управления пользовательской формы в VBA осуществляется с помощью метода Controls.Add
.
Синтаксис
Set [Var] = [Form].Controls.Add([ProgID], [Name], [Visible])
Описание компонентов метода
Var
— объектная переменная из первого пункта, которой будет присвоен созданный элемент управления.Form
— имя пользовательской формы, на которую добавляется элемент управления.ProgID
— программный идентификатор создаваемого элемента управления (приведены в таблице ниже).Name
— необязательный параметр, задающий имя добавляемого элемента управления.Visible
— необязательный параметр, определяющий видимость создаваемого элемента управления. Может принимать значения True или False.
ProgID и Name, используемые в выражениях метода Controls.Add
— строковые параметры, поэтому, если это не переменные, заключаются в прямые кавычки. Смотрите в примерах.
Идентификаторы элементов управления формы
Ниже таблица, речь о которой шла в предыдущих абзацах.
Элемент управления | Программный идентификатор | Тип объекта |
---|---|---|
CheckBox | Forms.CheckBox.1 | msforms.CheckBox |
ComboBox | Forms.ComboBox.1 | msforms.ComboBox |
CommandButton | Forms.CommandButton.1 | CommandButton |
Frame | Forms.Frame.1 | Frame |
Image | Forms.Image.1 | Image |
Label | Forms.Label.1 | msforms.Label |
ListBox | Forms.ListBox.1 | msforms.ListBox |
OptionButton | Forms.OptionButton.1 | msforms.OptionButton |
ScrollBar | Forms.ScrollBar.1 | msforms.ScrollBar |
SpinButton | Forms.SpinButton.1 | SpinButton |
TextBox | Forms.TextBox.1 | msforms.TextBox |
ToggleButton | Forms.ToggleButton.1 | ToggleButton |
Примеры
Для реализации примеров необходимо открыть рабочую книгу Excel с поддержкой макросов (.xls или .xlsm) и в редакторе VBA создать пользовательскую форму UserForm1 и модуль Module1.
Макрос
Для начала напишем короткую процедуру, которая будет вызывать процедуру инициализации формы. это необходимо потому, что код, написанный в объекте формы нельзя выполнить как макрос.
Module1:
' Объявляем процедуру с названием «Start»
Sub Start()
' Вызываем процедуру «Init» объекта «UserForm1»
Call UserForm1.Init
End Sub
Пример 1, поле редактирования
Программное создание элемента управления TextBox с присвоением его свойству Text значения «Hello World!». Так как это свойство TextBox является свойством по умолчанию, вместо MyTextBox.Text
используем в коде для присвоения значения только имя переменной MyTextBox
.
Для того, чтобы изменять код пользовательской формы, нажмите на ней правой кнопкой мыши для вызова контекстного меню и выберите пункт View Code.
UserForm1:
' Инициализируем объектную переменную
Dim WithEvents MyTextBox As msforms.TextBox
SubInit()
' Для красоты зададим имя нашей форме
UserForm1.Caption = "My UserForm"
' Добавляем TextBox на форму
Set MyTextBox = UserForm1.Controls.Add("Forms.TextBox.1", "myTextBox1")
' Задаём текст
MyTextBox = "Hello World!"
' Выводим форму на экран
UserForm1.Show
End Sub
Так как мы присвоили вновь созданному элементу управления TextBox имя «myTextBox1», теперь обращаться к нему можно и по этому имени, например:
UserForm1.Controls("myTextBox1") = "Hello World!"
Этой строкой можно заменить строку:
myCont = "Hello World!"
Как видим, обращаться к добавленному элементу управления удобнее через переменную, чем по присвоенному имени.
В целом, никто не запрещает разместить вышеприведённый код сразу в модуле, но, чтобы не путаться, я рекомендую код, относящийся к интерфейсу формы размещать в форме.
Теперь, если запустить процедуру Start модуля Module1, то вы увидите окно, с названием «My UserForm» и полем редактирования в верху окна.
Для того, чтобы выполнить действия при изменении поля редактирования «MyTextbox», в форме необходимо создать процедуру с названием, включающим имя переменной объекта и название события (у полей редактирования событием по умолчанию является «Change»), разделённые подчёркиванием. Например:
UserForm1:
Sub MyTextBox_Change()
' Выведем диалоговое окно с новым содержанием поля
MSGBox MyTextBox.Text
End Sub
Пример 2, комбинированный список
Создание с помощью кода VBA Excel элемента управления ComboBox, присвоение ему значений, размеров и отступов.
UserForm1:
Dim WithEvents MyComboBox As msforms.ComboBox
Sub Init()
Set MyComboBox = UserForm1.Controls.Add("Forms.ComboBox.1")
' Используем конструкцию With, чтобы не переписывать название элемента много раз
With MyComboBox
' Свойству List присваиваем значение в виде массива с параметрами, которые мы хотим видеть в списке
.List = Array("Green", "Blue", "Red", "Black", "White")
' задаем размеры и отступ слева
.Width = 200
.Height = 20
.Left = 20
End With
' И немного настроем саму форму для красоты
With UserForm1
.Caption = "Love color"
.Height = 60
.Width = 250
.Show
End With
End Sub
Пример 3, радиокнопки и фреймы
Особенностью радиокнопок (OptionButton) является то, что в отличие от флажков (CheckBox), в один момент времени может быть отмечена только одна радиокнопка. для того, чтобы создать несколько групп радиокнопок, их необходимо объединять в фреймы (Frame). Для этого аналогично другим элементам управления необходимо создать фрейм, а радиокнопки добавлять уже в него.
UserForm1:
Dim WithEvents MyFrame As Frame
Dim WithEvents MyOptionButton1 As msforms.OptionButton
Dim WithEvents MyOptionButton2 As msforms.OptionButton
Dim WithEvents MyOptionButton3 As msforms.OptionButton
Sub Init()
' Добавляем фрейм
Set MyFrame = UserForm1.Controls.Add("Forms.Frame.1")
' Добавляем радиокнопки
Set MyOptionButton1 = MyFrame.Controls.Add("Forms.OptionButton.1")
With MyOptionButton1
' Добавляем подпись и отступ сверху, чтобы они не налезали друг на друга
.Top = 0
.caption = "OptionButton1"
End With
Set MyOptionButton2 = MyFrame.Controls.Add("Forms.OptionButton.1")
With MyOptionButton2
' Добавляем подпись и отступ сверху, чтобы они не налезали друг на друга
.Top = 20
.caption = "OptionButton2"
End With
Set MyOptionButton3 = MyFrame.Controls.Add("Forms.OptionButton.1")
With MyOptionButton3
' Добавляем подпись и отступ сверху, чтобы они не налезали друг на друга
.Top = 40
.caption = "OptionButton3"
End With
UserForm1.caption = "OptionButtons list"
UserForm1.Show
End Sub
Заключение
Аналогичным образом можно добавлять другие элементы управления и изменять их свойства. Все свойства каждого из элементов можно посмотреть в официальной справке Microsoft. Я надеюсь, что статья была для вас полезной!