【问题标题】:"Please Wait" popup message“请稍候”弹出消息
【发布时间】:2011-12-23 10:50:14
【问题描述】:

我正在尝试在 Excel VBA 中创建 Please Wait 消息。这是为了提醒处理 SQL 查询的用户该过程仍在进行中。我希望在用户表单中显示此消息。

当前,用户连接到 SQL DB,选择数据库和其他一些选项,按 Go... 并且表单没有卸载。在 Go 点,我有另一个表单弹出消息Please Wait,但此表单没有卸载,即 SQL 执行命令没有运行。

我调用Please Wait用户表单的代码,包括一个标签:

   Call WaitShowSQl.ExecuteCall KillWaitCall WaitShow
   SQl.Execute
   Call KillWait

在我的另一个代码模块中:

   Sub WaitShow()
   Wait.Show
   End Sub

   Sub KillWait()
   Unload Wait
   End Sub

我有名为wait 的用户表单,代码如下:

Private Sub UserForm_Activate()
Call PleaseWait
End Sub 

Sub PleaseWait()
Wait.Label1.Caption = "Calculating...Please Wait!"
End Sub

现在在执行代码时,运行时不会通过模块向后移动以执行以下操作:

SQl.ExecuteSQl.Execute

我可以用状态栏显示程序的进度,但用户窗体弹出消息对这个程序非常有用。

【问题讨论】:

    标签: vba excel popup


    【解决方案1】:

    Form.Show 方法的默认行为是将表单显示为模式对话框。您正在寻找的是一个无模式对话框,因此您需要指定它,如下所示:

    Sub WaitShow()
       Wait.Show vbModeLess
    End Sub
    

    更新:

    如果您不能使用无模式对话框,您可以使用其他选项,如评论中所述。其中之一是让等待用户窗体执行 SQL。可以这样做:

    在等待表单中,先声明变量

    Private mySomeParameter1 As String
    Private mySomeReturnValue1 As String
    
    'Input parameters to the form
    Public Sub Init(ByVal some_parameter1 As String, ...)
    ... Initialize your SQL, NOT execute it
    End Sub
    
    'Output values from the from
    Public Sub GetReturns(ByRef some_return_value1 As String, ...)
    ... set the output parameters...
    End Sub
    
    'Do the work
    Private Sub UserForm_Activate()
      Call PleaseWait
      'Either call DoEvents or a manual Refresh to let the label display itself
      Call ExecutSQL    ' A function that executes the SQL
      Unload Me
    End Sub
    

    在主窗体中:

    Sub WaitShow()
       Wait.Init(the parameters...)
       Wait.Show
       Wait.GetReturns(the results...)
    End Sub
    

    您的另一个选择是完全跳过等待窗体,而是在主窗体上显示“等待”图像并在 SQL 处理完成时将其隐藏。

    【讨论】:

    • 感谢 GTG 的回复。我已经尝试过了,得到了这个:Can't show non-modal form when modal form is display.
    • 另外,我忘了提到用户选择选项的第一个表单仍然显示。
    • 假设您的第一个表单需要是模态的,那么您可以将 SQL 执行代码放在“等待”用户表单中,或者从“等待”用户表单调用父表单中的函数。这样你就不需要任何额外的模块。第三种选择是为“等待”表单创建一个 ActiveX .exe,并让该进程显示一个无模式的“等待”表单。但是,这需要您将该 .exe 与 Excel 表一起部署。
    • 但是如果我将 SQL 执行放在“等待”用户窗体中,它将如何返回到调用等待窗体的主模块?因为我需要在 SQL Exec 之后从主模块执行其他东西。
    【解决方案2】:

    以下是在用户等待 Excel 完成处理时显示进度条的方法:

    https://stackoverflow.com/a/10791349/138938

    在您的情况下,您可以猜测查询的合理“平均”时间,并根据该时间的百分比更新进度条,这将使您的用户确信 Excel 正在工作并且他们不需要恐慌。

    【讨论】:

      【解决方案3】:

      我的解决方案远没有其他解决方案那么优雅和令人印象深刻。仅供参考,我的脚本正在处理 FOR...NEXT 循环中的多个合作伙伴,我想使用当前正在处理的合作伙伴更新屏幕。

      我创建了一个名为“消息”的工作表选项卡。我将单元格 A1 扩展得尽可能宽和高,并选择了我喜欢的配色方案。我的脚本首先关闭 ScreenUpdating。然后我

      Sheets("Messages").Select
      Cells(1, 1).Value = "Processing " & Partner
      Application.ScreenUpdating = True
      Application.ScreenUpdating = False
      

      在此之后,我返回到我需要的任何表格。没什么花哨的,但它快速、简单,并且可以满足我的需要。 :)

      【讨论】:

        【解决方案4】:

        我在表单上使用了一个命令按钮,设置为非常小的尺寸,在加载表单时隐藏,标题为“请稍候,正在处理...”

        我在表单 Iniliatlise 事件中调整按钮的大小(我只是使用顶部、左侧、宽度和高度属性调整到表单大小)。你当然可以把它做成你喜欢的任何尺寸。

        我在耗时的代码之前使命令按钮可见,并在代码末尾再次隐藏。

        需要一些“DoEvents”,但效果很好。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-17
          • 2012-09-12
          • 2022-08-16
          • 1970-01-01
          • 2011-09-02
          • 1970-01-01
          • 2012-05-30
          • 1970-01-01
          相关资源
          最近更新 更多