Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel User Form click更新完成后,Application.OnTime过程正在运行_Excel_Vba_Userform - Fatal编程技术网

Excel User Form click更新完成后,Application.OnTime过程正在运行

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""'" 程序如

其中一个UserForms在按下submit后花费太多时间更新Excel。如果需要5秒钟以上,则向用户显示“请稍候…”消息,并在更新完成后将其关闭。假设用户名为“userform_A”。我使用了一个带有标题“请稍候…”的按钮,我正在打开/关闭可见性。在“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