为什么 VBA 中的加载栏是通过使用用户窗体调用主子例程而不是相反的方式创建的?

Why are loading bar in VBA created by using UserForms to call the main subroutine instead of the other way round?

我在 VBA 中阅读了很多关于使用 UserForms 创建加载条或进度条的教程,但它们都指导我完成以下步骤:

  1. 创建一个按钮来调用用户窗体
  2. 用户窗体调用子程序
  3. 子程序更新柱状图
  4. 在子程序中卸载栏

为什么我不能执行以下操作:

  1. 创建调用子程序的按钮
  2. 子程序调用用户窗体
  3. 子程序更新柱状图
  4. 在子程序中卸载栏

感谢您的宝贵时间!

没有什么能阻止你那样做。下面的代码显示了所需 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

解释两种方法的区别。

方法一

  1. 创建一个按钮来调用用户窗体
    我们加载用户表单模态(这是 Excel 中的默认行为),因此用户表单位于顶部,用户只能与该用户表单交互,而不能与 Excel 工作表交互,直到表格已关闭。
  2. 用户窗体调用子程序
    由于模式模式,只有那个用户窗体可以调用子程序。
  3. 子程序更新柱状图
  4. 在子程序中卸载栏

方法二

  1. 创建按钮调用子程序

  2. 子程序调用用户窗体
    需要无模式加载用户窗体。因为如果您以模式方式加载它,那么子例程的执行将在此时停止,直到再次关闭表单。如果您将其称为无模式,则子例程将继续执行,但表单不会阻塞 Excel 工作表,并且用户仍然可以在打开表单时编辑工作表。这就像让 Excel 和表格平行而不是让表格位于 Excel(模态)之上。

  3. 子程序更新柱状图
    子例程继续进行,因为窗体是无模式的。如果它是模态的,子例程将停止,直到表单关闭并且您无法再更新栏

  4. 在子程序中卸载栏


那么如何决定哪种方法最适合您呢?

这取决于您是希望允许用户在显示进度条时访问工作表(方法 2),还是不允许用户访问工作表并将表单保持在 Excel 顶部(方法 1)。这完全取决于您需要哪种方法。