Почему панель загрузки в VBA создается с помощью пользовательских форм для вызова основной подпрограммы, а не наоборот?
Я прочитал немало учебников по созданию панели загрузки или индикатора выполнения с использованием пользовательских форм в VBA, но все они помогают мне выполнить следующие шаги:
- Создать кнопку для вызова пользовательской формы
- UserForm вызывает подпрограмму
- Подпрограмма обновляет панель
- Разгрузить бар в подпрограмме
Почему я не могу сделать следующее вместо этого:
- Создать кнопку для вызова подпрограммы
- Подпрограмма вызывает UserForm
- Подпрограмма обновляет панель
- Разгрузить бар в подпрограмме
Спасибо за ваше время!
2 ответа
Ничто не мешает вам делать это таким образом. Код ниже показывает грубый макет необходимого VBA.
Такой подход облегчает повторное использование формы прогресса в других и других проектах. Просто убедитесь, что логика прогресса в подпрограмме отделена от логики отображения внутри формы.
' Event fired by a button on the Excel grid.
Sub Example_OnClick()
Dim myForm As UserForm1 ' Replace with your form here.
' Display the form.
' Ensure it is not modal, as this would prevent subsequent lines
' from executing while the form is open.
myForm.Show False
Do Until myForm.Progress = 100
' ToDo: Add processing logic here.
' Update the progress bar.
myForm.IncrementPrgress 1
Loop
' Remove the from
Unload myForm
End Sub
Чтобы объяснить различия между 2 методами.
Способ 1
- Создать кнопку для вызова пользовательской формы
Мы загружаем модальную форму пользователя (это поведение по умолчанию в Excel), поэтому пользовательская форма находится сверху, и пользователь может взаимодействовать только с этой пользовательской формой, но не с листами Excel, пока форма не будет закрыта. - UserForm вызывает подпрограмму
Только эта пользовательская форма может вызывать подпрограмму из-за модального режима. - Подпрограмма обновляет панель
- Разгрузить бар в подпрограмме
Способ 2
Создать кнопку для вызова подпрограммы
Подпрограмма вызывает UserForm
Пользовательская форма должна быть загружена без режима. Потому что, если вы загрузите его модально, выполнение подпрограммы остановится на этом этапе, пока форма снова не закроется. Если вы называете это немодальным, то выполнение подпрограммы продолжается, но форма не блокирует листы Excel, и пользователь все еще может редактировать листы, пока форма открыта. Это похоже на параллель Excel и формы вместо формы поверх Excel (модальной).- Подпрограмма обновляет панель
Подпрограмма продолжается, потому что форма немодальна. Если бы это было модально, подпрограмма остановилась бы, пока форма не закрылась, и вы больше не могли бы обновлять бар - Разгрузить бар в подпрограмме
Итак, как решить, какой метод лучше для вас?
Это зависит от того, хотите ли вы предоставить пользователю доступ к рабочему листу, пока отображается индикатор выполнения (метод 2), или запретите его и сохраните форму поверх Excel (метод 1). Это зависит только от вас, какой подход вам нужен.