|
使用OnTime安排执行过程
你可能需要设计Excel工作簿定期并自动地运行一个过程。例如,你可能想每隔几分钟从数据源中更新数据。使用VBA,你能执行Excel应用程序的OnTime方法指令Excel在给定的时间去运行某过程。通过编写代码使程序自已调用OnTime方法,能使VBA代码定期自动执行。本篇文章描述处理这种情况的VBA过程。
介绍
OnTime方法要求指定日期和时间以及要运行的过程作为参数,重要的是要记住具体地告诉Excel什么时候运行这个过程而不是从当前时间的偏差。为了取消一个未执行的OnTime过程,你必须经过该过程计划要运行的确切的时间,你不能够告诉Excel取消下一个计划执行的过程。因此,建议将安排过程开始运行的时间存放在一个公共的(或全局)变量中,该变量作用于所有的代码。然后,你能使用所存储时间的变量去安排运行或取消事件。下面的示例代码存储了所运行过程的名称和重复执行的时间间隔在公共的常量中,当然这不是必需的。
Public RunWhen As Double
Public Const cRunIntervalSeconds = 120 ' two minutes
Public Const cRunWhat = "The_Sub"
开始一个定时的过程
为开始这个过程,使用一个名为 StartTimer的子程序。代码如下:
Sub StartTimer()
RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)
Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat, _
schedule:=True
End Sub
将比当前时间多两分钟的日期和时间存放在RunWhen变量中,然后调用OnTime方法指令Excel何时运行cRunWhat过程。
“The_Sub”是一个字符串变量,Excel将在合适的时间运行该过程。下面是该过程代码示例:
Sub The_Sub()
'
' your code here
'
StartTimer
End Sub
注意The_Sub子程序的最后一行调用了StartTimer过程,再次重复运行这个过程。并且当The_Sub过程下次被OnTime调用时,将再次调用StartTimer来重复执行它自已。这就是如何执行周期循环的方法。
停止一个定时的过程
有时,当关闭工作簿时或者满足某个条件时需要停止定时执行的过程。由于OnTime方法是Application对象的一部分,简单地关闭已创建事件的工作簿不会取消对OnTime的调用。一旦Excel自身保持运行,它将执行OnTime过程,并且在必要时会自动打开该工作簿。
为了停止OnTime过程,必须对OnTime方法指定确切的时间,这就是我们将时间作为公共的变量存放在RunWhen中的原因。否则,没办法知道过程计划执行的确切时间。(所计划的时间像OnTime方法中的一把“钥匙”,如果没有它,就没有通往事件的入口)
下面是一个名为StopTimer的子过程,它将停止要执行的OnTime过程。
Sub StopTimer()
On Error Resume Next
Application.OnTime earliesttime:=RunWhen, _
procedure:=cRunWhat, schedule:=False
End Sub
这个子程序使用了和StartTimer子程序相同的OnTime语法,将schedule参数设置为False告诉Excel取消该过程的执行。你可能想在Auto_Close宏或Workbook_BeforeClose事件中包括一个对该过程的调用。在StopTimer子程序中,使用On Error Resume Next语句忽略当你企图删除一个不存在的过程时可能产生的任何错误。
|
|