如何设置宏在特定时间运行,然后以设定的时间间隔运行?我希望它在每小时的顶部运行,因此我想在上午 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提出了关于内存使用的一个很好的观点,应该考虑这一点。为了学习的目的,我将提出一个替代解决方案,它不需要任务调度程序,并且可以完全在显示工作簿中工作。
在 VB 编辑器中,添加这个新子例程
Public Sub RefreshDataEachHour()
Application.OnTime Now + TimeValue("01:00:00"), "Refresh_All"
End Sub
并将以下行添加到 Refresh_All
例程的末尾
调用 RefreshDataEachHour
当 Refresh_All
例程第一次运行时,它将调用这个新过程,该过程将等待一个小时,然后调用 Refresh_All
。在 Refresh_All
结束时,它再次返回到此存储过程,该过程将再次等待一个小时,然后调用 Refresh_All
等。这将重复,直到退出 Excel 应用程序。
下面的这部分超出了您的问题范围,但我认为无论如何提及都很重要。
基本上,Application.OnTime
安排任务在将来的某个时间运行。您可能希望在某个时间点结束此计划任务。为此,您必须使用参数 Schedule:=False
调用 Application.OnTime
方法,并且必须传入您使用第一个 计划该过程的确切时间。 >Application.OnTime
调用。
要处理这种情况,请声明一个全局变量(在所有子例程之外)并将该变量传递到一个将取消任务的新子例程中。
例如,您可以声明
公共(public) RunWhen 作为日期
然后您可以按如下方式修改上述过程:
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
时,应该从队列中删除您的过程。
关于excel - 按时间间隔运行宏的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29782256/