VBA定时执行某程序
OnTime 方法
参阅应用于示例特性安排一个过程在将来的特定时间运行(既可以是具体指定的某个时间,也可以是指定的一段时间之后)。
expression.OnTime(EarliestTime, Procedure, LatestTime, Schedule)
expression 必需。该表达式返回一个 Application 对象。
EarliestTime Variant 类型,必需。设置过程开始运行的时间。
Procedure String 类型,必需。设置要运行的过程名。
LatestTime Variant 类型,可选。过程开始运行的最晚时间。例如,LatestTime 参数设为 EarliestTime + 30,当时间到了 EarliestTime 时,如果由于其他程序处于运行状态 Microsoft Excel 不处于“就绪”、“复制”、“剪切”或“查找”模式,则 Microsoft Excel 将等待 30 秒让第一个过程先结束运行。如果 30 秒内 Microsoft Excel 不能回到“就绪”模式,则不运行此过程。如果省略该参数,Microsoft Excel 将一直等待到可以运行该过程为止。
Schedule Variant 类型,可选。如果该值为 True,则安排一个新的 OnTime 过程。如果该值为 False,则清除先前设置的过程。默认值为 True。
说明
使用 Now + TimeValue(time) 可安排经过一段时间(从现在开始计时)之后运行某个过程。使用 TimeValue(time) 可安排某个过程只运行指定的时间。
示例
本示例设置 15 秒后运行 my_Procedure 过程,从现在开始计时。
Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure"
本示例设置 my_Procedure 在下午 5 点开始运行。
Application.OnTime TimeValue("17:00:00"), "my_Procedure"
本示例撤消前一个示例对 OnTime 的设置。
Application.OnTime EarliestTime:=TimeValue("17:00:00"), _
Procedure:="my_Procedure", Schedule:=False
Sub hi() Debug.Print "hello" End Sub Sub AutoRun() hi Application.OnTime TimeValue("14:03:00"), "AutoRun" End Sub
在工作中我们经常需要定时执行某程序,或者有时需要每隔特定时间执行某个程序,例如我们需要每15分钟执行一次保存的动作,这个功能在VBA中是通过Application.OnTime函数来实现的。这个函数有两个参数,一个是执行程序的时间,另一个是要执行的程序名称。下面来看一代简单代码
Sub macro1()
Dim NewTime As Date
NewTime = Now + TimeValue("00:00:05")
Application.OnTime NewTime, "Macro2"
End SubSub macro2()
MsgBox "你执行了程序Macro2"
End Sub
上面Macro1代码的意思是在5秒之后执行宏Macro2,在Macro1中我们定义了一个日期变量NewTime,其值是当前时间加上5秒,注意下这里时间的写法,"hh:mm:ss"时、分、秒。之后用到application.ontime函数,两个参数上面说过了,一个代表时间,一个代表要执行的程序。要想在5秒之后执行Macro2,你首先要手动运行Macro1,这样5秒之后才会运行Macro2,这点很重要,不要以为写出了这个代码其就可以自动运行了。
上面只是在特定时间执行某程序,那现在如果我们要循环执行某程序怎么办?比如我们每隔10秒钟就要执行一次自动保存的动作。这也好办,看下面的代码
Sub 自动保存()
Dim NewTime
NewTime = Now + TimeValue("00:00:05")
ThisWorkbook.Save
Application.OnTime NewTime, "自动保存"
End Sub
在这里我们没有用两个程序,而是将要执行的代码也嵌入到了Application.OnTime程序中,Application.OnTime NewTime, "自动保存",看到了吧,我们执行的是程序自身,每5秒调用一下本程序,运行的时候又设定了5秒之后执行本程序,形成了一个循环,这就达到了我们定时循环执行某动作的目的。
Sub hi() Debug.Print "hello" End Sub Sub AutoRun() hi Application.OnTime Now + TimeValue("00:00:05"), "AutoRun" End Sub
上面说过要这些程序首先要手动运行一次,如果想要打开工作簿就自动执行,那在Open事件中调用一下就可以了
Private Sub Workbook_Open()
Call 自动保存
End Sub
Public TimerEnabled As Boolean Sub EnableTimer() '开始 TimerEnabled = True StartTimer End Sub Sub DisableTimer() '停用 TimerEnabled = False End Sub Sub StartTimer() '注意改代码需要放在模块级 If TimerEnabled = True Then Application.OnTime Now + TimeValue("00:00:01"), "StartTimer" '每1秒钟自动运行一次 Work '需要每秒运行的代码 End If End Sub Sub Work() Sheet1.Cells(1, 1) = Sheet1.Cells(1, 1) + 1 End Sub