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

Ваш аккаунт

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

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

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

Форма в модальном режиме

1.9K
12 мая 2003 года
DKef
44 / / 11.03.2003
Дарова!
Такой вопрос!
Есть форма, есть макрос.
Во время выполнения макроса (перебирает огромные таблицы данных) я вызываю форму на экран (UserForm.ShowModal (пробовал и просто Show)).
Так вот, что-то отображать на этой форме не имеет смысла, потому как она становится прозразного (или белого?) цвета и на ней ни фига не видно... :( Это происходит из-за того, что идет выполнение макроса?!
В общем, в идеале мне нужно чтобы пока макрос последовательно перебирает какие-то ячейки на форме отображалось столько уже перебрал, сколько осталось и т. п.
ПРИМЕЧАНИЕ!!! Проблема заключается в единственном:
Как отобразить на форме что-то во время выполнения макроса?!
Заранее благодарен, с уважением,
267
12 мая 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by DKef
Дарова!
Такой вопрос!
Есть форма, есть макрос.
Во время выполнения макроса (перебирает огромные таблицы данных) я вызываю форму на экран (UserForm.ShowModal (пробовал и просто Show)).
Так вот, что-то отображать на этой форме не имеет смысла, потому как она становится прозразного (или белого?) цвета и на ней ни фига не видно... :( Это происходит из-за того, что идет выполнение макроса?!
В общем, в идеале мне нужно чтобы пока макрос последовательно перебирает какие-то ячейки на форме отображалось столько уже перебрал, сколько осталось и т. п.
ПРИМЕЧАНИЕ!!! Проблема заключается в единственном:
Как отобразить на форме что-то во время выполнения макроса?!
Заранее благодарен, с уважением,



Эта тема у нас тут уже обсуждалась:
http://forum.codenet.ru/showthread.php?s=&threadid=9705.

Готовое решение наверняка имеет SergeySV. Поскольку он регулярно сюда заходит, у тебя есть все шансы это решение увидеть.

258
12 мая 2003 года
SergeySV
1.5K / / 19.03.2003
Да, вот последняя мессага где все (по возможности) обсудили и файл с формой я там выложил (благо он вообще малюсенький, кода там кот наплакал :-) ): http://forum.codenet.ru/showthread.php?s=&threadid=10072

Ну если че непонятно будет, пиши, подскажем, хотя там ничего сложного нет.. раз увидел и все понял.
1.9K
12 мая 2003 года
DKef
44 / / 11.03.2003
Все хорошо, все доступно :)!
Но все-таки, как без импорта и прочего вызвать на экран форму (мою) и изменять на ней кэпшион у лабелов во время выполнения макроса?! И чтобы при этом она не была прозрачной еще :) Ну пожалуйста!
267
12 мая 2003 года
Cutty Sark
1.2K / / 17.10.2002
Цитата:
Originally posted by DKef
Все хорошо, все доступно :)!
Но все-таки, как без импорта и прочего вызвать на экран форму (мою) и изменять на ней кэпшион у лабелов во время выполнения макроса?! И чтобы при этом она не была прозрачной еще :) Ну пожалуйста!



А разве .Repaint в комплекте с DoEvents не решают эту проблему?

И, кстати, Есть ведь в Экселе такая замечательная штука, как StatusBar! Почему бы не пользоваться ею для всяких промежуточных сообщений?

258
12 мая 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by DKef
Все хорошо, все доступно :)!
Но все-таки, как без импорта и прочего вызвать на экран форму (мою) и изменять на ней кэпшион у лабелов во время выполнения макроса?! И чтобы при этом она не была прозрачной еще :) Ну пожалуйста!



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 функцию, объявить ее в модуле формы, а в модуле макроса, для обновления, вызывать только ее - получается красивее, эстетичнее и лишний код в макросе глаза не мозолит, но это уже так, рюшечки (хотя я думаю ты сам скоро к этому придешь).

258
12 мая 2003 года
SergeySV
1.5K / / 19.03.2003
StatusBar - вообще отличная штука, не назойливая, проблем никаких, особенно если пишешь макросы для узкого круга людей и они в курсе куда смотреть... :-)
258
12 мая 2003 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by Cutty Sark
А разве .Repaint в комплекте с DoEvents не решают эту проблему?



Кстати, экспериментировал с DoEvents и вот что:
Если изменить состояние какого-нибудь контрола на форме, то можно потом просто вызвать DoEvents и он автоматически сделает RePaint формы... так что я вообще у себя убрал в обработчике RePaint, оставив в конце только DoEvents и все работает.

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