2013-11-18 3 views
0

Я хочу создать индикатор выполнения с помощью vba, чтобы визуализировать ход моего кода. Поэтому я создал простую пользовательскую форму PB, которая содержит среди прочего 2 ярлыка. Длина этих этикеток меняется много раз, чтобы показать ход выполнения кода. Моя проблема в том, что я хочу изменить размер этих меток, но изменение не видно. Есть несколько ярлыков, которые несколько раз переименовываются, но у меня такая же проблема.Обновление пользовательской формы Excel не работает

Итак, вот мой сокращенный код, который показывает только строки, относящиеся к пользовательской ПБ.

Этот код находится в стандартном модуле и содержит подлодку Start, который является отправной точкой для моего процесса:

Public Sub Start() 
    PB.Show 
    PB.Label2.Width = 100 
    PB.Label5.Width = 100 
    PB.Caption = "Please wait, files are being analyzed!" 'Header of the userform 
    PB.Label7.Caption = "Testing" 
    PB.Repaint 
    DoEvents 
End Sub 

Существует только немного кода внутри модуля UserForm PB:

Private Sub UserForm_Activate() 
    Label2.Width = 0 
    Label5.Width = 0 
End Sub 

Есть только 2 строки, но эти изменения в ширину = 0 выполняются. Когда это вспомогательное устройство будет завершено, будет выполнена остальная часть начального юнита. Ширина 100 присваивается меткам, некоторые другие метки переименовываются, но эти изменения остаются невидимыми.

Как вы видите, я попытался использовать Repaint и DoEvents, но это не помогло в моем случае. Мне нужно найти способ манипулировать пользовательской формой из внешнего модуля (а не модуля пользовательской формы). Вы можете мне помочь? У вас есть идея?

+1

Не ответ на ваш вопрос, но альтернатива .. http://stackoverflow.com/questions/10782394/pop-up-the-excel-statusbar/10787496#10787496 –

+0

Спасибо за эту ссылку, но я уже использовал другую образец самостоятельно. Образец работал, но когда я пытался использовать части этого кода, он больше не работал. См. Мой ответ ниже на мой вопрос, где я объяснил, как я получил его работу. – Eleandro

ответ

0

Извините за поздний повтор, но я не хотел оставлять свой вопрос без ответа. Я нашел способ или, может быть, причину, по которой мои изменения в пользовательской форме не были показаны.

Раньше, как показано в моем вопросе, у меня есть sub Start(), который инициируется, когда кнопка (пользовательская форма) кликнута. Затем Start() - sub инициирует мою пользовательскую форму, которая называется «PB». Так что этот порядок:

  1. Кнопка (Пользовательская форма) вызывает
  2. Start() - к югу, который затем вызывает
  3. PB-UserForm

я нашел только два различия в выборке из который я принимаю код. Я изменил кнопки элемента управления Active-X и в следующем порядке:

  1. Кнопка (Active-X) вызывает
  2. PB-UserForm называет
  3. Start() - к югу.

Код кнопки:

Private Sub CommandButton2_Click() 
    PB2.Show 
End Sub 

Код PB-UserForm:

Private Sub UserForm_Activate() 
    Label2.Width = 0 
    Label5.Width = 0 
    Call Main.Start 
End Sub 

Теперь все изменения Start() - к югу видимы и выполняются в «DoEvents ». Конечно, «PB.Show» внутри Start() - sub бесполезно, так как пользовательская форма PB уже видна.

Для меня основное изменение заключается в том, что функция Start() - sub вызывается пользовательской формой.Я не могу объяснить, почему нужно сначала вызвать пользовательскую форму, но почему-то кажется, что пользовательская форма теперь имеет «контроль» или что-то в этом роде. Может, кто-то может это объяснить.

EDIT: Последнее обновление: Я нашел причину, по которой пользовательская форма не обновлялась, когда я пробовал ее, как описано в моем вопросе. Короче говоря:

PB.Show vbmodeless 

Так что есть опция для шоу-метода. Без «vbmodeless» форма ждет действия пользователя/ввода. Но с опцией «vbmodeless» форма запускается сама по себе. Если вы хотите узнать больше, проверьте помощь VBA в шоу.

Смежные вопросы