49 2核反应堆:Application.OnTime

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 16:32:19
安排宏在指定的时间和间隔运行(OnTime方法)
可以使用Application对象的OnTime方法在指定的时间或者在有规律的时间间隔运行某过程。OnTime方法的语法如下:
Application.OnTime(EarliestTime,Procedure,LastestTime,Schedule)

参数EarliestTime指明希望何时运行由参数Procedure指定的过程,可选的参数LastestTime和Schedule指明过程运行的最迟时间,以及是否安排运行一个新过程或者删除已经存在的过程。当开始调用某过程而Excel正忙时,则需要使用参数LastestTime指定希望调用该过程的时间区间。如果使用Application对象的Wait方法暂停某宏,所有的Excel行为,包括手工交互操作,都将被挂起。OnTime方法的优势在于,当等待运行安排的宏时,允许返回正常的Excel交互操作,包括运行其他的宏。
下面的示例指定每隔5分钟运行一次名为YourProc的过程:

Application.OnTime EarliestTime:=Now + TimeValue("00:05:00"), Procedure:="YourProc"

下面的示例在每天中午运行过程YourProc:

Application.OnTime EarliestTime:=TimeValue("12:00:00"), Procedure:="YourProc"

下面的示例安排每隔5分钟调用一次AutoSave过程。如果关闭该工作簿,则调用CleanUp过程来执行可能希望的清理以及删除任何额外的调用。

Private Sub Workbook_Open()    Application.OnTime Now + TimeValue("00:05:00"), "AutoSave"End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean)    On Error Resume Next    Application.OnTime Now + TimeValue("00:05:00"), "CleanUp", , FalseEnd Sub

注意,Workbook_Open事件和Workbook_BeforeClose事件包含在工作簿代码模块中,而AutoSave过程和CleanUp过程则存在于标准代码模块中。
当使用OnTime方法安排在将来的某个时间运行宏时,必须确保Excel一直在内存中运行直至到达安排的时间。但不需要一直打开包含OnTime宏的工作簿。如果需要,Excel将打开该工作簿。
通过上述简介,我们已经了解了OnTime方法的基本用法。下面再详细介绍OnTime方法。
有时,我们可能需要设计Excel工作簿定期并自动地运行一个过程。例如,可能希望每隔几分钟从数据源中更新数据,此时执行Excel应用程序的OnTime方法指令Excel在给定的时间去运行某过程。通过编写代码使程序自已调用OnTime方法,能使VBA代码定期自动执行。
OnTime方法要求指定日期和时间以及要运行的过程作为参数,重要的是要记住具体地告诉Excel什么时候运行这个过程而不是从当前时间开始的偏差。为了取消一个未执行的OnTime过程,必须经过该过程计划要运行的确切的时间,不能够告诉Excel取消下一个计划执行的过程。因此,建议将安排过程开始运行的时间存放在一个公共的(或全局)变量中,该变量作用于所有的代码。然后,能够使用所存储时间的变量去安排运行或取消事件。下面的示例代码在公共的常量中存储了所运行过程的名称和重复执行的时间间隔,当然这不是必需的。

Public RunWhen As DoublePublic Const cRunIntervalSeconds = 120 ' two minutesPublic Const cRunWhat = "The_Sub"

为开始这个过程,使用一个名为 StartTimer的子程序。代码如下:

Sub StartTimer()    RunWhen = Now + TimeSerial(0, 0, cRunIntervalSeconds)    Application.OnTime earliesttime:=RunWhen, procedure:=cRunWhat, _        schedule:=TrueEnd Sub

将比当前时间多两分钟的日期和时间存放在RunWhen变量中,然后调用OnTime方法指令Excel何时运行cRunWhat过程。
“The_Sub”是一个字符串变量,Excel将在合适的时间运行该过程。下面是该过程代码示例:

Sub The_Sub()    '    '这里放置代码    '    StartTimerEnd Sub

注意,The_Sub过程的最后一行调用了StartTimer过程,再次重复运行这个过程。并且当下次使用OnTime调用The_Sub过程时,将再次调用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:=FalseEnd Sub

这个过程使用了和StartTimer过程相同的OnTime语法,将schedule参数设置为False告诉Excel取消该过程的执行。可能希望在Auto_Close宏或Workbook_BeforeClose事件中包括一个对该过程的调用。在StopTimer过程中,使用On Error Resume Next语句忽略当你企图删除一个不存在的过程时可能产生的任何错误。
下面的示例演示当在单元格B1中输入一个值后,如果A1单元格中不为空,那么将在10秒后自动清除单元格A1和B1中的内容。示例代码如下:
在标准模块中输入如下代码:

Sub DeleteContents()    Worksheets("Sheet1").Range("A1:B1").ClearContentsEnd SubSub MyEntry()    Range("B1").Value = "Goodbye"End Sub

在工作表sheet1代码模块中输入如下代码:

Private Sub Worksheet_Change(ByVal Target As Range)    If Target.Address <> "$B$1" Then Exit Sub    If IsEmpty(Target) Or IsEmpty(Target.Offset(0, -1)) Then Exit Sub    Application.OnTime Now + TimeSerial(0, 0, 10), "DeleteContents"End Sub