Форма в модальном режиме
Такой вопрос!
Есть форма, есть макрос.
Во время выполнения макроса (перебирает огромные таблицы данных) я вызываю форму на экран (UserForm.ShowModal (пробовал и просто Show)).
Так вот, что-то отображать на этой форме не имеет смысла, потому как она становится прозразного (или белого?) цвета и на ней ни фига не видно... :( Это происходит из-за того, что идет выполнение макроса?!
В общем, в идеале мне нужно чтобы пока макрос последовательно перебирает какие-то ячейки на форме отображалось столько уже перебрал, сколько осталось и т. п.
ПРИМЕЧАНИЕ!!! Проблема заключается в единственном:
Как отобразить на форме что-то во время выполнения макроса?!
Заранее благодарен, с уважением,
Дарова!
Такой вопрос!
Есть форма, есть макрос.
Во время выполнения макроса (перебирает огромные таблицы данных) я вызываю форму на экран (UserForm.ShowModal (пробовал и просто Show)).
Так вот, что-то отображать на этой форме не имеет смысла, потому как она становится прозразного (или белого?) цвета и на ней ни фига не видно... :( Это происходит из-за того, что идет выполнение макроса?!
В общем, в идеале мне нужно чтобы пока макрос последовательно перебирает какие-то ячейки на форме отображалось столько уже перебрал, сколько осталось и т. п.
ПРИМЕЧАНИЕ!!! Проблема заключается в единственном:
Как отобразить на форме что-то во время выполнения макроса?!
Заранее благодарен, с уважением,
Эта тема у нас тут уже обсуждалась:
http://forum.codenet.ru/showthread.php?s=&threadid=9705.
Готовое решение наверняка имеет SergeySV. Поскольку он регулярно сюда заходит, у тебя есть все шансы это решение увидеть.
Ну если че непонятно будет, пиши, подскажем, хотя там ничего сложного нет.. раз увидел и все понял.
Но все-таки, как без импорта и прочего вызвать на экран форму (мою) и изменять на ней кэпшион у лабелов во время выполнения макроса?! И чтобы при этом она не была прозрачной еще :) Ну пожалуйста!
Все хорошо, все доступно :)!
Но все-таки, как без импорта и прочего вызвать на экран форму (мою) и изменять на ней кэпшион у лабелов во время выполнения макроса?! И чтобы при этом она не была прозрачной еще :) Ну пожалуйста!
А разве .Repaint в комплекте с DoEvents не решают эту проблему?
И, кстати, Есть ведь в Экселе такая замечательная штука, как StatusBar! Почему бы не пользоваться ею для всяких промежуточных сообщений?
Все хорошо, все доступно :)!
Но все-таки, как без импорта и прочего вызвать на экран форму (мою) и изменять на ней кэпшион у лабелов во время выполнения макроса?! И чтобы при этом она не была прозрачной еще :) Ну пожалуйста!
1. Чтобы работа макроса не прерывалась, надо показывать форму с параметром: FormWait.Show vbModeless (А с параметром vbModal - она прервет выполнение и будет ждать пока форма не закроется/скроется).
2. Теперь чтобы обновить на этой форме какие-нибудь контролы во время выполнения макроса:
Так уж Excel (Office) устроен, что пока выполняется макрос все сообщения (нажатие клавиши пользов., на перерисовку UserForm и т.д.) придерживаются Excel до того момента, пока макрос не закончит свою работу. Однако выход есть. Специально для того, чтобы прервать работу макроса и заставить Excel обработать все пришедшие сообщения - используется оператор DoEvents. Теперь, вооруженный этими знаниями достаточно не сложно представить себе как в целом должно выгледить решение твоей проблемы:
1. Показать форму вот так:FormWait.Show vbModeless
2. В теле макроса меняем показания контролов на форме и сразу вызываем DoEvents, чтобы заставить Excel прерваться на обновление формы. Например:
...
UserForm1.Label1.Caption = "10%"
DoEvents
...
...
UserForm1.Label1.Caption = "20%"
DoEvents
...
...
UserForm1.Label1.Caption = "30%"
DoEvents
...
и т.д.
3. Закрываем форму: Unload UserForm1.
Вот и все.
Я так понимаю, что у тебя там уже все написано, осталось только дописать в нужных местах DoEvents и форму показывать с параметром vbModeless.
Если форма простая, то можно и так оставить все, а если у тебя несколько меняющихся контролов и кнопки еще, то лучше конечно все это собрать в одну Public функцию, объявить ее в модуле формы, а в модуле макроса, для обновления, вызывать только ее - получается красивее, эстетичнее и лишний код в макросе глаза не мозолит, но это уже так, рюшечки (хотя я думаю ты сам скоро к этому придешь).
А разве .Repaint в комплекте с DoEvents не решают эту проблему?
Кстати, экспериментировал с DoEvents и вот что:
Если изменить состояние какого-нибудь контрола на форме, то можно потом просто вызвать DoEvents и он автоматически сделает RePaint формы... так что я вообще у себя убрал в обработчике RePaint, оставив в конце только DoEvents и все работает.