代码在时间间隔上运行macros?

我怎样才能设置macros在特定的时间运行,然后在设定的时间间隔之后运行? 我希望它在每个小时的顶部运行,所以我想在上午07:00开始,然后每隔一小时我想再次运行。 这里是代码:

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 

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

在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计划一个任务在将来的某个点运行。 您可能希望在某个时间点结束此计划的任务。 为此,必须使用参数Schedule:=False调用Application.OnTime方法,并且您必须在确定的时间内通过您的第一个Application.OnTime调用来调度过程。

为了处理这种情况,声明一个全局variables(在你所有的子程序之外),并把这个variables传递给一个新的子程序来取消这个任务。

例如,你可以声明

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应该从队列中删除您的过程。

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

设置任务计划程序每小时打开一次该文件,运行该macros,并在最后closures文件。 这减less了内存使用量,保持Excel运行。 任务计划程序还具有(例如)发送电子邮件的function,所以您可以将其设置为每小时执行一次任务时向您发送电子邮件。