Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Здравствуйте, i-s-v, Вы писали:
ISV>Как програмно завершить работу макроса? Макрос вызываеться при нажатии на настроенную кнопку... и должен останавливаться при закрытии формы.... Какая процедура завершает работу макроса?
ISV>
Такой процедуры нет. Однако можно попытаться выкрутиться. Пример:
1. В VBA-проекте новой книги добавить стандартный модуль
2. В добавленный модуль вставить код:
Public bStop As Boolean
Sub testMacros()
bStop = False
Do While 1 = 1
Debug.Print Time
DoEvents
If bStop Then Exit Do
Loop
End Sub
Sub testForm()
UserForm1.Show
End Sub
3. Добавить в проект форму
4. Добавить обработчик события Terminate этой формы:
Private Sub UserForm_Terminate()
bStop = True
End Sub
5. На какую-нибуть панель инструментов добавить 2 кнопки: на кнопку 1 назначить макрос testMacros, на кнопку 2 — testForm
6. Расположить окна MS Excel и проекта VBA так, чтобы они одновременно были видны целиком на экране. В окне VBA сделать видимым окно отладки (например, нажать Ctrl+G)
7. Нажать на кнопку 1 — в окно отлаки VBA начнут сыпаться значения системного времени
8. Нажать на кнопку 2 — на экране должна появиться форма, дерьмо в окно отладки продолжает сыпаться
9. Закрыть форму — поток дерьма иссякнет.
Суть:
1) при выполнении макроса надо вызывать DoEvents, давая таким образом возможность обрабатываться другим событиям, например, щелчкам мышью на кнопках панели инструментов.
2) в ходе выполнения макроса проверять значение глобальной переменной, разрешающей выполнение, если выполнение запрещено — выходить из цикла(процедуры) макроса
3) воздействовать на глобальную переменную из любой удобной точки — применимо к текущему примеру — при закрытии формы
Корявенько, но для некоторых случаев вполне работоспособно.