VBA Excel обработка событий формы и т.д.

программирование excel VBA

Вопрос по VBA Excel такой.
Есть некая форма, я ее вызываю, при нажатии на обределенную кнопку вызывается программа, которая действует, пока я ее не остановлю с помощью кнопки. Но, если закрыть форму крестиком, то программа продолжает работать.
Чтобы ее завершить, я делал так. Вводил глобальную переменную, например ctr, при запуске программы считаем ее True, и постоянно проверяем в программе, если она стала False, программа завершается.
А при закрытии формы ставил событие
MyForm_Terminate()
ctr=false

Проблема в том, что, как я понял, событие отказывается работать, пока не завершится основная программа. Почему я так решил: если вместо события использовать, например, кнопку, которая делает тоже самой, то все удачно проходит, и также, если не запускать основную программу, обработчик работает.

Есть какие-нибудь идеи?

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

Примечание:
Принципиальный код, который использую:
Private ctr as boolean

sub MyForm_Terminate()
ctr=false
end sub

sub main()
ctr=true
MyForm.Show ' На форме кнопка, запускающая prog
call MyForm_Terminate
end sub

sub prog()
if ctr = false then exit sub
Основная программа
end sub

Так вот, если запущена prog, то MyForm_Terminate не работает
Ответы:
А MyForm.ShowModal
В свойствах кнопки "Отмена" найди свойство Cancel и установи его в True. Это позволит выполнять код события кнопки при закрытии окна крестиком. Насколько я понял основной код расположен в отдельном модуле что и приводит к проблеме отмены (поэтому MyForm_Terminate не работает). Для решения этой проблемы в модуле оставь только код запуска формы, а основной код перенеси в код формы. Если есть необходимость вынести код за пределы формы, проверяй условие if ctr = false then exit sub чаще, в тех участках кода где используются циклы. Вообще не очень понятна структура твоей программы. Поэтому если мой ответ не понятен, распиши схему работы программы (как код модуля пересекается с кодом формы)


12 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.