Function НуКакТамНашЮзер() As String
DoEvents
if FormWait.blnBreak=True then
НуКакТамНашЮзер="Устал ждать"
else
НуКакТамНашЮзер="Еще ждет"
end if
End Function
Остановка макроса из UserForm[vbModeless]
Ну как надоест польз. ждать конца выполнения (некоторые макросы с большими файлами работают), чтоб мог вырубить, как во всех приличных программах.
И вот такая неувязочка, мож кто сталкивался и смог решить эту проблему: Когда форма показ. в режиме vbModeless, то события о нажатие на какой-нибудь элемент доходит до формы в последнюю очередь, после того как Excel закончит свои вычисления, форматирование и все остальное,.. вообщем, когда уже и не нужно..
Долго маялся, пытался временно останавливать выполнения макроса (Application.Wait) и переводить фокус на кнопку FormWait.But_Cancel.SetFocus, многочисленные RePaint формы, но все равно (прям хоть PostMessage посылай :-( ) - не доходят до нее события - сначала Excel, а потом все остальное.. :-(
Такой возможность была бы на форме ожидания очень кстати.
Мож кто из спецов подскажит есть ли вообще возможность извернуться как-нибудь или все, кранты, можно и не пытаться это сделать.... ?
Но есть две мысли.
1. Поэкспериментируй с DoEvents. Эта штука меня часто выручала.
2. Может, отлавливать нажатия мышки через API функции?
Цитата:
Originally posted by Cutty Sark
Честно скажу, что готового рецепта у меня нет.
Но есть две мысли.
1. Поэкспериментируй с DoEvents. Эта штука меня часто выручала.
2. Может, отлавливать нажатия мышки через API функции?
Честно скажу, что готового рецепта у меня нет.
Но есть две мысли.
1. Поэкспериментируй с DoEvents. Эта штука меня часто выручала.
2. Может, отлавливать нажатия мышки через API функции?
1. Как раз DoEvents ща смотрю, надежд пока мало (событие Click там не любят или спец. скрывают...)
2. Да, эта наша тяжелая артиллерия... :-).
иногда правда бывает, что через API получается даже изящнее, так что будем дерзать, если что найду, обязательно напишу, потому что вещь я думаю нужная всем кто пишет макросы для общего употребления... Да и просто приятно..
Я его понаставлял в разные куски макроса, как раз где у меня 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
Может что поизящнее есть, чтобы из кода формы прекратить (не остановить, а прекратить) выполнение текущего макроса....?
Чтобы остановить - попробуй End
Кстати, в твоем способе нет ничего неизящного. Так что не стесняйся... :D
Просто я хотел свой код, относящийся к форме, максимально, как это сказать-то ..... инкапсулировать. Т.е. есть форма (один файл), включил ее в проект, перенес на другой комп, переслал другому человеку, и не надо потом долго объяснять за какие переменные там дергать, за чем следить, че проверять и вызывать.
А делать с этой формой особенного ничего и не надо, показал/скрыл ее, значения на 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 - не нажата ли была клавиша.
Правда можно из процедуры сделать функцию, чтобы она возращала нажатие клавиши, тогда пользов. уже не забудет проверить... :-)
Код:
включаешь эту штуку в модуль формы, и везде вставляешь
Код:
if НуКакТамНашЮзер()="Устал ждать" then End
Кстати, мне очень понравилась твоя функция для создания "паузы": http://www.codenet.ru/progr/vbasic/vbloop.php - ее можно использовать для кнопки "Пауза/Продолжить"
Цитата:
Originally posted by SergeySV
:)
Кстати, мне очень понравилась твоя функция для создания "паузы": http://www.codenet.ru/progr/vbasic/vbloop.php - ее можно использовать для кнопки "Пауза/Продолжить"
:)
Кстати, мне очень понравилась твоя функция для создания "паузы": http://www.codenet.ru/progr/vbasic/vbloop.php - ее можно использовать для кнопки "Пауза/Продолжить"
Почему "твоя"? Там ничего моего нет. А использовать, конечно, можно.