Кирилл Шмелёв
+7 995 537-35-14 en

Вёрстка интерфейсов пользовательских форм в продуктах 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 — строковые параметры, поэтому, если это не переменные, заключаются в прямые кавычки. Смотрите в примерах.

Идентификаторы элементов управления формы

Ниже таблица, речь о которой шла в предыдущих абзацах.

Элемент управленияПрограммный идентификаторТип объекта
CheckBoxForms.CheckBox.1msforms.CheckBox
ComboBoxForms.ComboBox.1msforms.ComboBox
CommandButtonForms.CommandButton.1CommandButton
FrameForms.Frame.1Frame
ImageForms.Image.1Image
LabelForms.Label.1msforms.Label
ListBoxForms.ListBox.1msforms.ListBox
OptionButtonForms.OptionButton.1msforms.OptionButton
ScrollBarForms.ScrollBar.1msforms.ScrollBar
SpinButtonForms.SpinButton.1SpinButton
TextBoxForms.TextBox.1msforms.TextBox
ToggleButtonForms.ToggleButton.1ToggleButton

Примеры

Для реализации примеров необходимо открыть рабочую книгу 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. Я надеюсь, что статья была для вас полезной!

Все публикации