Автоматически выполнять некоторый код после отрисовки пользовательской формы - PullRequest
4 голосов
/ 02 апреля 2012

Я создал пользовательскую форму, в которой пользователь должен заполнить три поля.Макрос пытается автоматически определить значения этих полей в событии UserForm_Initialize(), затем отображает найденные значения в трех полях, но пользователь может их изменить.Однако автоопределение занимает несколько секунд и задерживает появление пользовательской формы.Я бы хотел, чтобы пользовательская форма отображалась с пустыми полями перед процедурой автоопределения, а затем чтобы процедура автоопределения заполняла поля автоматически.Каков был бы лучший способ сделать это?Если сделать пользовательскую форму немодальной, макрос будет работать без ожидания ввода пользователя, что проблематично.Я не хочу иметь кнопку «автоопределение»: это должно быть сделано автоматически.

Ответы [ 3 ]

10 голосов
/ 02 апреля 2012

Используйте событие Activate() вместо Initialize():)

Private Sub UserForm_Activate()

End Sub

Followup

Спасибо! Это работает, но, похоже, есть ошибка: диалог отображается белым, пока макрос не завершится. снимок экрана (диалоговое окно должно быть серым)

Нет. Это не ошибка :) Попробуйте это. Добавьте Doevents, как показано ниже.

Private Sub UserForm_Activate()
    UserForm1.ProgressBar1.Value = 0
    starttime = Timer
    While Timer - starttime < 1
        UserForm1.ProgressBar1.Value = (Timer - starttime) * 100
        DoEvents
    Wend
End Sub

НТН

Sid

0 голосов
/ 01 декабря 2014

Есть более простой способ сделать это ...

1) В пользовательской форме создайте новый CommandButton, который будет выполнять макрос, который вы хотите запустить.

2) Установите высоту и ширину кнопки на 0

3) Убедитесь, что параметр «TabIndex» для кнопки равен 0 ... Это создаст «невидимую» CommandButton, которая получит фокус, как только форма откроется.

4) В процедуре вызова непосредственно перед командой, которая «показывает», пользовательская форма вводит строку - «Application.SendKeys» ~ »'

Как это работает ...

Командная кнопка, созданная в (1), является действительным элементом управления, как и любой другой, за исключением того, что вы не можете его увидеть или щелкнуть по нему кнопкой мыши. Команда «SendKeys» воспроизводит щелчок левой кнопкой мыши, который сохраняется в буфере клавиатуры до тех пор, пока форма не отобразится, когда она будет прочитана. Это имеет тот же эффект, что и щелчок мышью, и запускает необходимый макрос.

Кстати, если вы вызываете макрос из более чем одного места и хотите, чтобы различные действия зависели от источника вызова, вы можете добавить более одной «невидимой» кнопки и добавить «{Tab}» перед « ~ "символ для перемещения фокуса через доступные элементы управления. например 'Application.SendKeys "{Tab} ~"' активирует кнопку с параметром 'TabIndex', установленным в 1. 'Application.SendKeys "{Tab} {Tab} {Tab} {Tab} ~"' активирует кнопку с параметр TabIndex установлен на 4 и т. д.

РФ

0 голосов
/ 02 апреля 2012

Я бы предложил использовать таймер. Откройте форму с полями ввода, отключенными и пустыми, и установите таймер на срабатывание в течение нескольких сотен миллисекунд. Это должно позволить немедленно отобразить форму. Выполните автоматическое обнаружение в пределах события отметки времени таймера (сначала отключите таймер), затем включите поля и заполните обнаруженные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...