VBA: Как програмно завершить работу макроса?
От: i-s-v Украина http://i-s-v.org.ua
Дата: 02.04.06 16:45
Оценка:
Как програмно завершить работу макроса? Макрос вызываеться при нажатии на настроенную кнопку... и должен останавливаться при закрытии формы.... Какая процедура завершает работу макроса?
Re: VBA: Как програмно завершить работу макроса?
От: ZAMUNDA Земля для жалоб и предложений
Дата: 03.04.06 06:03
Оценка:
Здравствуйте, i-s-v, Вы писали:

ISV>Как програмно завершить работу макроса? Макрос вызываеться при нажатии на настроенную кнопку... и должен останавливаться при закрытии формы.... Какая процедура завершает работу макроса?

ISV> :crash: :shuffle: :???:
Exit Sub

Только Unload форме, на всяк, сделай предварительно.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re: VBA: Как програмно завершить работу макроса?
От: kryl Россия  
Дата: 07.04.06 05:04
Оценка:
Здравствуйте, 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) воздействовать на глобальную переменную из любой удобной точки — применимо к текущему примеру — при закрытии формы

Корявенько, но для некоторых случаев вполне работоспособно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.