如何将宏设置为在特定时间运行,然后按设定的时间间隔运行?我希望它能在每小时的顶部运行,所以我想在早上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
答案 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运行。任务计划程序还具有(例如)发送电子邮件的功能,因此您可以将其设置为在每小时运行任务时通过电子邮件发送给您。