VBA Excel. Программное создание формы

Программное создание пользовательской формы из кода VBA Excel. Добавление на форму кнопки и события Click в модуль созданной формы. Удаление формы.

Программная работа с формой

Создание

Пользовательская форма программно (динамически) может быть создана только как элемент коллекции VBComponents проекта VBA:

Число (3) означает, что создается форма, если заменить его на (1), будет создан стандартный модуль.

Значения свойствам формы myForm, как элемента коллекции VBComponents, присваиваются следующим образом:

Присвоенные значения параметров динамической формы, как элемента коллекции VBComponents, сохраняются при закрытии формы.

Для элемента коллекции UserForms присвоение значений свойств будет выглядеть следующим образом:

Присвоенные значения параметров динамической формы, как элемента коллекции UserForms, не сохраняются при закрытии формы.

Я не рекомендую работать из кода VBA Excel с программно созданной формой, как элементом коллекции UserForms, кроме случая, когда необходимо отобразить динамическую форму на экране. В других случаях можно получить непредсказуемые результаты, например, могут не работать программно созданные кнопки, а также они будут исчезать при закрытии формы.

Отображение

Здесь возникает проблема: у динамической формы, созданной как элемент коллекции VBComponents, нет метода, который позволил бы ее отобразить на экране.

Чтобы обойти это препятствие, преобразуем нашу форму myForm в элемент коллекции UserForms, как в предыдущем примере, и выводим ее на экран с помощью метода Show:

Удаление

Удаление программно созданных форм, если это не однократное действие, крайне важно. Если этого не предусмотреть, то все вновь создаваемые формы будут сохраняться и накапливаться в проекте VBA.

Удаляем динамически созданную форму myForm следующим образом:

Кстати, программно удалить форму можно только через элемент коллекции VBComponents, так как у элемента коллекции UserForms удаление не предусмотрено (нет соответствующего метода).

Добавление кнопки на форму

Код VBA Excel, добавляющий командную кнопку на динамически созданную форму и задающий ее свойства:

Здесь, при создании кнопки на основе элемента коллекции VBComponents, добавляется только объект Designer, которого нет при программном создании элементов управления на основе элемента коллекции UserForms (также смотрите пример кода ниже). Константы, указывающие на класс создаваемого элемента управления, используются те же.

Запись процедуры в модуль

В модуль динамически созданной формы myForm запишем код, который будет выполняться при клике по программно созданной в предыдущем примере кнопке myButton (объектная переменная) с именем «myCommandButton». Этот код создает на форме элемент управления Label, выравнивает его и записывает в него текст: «Ура! Новая кнопка работает!».

Текст процедуры

Обработка события Click для кнопки с именем «myCommandButton»:

Способ 1

Первый способ предназначен для записи в модуль формы myForm кода процедуры целиком. Для этого используется метод AddFromString:

Все прямые кавычки из текста процедуры заменены на функцию Chr(34), где 34 – числовой код парной прямой кавычки.

Способ 2

Этот способ предполагает запись кода процедуры в модуль формы myForm построчно. Для этого используется метод InsertLines:

Свойство модуля CountOfLines возвращает количество уже имеющихся в модуле строк, что позволяет с помощью переменной n добавлять новые строки ниже. Это актуально, если используется для записи кода уже существующий модуль, или новый модуль, в который записывается сразу несколько процедур.

Код создания формы в сборе

Пример кода VBA Excel по динамическому созданию пользовательской формы, добавлению на нее командной кнопки и программного кода в ее модуль:

Вы можете скопировать этот код в стандартный модуль и проверить его работоспособность. После отображения динамически созданной пользовательской формы, нажмите кнопку «Новая кнопка». Результат работы кода:

Программно созданная пользовательская форма

Если хотите увидеть программно записанный код в модуле формы, закомментируйте строку, удаляющую форму. Код записан и протестирован в Excel 2016.

Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

Добавить комментарий

Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора. При добавлении в комментарий кода VBA Excel, вставьте перед его началом тег <pre> и по окончании кода </pre>.