Excel User Form click更新完成后,Application.OnTime过程正在运行
其中一个UserForms在按下submit后花费太多时间更新Excel。如果需要5秒钟以上,则向用户显示“请稍候…”消息,并在更新完成后将其关闭。假设用户名为“userform_A”。我使用了一个带有标题“请稍候…”的按钮,我正在打开/关闭可见性。在“USERFORM_A”的提交按钮点击事件中,我使用以下代码:Excel User Form click更新完成后,Application.OnTime过程正在运行,excel,vba,userform,Excel,Vba,Userform,其中一个UserForms在按下submit后花费太多时间更新Excel。如果需要5秒钟以上,则向用户显示“请稍候…”消息,并在更新完成后将其关闭。假设用户名为“userform_A”。我使用了一个带有标题“请稍候…”的按钮,我正在打开/关闭可见性。在“USERFORM_A”的提交按钮点击事件中,我使用以下代码: Application.OnTime EarliestTime:=fireTime, Procedure:="'PleaseWaitShow ""USERFORM_A""'" 程序如
Application.OnTime EarliestTime:=fireTime, Procedure:="'PleaseWaitShow ""USERFORM_A""'"
程序如下
Sub PleaseWaitShow(usrFrm As String)
Dim frm As UserForm
For Each frm In VBA.UserForms
If StrComp(TypeName(frm), usrFrm, vbTextCompare) = 0 Then
With frm
.Controls("UserWaitPrompt").Visible = True
.Controls("UserWaitPrompt").Top = ((.InsideHeight - .Controls("UserWaitPrompt").Height) / 2) + .ScrollTop
.Controls("UserWaitPrompt").ZOrder
.Repaint
End With
Exit For
End If
Next frm
End Sub
使用debug.print进行了检查,发现它没有运行该过程。更改“USERFORM_A”的按钮点击事件,如下所示
在完成按钮单击更新之前,立即窗口中的oputput如下所示
Before OnTime: 1/22/2020 8:43:58 PM
After OnTime: 0
Before closure: 13.078125
Inside Test_TT: 1/22/2020 8:44:11 PM
因此很明显,Application.OnTime只有在单击事件完成后或繁忙的用户窗体再次空闲之前才运行
请让我知道出了什么问题,如何克服这个问题或任何其他可能的解决方法。提前非常感谢。所以您的问题是,如果表单仍在执行,您是否希望在5秒钟后显示“请稍候…”?如果是这样的话,你可能会为此而挣扎。Excel是一个单线程应用程序:这意味着它必须一次按顺序完成一项任务。更新表单说:“请稍候…”然后开始活动有什么不对?非常感谢@Zac的快速回复。从最终用户的角度来看,即使活动花费的时间不多(比如不到2秒),显示“请稍候…”也会令人沮丧。如果没有办法,我会在活动开始时展示它。如果不知道几行代码在做什么,很难提出建议。一句话,就像我说的excel是一个单线程应用程序,所以你必须想出一个聪明的方法在你的代码行中实现它“几行代码”除了时间延迟之外不会有任何区别。你是不是建议在“几行代码”中间找出一个地方,从活动开始大约需要5秒,然后打电话给PleaseWaitShow?可以对其中一个用户表单执行此操作,但还有许多其他用户表单,并且存在不同的场景。如果这不是你所建议的,你能告诉我怎么做吗?计时器的优先级最低。应用程序队列中的任何其他消息都将跳过它。当程序没有其他事情做时,计时器就会启动。此外,消息/事件仅在不在代码块中时运行。
Before OnTime: 1/22/2020 8:43:58 PM
After OnTime: 0
Before closure: 13.078125
Inside Test_TT: 1/22/2020 8:44:11 PM