Vba &引用;请稍等;弹出消息

Vba &引用;请稍等;弹出消息,vba,excel,popup,Vba,Excel,Popup,我正试图在Excel VBA中创建一条请稍候消息。这是为了提醒处理SQL查询的用户该过程仍在进行中。我希望将此消息显示在userform中 目前,用户连接到SQL数据库,选择数据库和其他一些选项,按Go。。。并且表单不会卸载。在Go点,我有另一个窗体,弹出消息请稍候,但此窗体不卸载,即SQL execute命令不运行 我调用用户表单的代码请稍候,包括标签: Call WaitShowSQl.ExecuteCall KillWaitCall WaitShow SQl.Execute

我正试图在Excel VBA中创建一条
请稍候
消息。这是为了提醒处理SQL查询的用户该过程仍在进行中。我希望将此消息显示在userform中

目前,用户连接到SQL数据库,选择数据库和其他一些选项,按Go。。。并且表单不会卸载。在Go点,我有另一个窗体,弹出消息
请稍候
,但此窗体不卸载,即SQL execute命令不运行

我调用
用户表单的代码请稍候,包括标签:

   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弹出消息对该程序非常有用。

表单的默认行为。show方法是将表单显示为模式对话框。您要查找的是一个无模式对话框,因此需要指定如下内容:

Sub WaitShow()
   Wait.Show vbModeLess
End Sub
更新:

如果您不能使用无模式对话框,则可以使用其他选项,如注释中所述。其中之一是让wait用户表单执行SQL。可以这样做:

Sub WaitShow()
   Wait.Show vbModeLess
End Sub
在wait表单中,首先声明变量

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处理完成时将其隐藏。

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


在您的情况下,您可以为您的查询猜测一个合理的“平均”时间,并用该时间的百分比更新进度栏,这将向您的用户保证Excel正在工作,他们不必惊慌。

我的解决方案远不如其他解决方案优雅和令人印象深刻。仅供参考,我的脚本正在for…NEXT循环中为多个合作伙伴进行处理,我想用当前正在处理的合作伙伴更新屏幕

我创建了一个名为“消息”的工作表选项卡。我把A1单元扩展得尽可能宽和高,然后我选择了一种我喜欢的字体,一种我喜欢的配色方案。我的脚本从关闭屏幕更新开始。我那么

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

在这之后,我回到我需要的任何工作表。没什么特别的,但它快速、简单,而且能满足我的需要。:)

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

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

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


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

谢谢回复GTG。我已经尝试过了,并且得到了这样的结果:当显示模式表单时,无法显示非模式表单。此外,我忘了提到用户选择选项的第一个表单仍然显示。假设您的第一个表单需要是模式表单,那么您可以将SQL执行代码放在“等待”中userform或从“等待”userform调用父窗体中的函数。这样你就不需要任何额外的模块了。第三个选项是为“Waiting”表单创建一个ActiveX.exe,并让该进程显示一个无模式的“Waiting”表单。但是,这需要将该.exe与Excel表一起部署。但是,如果我将SQL执行放在“等待”用户表单中,它将如何返回到调用等待表单的主模块?因为我需要在SQL Exec之后从主模块执行其他内容。