Excel Application.OnTime附加时间延迟

Excel Application.OnTime附加时间延迟,excel,vba,Excel,Vba,我使用宏每30分钟运行一次web查询。从网站获取数据大约需要45-75秒。基本上,它在一个小问题上运行良好。我第一次手动启动是在早上9点。大约需要1分钟才能完成。然后它在9:31、10:01、10:31、11:02等再次工作。我希望它应该是9:00、9:30、10:00等。如果文件已经打开,我还需要它在上午9:00自动启动。我正在使用以下代码: Sub RefreshAll() Call macro1 Application.OnTime Now + TimeValue("00:

我使用宏每30分钟运行一次web查询。从网站获取数据大约需要45-75秒。基本上,它在一个小问题上运行良好。我第一次手动启动是在早上9点。大约需要1分钟才能完成。然后它在9:31、10:01、10:31、11:02等再次工作。我希望它应该是9:00、9:30、10:00等。如果文件已经打开,我还需要它在上午9:00自动启动。我正在使用以下代码:

Sub RefreshAll()
    Call macro1
    Application.OnTime Now + TimeValue("00:30:00"), "RefreshAll"
End Sub

Sub macro1()
    'web query code here
End Sub
请提出建议。

在按@BigBen建议调用macro1之前运行Application.OnTime,或者另一种方法是将宏的开始时间写入变量。因此,无论macro1需要多长时间才能继续,它都将使用开始时间9:00+30分钟

然后检查macro1是否成功运行,如果成功,请设置On Time。 这样,如果获取数据失败,它就不会设置OnTime

Sub RefreshAll()
    Dim StartTime As date
    StartTime = Now 'remember the start time of the macro = 9:00

    If macro1 Then 'run macro1 and check if it returned true
        Application.OnTime StartTime + TimeValue("00:30:00"), "RefreshAll"
    End If
End Sub

Function macro1() As Boolean
    On Error Goto ERR_HANDLING

    'web query code here

ERR_HANDLING:
    If Err.Number = 0 Then
        macro1 = True 'return true if no errors
    Else
        MsgBox "Could not fetch data"
    End If
End Function
如果macro1的运行时可能超过您添加的时间值,您应该检查类似情况

    If macro1 Then 'run macro1 and check if it returned true
        If StartTime + TimeValue("00:30:00") > Now Then
            Application.OnTime StartTime + TimeValue("00:30:00"), "RefreshAll"
        Else
            MsgBox "Could not set OnTime because it was in the past."
        End If
    End If
如果计划为9:00、9:30等,请将Application.OnTime调用移动到第一行:

Sub RefreshAll()
    Application.OnTime Now + TimeValue("00:30:00"), "RefreshAll"
    Call macro1
End Sub
要在9:00自动运行RefreshAll(如果您在以下时间之前手动打开工作簿):
Private Sub Workbook_Open()
    Application.OnTime TimeValue("09:00:00"), "RefreshAll"
End Sub

将呼叫宏移到第二行,让Application.OnTime先运行?谢谢BigBen。这与你的建议很相配。如果文件已经打开,请告诉我如何在9:00自动启动。您可以在工作簿\u打开事件中有一个Application.OnTime。。。但是,如果文件已经打开,则不能保证它每天都在9:00运行,除非您每天都在9:00之前手动打开文件。我会使用任务计划和脚本来保证它的运行,但需要更多关于何时打开/关闭文件的详细信息。我会在8:30打开excel文件并手动启动第一个宏。现在,它将在9:00启动第二个宏以获取数据,代码如下:Application.OnTime TimeValue09:00:00,macro1。我的问题是如何将其与原始代码结合起来,每30分钟重复一次。如果您在8:30手动打开工作簿,请在工作簿\u打开事件中使用Application.OnTime。