Что лучше: отображать пользовательские формы ProgressBar в VBA как модальные или немодальные? Каковы лучшие практики для разработки индикаторов прогресса в VBA?
Немодальные пользовательские формы требуют использования Application.Interactive = False
, тогда как модальные пользовательские формы по самой своей природе блокируют любое взаимодействие с приложением до тех пор, пока основная процедура не завершится или не будет отменена.
Однако, если используется Application.Interactive = False
, клавиша Esc прерывает выполнение кода, поэтому использование Application.EnableCancelKey = xlErrorHandler
и обработка ошибок (Err.Number = 18
) требуется как в пользовательской форме, так и в вызывающей процедуре.
Процедуры вызова, интенсивно использующие ресурсы, также могут приводить к пропускам событий CommandButton_Click
и UserForm_Activate
в немодальных пользовательских формах.
В целом индикаторы выполнения, использующие модальные пользовательские формы, кажутся более простыми, поскольку выполняемый код полностью содержится в модуле UserForm, и необходимость в передаче переменных меньше.
Однако проблема с использованием модальных пользовательских форм для индикаторов выполнения заключается в том, что для каждой процедуры, которой требуется индикатор выполнения, требуется отдельный модуль UserForm, поскольку вызывающая процедура должна находиться внутри процедуры UserForm_Activate.
Таким образом, хотя можно иметь один многоразовый индикатор выполнения в немодальной пользовательской форме, это будет менее надежно, чем выполнение кода из нескольких модальных пользовательских форм.
Какой способ лучше?
Спасибо!