“请等待”弹出消息

时间:2011-12-23 10:50:15

标签: excel vba excel-vba popup

我正在尝试在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

我可以使用状态栏显示程序的进度,但是userform弹出消息对此程序非常有用。

4 个答案:

答案 0 :(得分:6)

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

Sub WaitShow()
   Wait.Show vbModeLess
End Sub

更新

如果您无法使用无模式对话框,则还有其他选项,如评论中所述。其中一个是让wait userform执行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

另一个选择是完全跳过Wait表单,而是在mainform上显示一个“Waiting”图像,并在SQL处理完成后隐藏它。

答案 1 :(得分:1)

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

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

Excel progress bar

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

答案 2 :(得分:0)

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

我创建了一个名为“Messages”的工作表标签。我尽可能宽大地扩展了单元格A1,我选择了一种我喜欢的颜色方案,我喜欢它。我的脚本首先关闭ScreenUpdating。然后我

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

在此之后,我回到我需要的任何表格。没有什么花哨的,但它快速,简单,并且做我需要的。 :)

答案 3 :(得分:0)

我在表单上使用一个命令按钮设置为一个非常小的大小,在表单加载时隐藏,标题为“#34;请稍候,处理......&#34;

我在Iniliatlise事件中调整按钮的大小(我只需使用top,left,width&amp; height属性调整表单大小)。你当然可以做任何你喜欢的尺寸。

我在耗费代码和时间之前使命令按钮可见。在代码的末尾再次隐藏它。

需要一些&#34; DoEvents&#34;,但效果很好。