代码以时间间隔运行宏?

时间:2015-04-21 20:16:06

标签: excel excel-vba time intervals vba

如何将宏设置为在特定时间运行,然后按设定的时间间隔运行?我希望它能在每小时的顶部运行,所以我想在早上7点开始运行,然后在我希望它再次运行后每小时运行一次。这是代码:

Sub Refresh_All()
'
' Refresh_All Macro
'
' Keyboard Shortcut: Ctrl+Y
'
    ChDir "Q:\Quality Control"
    Workbooks.Open Filename:= _
        "Q:\Quality Control\Internal Failure Log - Variable Month.xlsm"
    Dim endTime As Date
    endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
DoEvents
    Loop
    ActiveWorkbook.RefreshAll
       endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.Save
    endTime = DateAdd("s", 5, Now())
    Do While Now() < endTime
        DoEvents
    Loop
    ActiveWindow.Close
    ChDir "Q:\Reports"
    Workbooks.Open Filename:= _
        "Q:\Reports\Finished-Transfer Report-variable month.xlsm"
        endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.RefreshAll
     endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.Save
        endTime = DateAdd("s", 5, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWindow.Close
    ActiveWorkbook.RefreshAll
        endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.Save
End Sub

2 个答案:

答案 0 :(得分:6)

Lumigraphics提出了关于内存使用的一个好点,应该考虑这一点。为了学习,我将提出一个不需要任务调度程序的替代解决方案,并且将完全在显示工作簿中工作。

在VB编辑器中,添加这个新的子程序

Public Sub RefreshDataEachHour()

    Application.OnTime Now + TimeValue("01:00:00"), "Refresh_All"

End Sub

并在Refresh_All例程

的末尾添加以下行

Call RefreshDataEachHour

第一次运行Refresh_All例程时,它将调用此新过程,然后等待一小时,然后调用Refresh_All。再次在Refresh_All结束时,它返回到此存储过程,该过程将再次等待一个小时,然后调用Refresh_All等。这将重复,直到Excel应用程序退出。

以下部分超出了您的问题的范围,但我觉得无论如何都要提及。

基本上,Application.OnTime会安排任务在将来的某个时间点运行。您可能希望在某个时间点结束此计划任务。为此,您必须使用参数Application.OnTime调用Schedule:=False方法,并且必须通过第一次Application.OnTime调用传递您安排该过程的确切时间。

要处理这种情况,请声明一个全局变量(在所有子例程之外)并将该变量传递给将取消该任务的新子例程。

例如,您可以声明

Public RunWhen As Date

然后您将修改上述过程,如下所示:

Public Sub RefreshDataEachHour()

    RunWhen = Now + TimeValue("01:00:00")
    Application.OnTime EarliestTime:=RunWhen,Procedure:="Refresh_All",Schedule:=True

End Sub

然后你可以添加另一个处理任务取消的子程序,如下所示:

Public Sub CancelRefresh()

    Application.OnTime EarliestTime:=RunWhen, Procedure:="Refresh_All", Schedule:=False

End Sub

每当您使用Call CancelRefresh 从队列中删除您的程序时。

答案 1 :(得分:1)

Windows有一个内置的任务计划程序。将您的宏放入工作簿并将其设置为在WorkBook.Open事件上运行。 https://msdn.microsoft.com/en-us/library/office/ff196215.aspx

将任务计划程序设置为每小时打开该Excel文件,运行宏,并让它在最后关闭文件。这样可以减少内存使用量,同时保持Excel运行。任务计划程序还具有(例如)发送电子邮件的功能,因此您可以将其设置为在每小时运行任务时通过电子邮件发送给您。