Лучше показать ProgressBar UserForms в VBA как модальный или немодальный? Каковы лучшие практики для разработки индикаторов хода выполнения в VBA?
Немодальные UserForms требуют использования Application.Interactive = False
, тогда как Модальные UserForms по самой своей природе блокируют любое взаимодействие с приложением, пока базовая процедура не закончилась или отменяется.
Если Application.Interactive = False
используется, однако, клавиша Esc прерывает выполнение кода, таким образом, использование Application.EnableCancelKey = xlErrorHandler
и обработка ошибок (Err.Number = 18
) требуется и в UserForm и в процедуре вызова.
Интенсивно использующие ресурсы процедуры вызова могут также привести к CommandButton_Click
и UserForm_Activate
события, дающие осечку в немодальном UserForms.
В целом индикаторы хода выполнения, которые используют модальный UserForms, кажутся более простыми, потому что код, который выполняется, полностью содержится в модуле UserForm, и существует меньше потребности в передаче переменных.
Проблема, однако, с использованием модального UserForms для индикаторов хода выполнения состоит в том, что отдельный модуль UserForm требуется для каждой процедуры, для которой нужен индикатор хода выполнения, потому что процедура вызова должна быть в процедуре UserForm_Activate.
Так, в то время как возможно иметь единственный допускающий повторное использование индикатор хода выполнения в немодальном UserForm, это будет менее надежно, чем выполнение кода из нескольких модальных UserForms.
Какой путь лучше?
Спасибо!
Я собираюсь закрыть это и сказать, что Modal победил. Я пробовал оба способа, но в итоге вы пытаетесь закрыть слишком много лазеек с помощью немодальных пользовательских форм. Модальный сложнее, потому что он более строг, но он побуждает вас разбивать код на более мелкие части, что в любом случае лучше в долгосрочной перспективе.
Также есть третий способ, используя Application .statusbar
.
Вы даже можете моделировать истинный бар прогресс, используя последовательность символов U + 25A0 и U + 25A1.