Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Остановка макроса из UserForm[vbModeless]

258
20 марта 2003 года
SergeySV
1.5K / / 19.03.2003
Для наглядности и удобства польз. я сделал так, что во время выполнения макросов показывается спец форма - FormWait.Show vbModeless (форма ожидания), там ProgressBar показывает степень выполнения макроса, какой этап выполняется и все в таком духе.. Универсальная такая форма.. И для большей функциональности захотелось мне туда добавить кнопку "Прервать".
Ну как надоест польз. ждать конца выполнения (некоторые макросы с большими файлами работают), чтоб мог вырубить, как во всех приличных программах.
И вот такая неувязочка, мож кто сталкивался и смог решить эту проблему: Когда форма показ. в режиме vbModeless, то события о нажатие на какой-нибудь элемент доходит до формы в последнюю очередь, после того как Excel закончит свои вычисления, форматирование и все остальное,.. вообщем, когда уже и не нужно..
Долго маялся, пытался временно останавливать выполнения макроса (Application.Wait) и переводить фокус на кнопку FormWait.But_Cancel.SetFocus, многочисленные RePaint формы, но все равно (прям хоть PostMessage посылай :-( ) - не доходят до нее события - сначала Excel, а потом все остальное.. :-(
Такой возможность была бы на форме ожидания очень кстати.
Мож кто из спецов подскажит есть ли вообще возможность извернуться как-нибудь или все, кранты, можно и не пытаться это сделать.... ?
267
20 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Честно скажу, что готового рецепта у меня нет.
Но есть две мысли.
1. Поэкспериментируй с DoEvents. Эта штука меня часто выручала.
2. Может, отлавливать нажатия мышки через API функции?
258
20 марта 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by Cutty Sark
Честно скажу, что готового рецепта у меня нет.
Но есть две мысли.
1. Поэкспериментируй с DoEvents. Эта штука меня часто выручала.
2. Может, отлавливать нажатия мышки через API функции?



1. Как раз DoEvents ща смотрю, надежд пока мало (событие Click там не любят или спец. скрывают...)

2. Да, эта наша тяжелая артиллерия... :-).
иногда правда бывает, что через API получается даже изящнее, так что будем дерзать, если что найду, обязательно напишу, потому что вещь я думаю нужная всем кто пишет макросы для общего употребления... Да и просто приятно..

258
20 марта 2003 года
SergeySV
1.5K / / 19.03.2003
Прикольно. Спасибо за совет - DoEvents - заработал!!!

Я его понаставлял в разные куски макроса, как раз где у меня FormWait.Repaint обновляется (чтобы значение ProgressBar увеличить и текст того чем он щас занимается обновить).
А работает он следующим образом, когда нажимаешь на кнопку "Прервать", то событие до нее дойдет, как только в макросе повстречает DoEvents. (когда промежуток между соседними DoEvents большой, то получается так - на кнопку жмешь,...... ничего не происходит, кнопка не шевелится, потом через 5-10 сек раз и полезло то, что на кнопке висело..) Весело вообщем.

А для того, чтобы после нажатие кнопки "Прервать" выполнение макроса прекратить, я лучше ничего не нашел, как сделать это так:

Private Sub ButCancel_Click()
Dim Response
Response = MsgBox("Вы точно хотите прервать работу макроса?", vbQuestion + vbOKOnly + vbOKCancel, "Внимание!")
If Response = 1 Then
Unload FormWait
MyModule.blnBreak = True
Else
End If
End Sub

А в макросе, после каждого DoEvents сделать проверку, что-нибудт типа такого:
If blnBreak Then Exit Sub

Может что поизящнее есть, чтобы из кода формы прекратить (не остановить, а прекратить) выполнение текущего макроса....?
267
21 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Рад, что получилось средствами Экселя и не пришлось посылать за тяжелой артиллерией... :)

Чтобы остановить - попробуй End
267
21 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Кстати, в твоем способе нет ничего неизящного. Так что не стесняйся... :D
258
21 марта 2003 года
SergeySV
1.5K / / 19.03.2003
Ок, спасибо.

Просто я хотел свой код, относящийся к форме, максимально, как это сказать-то ..... инкапсулировать. Т.е. есть форма (один файл), включил ее в проект, перенес на другой комп, переслал другому человеку, и не надо потом долго объяснять за какие переменные там дергать, за чем следить, че проверять и вызывать.
А делать с этой формой особенного ничего и не надо, показал/скрыл ее, значения на ProgressBar обновил (ну и на подписях).
Для последнего я включил в модуль формы такую функцию:

Public Sub ShowFormWait(progValue As Double, textProc As String, TextFile As String)

If textProc <> "" Then
FormWait.LabText.Caption = textProc
Image1.Visible = True
Else
FormWait.LabText.Caption = ""
Image1.Visible = False
End If
If TextFile <> "" Then
FormWait.LabFile.Caption = TextFile
Image2.Visible = True
Else
FormWait.LabFile.Caption = ""
Image2.Visible = False
End If

' обновляем форму и значение ProgressBar1
FormWait.ProgressBar1.Value = progValue
FormWait.Repaint
DoEvents
End Sub

Даешь процедуру пользователю и пусть работает и не очень не думает, а теперь ему еще после каждого вызова проверять надо FormWait.blnBreak=True - не нажата ли была клавиша.
Правда можно из процедуры сделать функцию, чтобы она возращала нажатие клавиши, тогда пользов. уже не забудет проверить... :-)
267
21 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Ну да. Делаешь как-нибудь так:

 
Код:
Function НуКакТамНашЮзер() As String
    DoEvents
    if FormWait.blnBreak=True then
        НуКакТамНашЮзер="Устал ждать"
     else
        НуКакТамНашЮзер="Еще ждет"
     end if
End Function


включаешь эту штуку в модуль формы, и везде вставляешь
 
Код:
if НуКакТамНашЮзер()="Устал ждать" then End
258
21 марта 2003 года
SergeySV
1.5K / / 19.03.2003
:)

Кстати, мне очень понравилась твоя функция для создания "паузы": http://www.codenet.ru/progr/vbasic/vbloop.php - ее можно использовать для кнопки "Пауза/Продолжить"
267
21 марта 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by SergeySV
:)

Кстати, мне очень понравилась твоя функция для создания "паузы": http://www.codenet.ru/progr/vbasic/vbloop.php - ее можно использовать для кнопки "Пауза/Продолжить"



Почему "твоя"? Там ничего моего нет. А использовать, конечно, можно.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог