Найти в Дзене
VBA Excel с нуля

VBA Excel № 148. Как правильно закрывать пользовательское диалоговое окно

Оглавление
Скриншот с моего ноутбука
Скриншот с моего ноутбука

Итак, как же правильно закрывать пользовательское диалоговое окно?

Давайте рассмотрим различные способы закрытия формы UserForm и их особенности.

Для начала создадим форму с кнопкой.

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Далее в модуле прописываем код с одной строкой для вызова формы:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Использование инструкции Unload

Для закрытия формы UserForm можно использовать инструкцию Unload. Эта инструкция удаляет форму из памяти. Например, используйте следующую инструкцию:

Unload UserForm1 или Unload Me. И то и то, работает.

Нужно понимать, что код написан внутри модуля самой формы (при создании формы я дважды нажал на кнопку CommandButton1, и как бы провалился в модуль формы).

📌 Скачать файл пример, можно в конце статьи.

Ключевое слово Me указывает на текущую форму.

Давайте разберём в каких случаях применяется Unload.

Обычно инструкция Unload выполняется после того, как форма завершила все свои функции. Например, на форме может быть кнопка OK (CommandButton), нажатие на которую запускает макрос. В этом макросе одной из функций может быть закрытие формы:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Форма остается на экране до завершения выполнения макроса. После выгрузки все элементы управления на форме возвращаются в исходное состояние, и доступ к значениям элементов уже невозможен.

Сохранение данных перед выгрузкой

Если нужно сохранить введенные пользователем данные для дальнейшего использования после выгрузки формы, можно сохранить их в переменные с областью действия Public, определенные в стандартном модуле VBA, или в ячейки листа Excel (для начала добавим в форму TextBox1):

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Пропишем в модуле формы код:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Или:

Скриншот с моего ноутбука. Введенное в TextBox1 значение прописывает в ячейку "А1"
Скриншот с моего ноутбука. Введенное в TextBox1 значение прописывает в ячейку "А1"

Автоматическое закрытие при нажатии на кнопку "Закрыть"

Когда пользователь нажимает на кнопку Закрыть (крестик в заголовке окна), форма автоматически выгружается из памяти. При этом происходят события QueryClose и Terminate, которые можно обработать:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Ловим событие "QueryClose" этим кодом:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

И при закрытии формы "крестиком", получаем:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Теперь поймаем событие "Terminate" следующим макросом:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Работа формы завершается и выходит сообщение об этом:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Использование метода Hide

Метод Hide позволяет скрыть форму, но оставить ее в памяти. Это полезно, если нужно продолжить работу с элементами управления на форме:

UserForm1.Hide или Me.Hide

Пример использования метода Hide

Если необходимо немедленно скрыть форму при выполнении макроса, используйте метод Hide в начале процедуры. Затем можно выполнить необходимые действия и выгрузить форму:

Скриншот с моего ноутбука
Скриншот с моего ноутбука

В этом примере форма скрывается сразу после нажатия кнопки, а затем выгружается после выполнения цикла (заполняется столбец "А").

Давайте подытожим: знание различных способов закрытия формы UserForm в VBA поможет Вам (как мне кажется), достаточно эффективно управлять памятью и возможно предотвращать ошибки. Инструкции Unload и метод Hide позволяют контролировать видимость и состояние формы, а также сохранять введенные данные для дальнейшего использования.

Как Вы наверно заметили, что коды закомментированы. Их по очереди можно «РАСКОММЕНТИРОВАТЬ», чтобы посмотреть работу каждого, но не забывайте закомментировать предыдущие (чтобы не возникал конфликт). В общем попробуйте побаловаться макросами...

СКАЧАТЬ ФАЙЛ ПРИМЕР