我正在尝试在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弹出消息对此程序非常有用。
答案 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正在运行且他们不需要恐慌。< / 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;,但效果很好。