- vb中的Timer控件可以实现有规律地隔一段时间执行一次代码。
- 在vba中没有timer控件,但是Application对象的OnTime方法可以实现类似的功能。
它的作用是指定某个过程在具体的某个时间允许或者在间隔具体的时间后运行。
它的语法如下:
expression .OnTime(EarliestTime, Procedure, LatestTime, Schedule)
其中参数EarliestTime表示要运行Procedure参数所表示的过程的时间。
LatestTime参数表示由于各种原因过程没有在EarliestTime设定的时间运行,则最迟在LatestTime设定的时间运行。
Schedule参数的值可以是True或者False,默认是True。如果是True,则表示设定一个新的OnTime定时执行过程,如果是False,则表示清除一个之前设置的定时执行过程。
假设在vba中的标准模块1中有如下过程:
Sub test()
Debug.Print 1
End Sub
运行以上过程将在立即窗口中输出1。
如果我们使用Application对象的OnTime方法,运行以下过程,将于5秒后在立即窗户中输出1:
Sub lyq()
Excel.Application.OnTime Now() + TimeValue("0:0:5"), "test"
End Sub
如果要循环间隔5秒后在立即窗口中输出1,则可以添加反复调用lyq过程的语句如下:
Sub test()
Debug.Print 1
Call lyq
End Sub
Sub lyq()
Excel.Application.OnTime Now() + TimeValue("0:0:5"), "test"
End Sub
通过执行以上的过程,将永不间断的反复间隔5秒在立即窗口中输出1。
如果要终止某个Application.OnTime 则需要将当时设置的时间准确记录下来,然后将Application.OnTime的Schedule参数设置为False就可以终止。如下所示:
'定义一个公共变量存储设定的时间
Public dTime
Sub test()
Debug.Print 1
Call lyq
'将定时的功能关闭
Excel.Application.OnTime dTime, "test", , False
End Sub
Sub lyq()
'用变量记录下设定的时间,以免不断变化
dTime = Now() + TimeValue("0:0:5")
Excel.Application.OnTime dTime, "test"
End Sub
通过执行以上的代码,则只在立即窗口中输出1次1,就终止了之前的定时。
通过上述的分析,如果要在vba中构造完整的开、关定时功能,可以使用如下的通用格式代码:
'定义一个公共变量存储定时运行过程的时间
Public dTime As Date
Sub TimeClose()
'取消定时功能,不再循环运行子过程QQ1722187970
Excel.Application.OnTime dTime, "QQ1722187970", , False
End Sub
Sub TimeBegin()
'设置变量dIntervalTime用于存储设置的循环运行过程的间隔时间,这里以秒为单位
Dim dIntervalTime As Long
dIntervalTime = 5
'用dTime变量记录下设定的过程运行时间,以免不断变化
dTime = Now() + TimeValue("0:0:" & dIntervalTime)
'用指定要运行的子过程的名称(这里是QQ1722187970)和要运行的时间(这里是dTime)
Excel.Application.OnTime dTime, "QQ1722187970"
End Sub
Sub QQ1722187970()
Debug.Print "这是一个循环输出的字符"
'在子过程的结尾调用启动定时功能,从而实现循环运行
Call TimeBegin
End Sub


I feel that is among the most important info for me.
And i am glad studying your article. However want to remark
on few basic things, The website taste is perfect, the articles is truly excellent : D.
Excellent process, cheers
要注意 这个过程, 要放在 外部 模块中, 做为 PUBLIC SUB
否则, 会出现: 找不到宏。。。。。。