在VBA中,显示ProgressBar UserForms是模态的还是非模态的更好?在开发VBA进度指示器方面有哪些最佳实践?
非模态的UserForms需要使用
然而,如果使用了
资源密集型的调用过程也可能导致非模态UserForms中的
一般来说,使用模态UserForms的进度指示器似乎更简单,因为正在执行的代码完全包含在UserForm模块中,并且不需要传递变量。
然而,使用模态UserForms作为进度指示器的问题在于,每个需要进度指示器的过程都需要一个单独的UserForm模块,因为调用过程必须在UserForm_Activate过程内部。
因此,虽然可以在非模态UserForm中拥有一个可重用的进度指示器,但它的可靠性将低于从多个模态UserForms中执行代码的可靠性。
哪种方式更好?
谢谢!
非模态的UserForms需要使用
Application.Interactive = False
,而模态的UserForms则会阻止与应用程序的任何交互,直到核心过程完成或被取消。然而,如果使用了
Application.Interactive = False
,那么Esc键将中断代码执行,因此在UserForm和调用过程中都需要使用Application.EnableCancelKey = xlErrorHandler
和错误处理(Err.Number = 18
)。资源密集型的调用过程也可能导致非模态UserForms中的
CommandButton_Click
和UserForm_Activate
事件失灵。一般来说,使用模态UserForms的进度指示器似乎更简单,因为正在执行的代码完全包含在UserForm模块中,并且不需要传递变量。
然而,使用模态UserForms作为进度指示器的问题在于,每个需要进度指示器的过程都需要一个单独的UserForm模块,因为调用过程必须在UserForm_Activate过程内部。
因此,虽然可以在非模态UserForm中拥有一个可重用的进度指示器,但它的可靠性将低于从多个模态UserForms中执行代码的可靠性。
哪种方式更好?
谢谢!