众所周知,在VB的标准控件里含有一个可以定时触发事件的Timer控件。可是,在VBA里却没有提供这一控件。而事实上,我们编写的很多程序都经常要用到后台运行或是定时触发某一事件的功能,怎么办呢?其实很简单,我们可以自己编写一个Timer控件。
在VBA的工程里添加一个类模块,并将它命名为Timer,然后将下面的代码写入到这个模块中。
Option Explicit
'TimerEnd变量用于控制定时事件的状态,False表示启动定时事件,True表示停止定时事件
Private TimerEnd As Boolean
'Timer事件是一个每隔固定秒数自动触发的事件,该秒数由StartTimer方法的Interval参数控制
Public Event Timer()
'StartTimer方法用于启动定时事件,该方法的Interval参数用于设置定时事件的间隔秒数(1-32767之间的整数)
Public Sub StartTimer(ByVal Interval As Integer)
Dim Starttime As Single
'用Timer函数返回从午夜开始到现在经过的秒数
Starttime=Timer
TimerEnd=False
If Interval<1 Then
MsgBox "Interval参数的值必须是1-32767之间的整数",,"错误"
Exit Sub
End If
'用循环结构重复触发Timer事件
Do
If TimerEnd Then Exit Do
If Timer>=Starttime+Interval Then
Starttime=Timer
RaiseEvent Timer
End If
'在循环过程中,用DoEvents函数将控制权转让给操作系统,这样可以实现后台运行定时事件的效果。
DoEvents
Loop
End Sub
'EndTimer方法用于停止定时事件
Public Sub EndTimer()
TimerEnd=True
End Sub
Private Sub Class_Terminate()
TimerEnd=True
End Sub
Private Sub Class_Initialize()
TimerEnd=False
End Sub
这样,便做好了一个可以定时触发事件的Timer类。下面只需要在相应的模块里添加这个类的实例,便可以像使用VB中的Timer控件一样使用了。
下面是一个具体的VBA程序例子。该例运行后可以通过单击窗体让窗体每隔1秒向右移动一段距离(而且不会影响窗体上其它控件的使用)。
首先,在VBA工程里添加一个用户窗体UserForm1,然后在其代码编辑器里写入下面的代码:
Option Explicit
'声明MyTimer为带有事件的模块级Timer对象变量
Private WithEvents MyTimer As Timer
'在UserForm的初始化事件里生成Timer的一个实例
Private Sub UserForm_Initialize()
Set MyTimer=New Timer
End Sub
'在UserForm的click事件里启动定时触发器,设置间隔秒数为1
Private Sub UserForm_Click()
MyTimer.StartTimer 1
End Sub
'在UserForm的结束事件里关闭定时触发器
Private Sub UserForm_Terminate()
MyTimer.EndTimer '一定要在程序结束前调用EndTimer方法
Set MyTimer=Nothing
End Sub
'在Timer事件里书写需要定时重复运行的代码
Private Sub MyTimer_Timer()
UserForm1.Left=UserForm1.Left+5
End Sub
其实,如果只是编写一段小程序,那也不一定非要制作一个Timer类,只要将需要定时重复运行的代码放入到一个循环中即可。另外,在循环中可以利用Timer函数控制间隔秒数,而通常也必须在循环中添加DoEvents函数,以便让该段代码在后台运行。最后,千万不要忘记书写循环的跳出条件,否则,这段后台执行的代码将会一直驻留内存,即使窗体被卸载。 |