完整功能的VBA Timer类 2010 年7 月2 日 评论 发表评论 VB 中的Timer 控件提供了很好的计时器功能,VBA 的原始功能中没有包括Timer 控件,取而代之的是Application.OnTime 方法,但是在定时重复运行某个过程的情况下OnTime 方法使用并不太方便。 简单的API Timer函数 使用API 函数同样可以实现类似的OnTime 功能,并且可以方便的循环运行指定的程序。只需要两个简单的API 函数 SetTimer 和 KillTimer。 Private Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, _ ByVal uElapse As Long , ByVal lpTimerFunc As Long) As Long Private Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long Public lTimerID As Long Sub StartTimer(lDuration As Long) If lTimerID = 0 Then lTimerID = SetTimer(0&, 0&, lDuration, AddressOf OnTime) Else Call StopTimer lTimerID = SetTimer(0&, 0&, lDuration, AddressOf OnTime) End If End Sub Sub StopTimer() KillTimer 0&, lTimerID End Sub Sub OnTime() ' 计时器触发后运行的代码放在这 ' ... Cells(1, 1) = Now End Sub 示例下载:Box | SkyDrive 单个事件的Timer类 我们也可以用这两个API 函数创建一个类来完全模拟VB 中Timer 控件的方法,同时实现事件触发。这样做有一个困难,在类模块中不能使用AddressOf 函数。一种方法是利用标准模块来获取回调函数的地址然后再类模块中调用。 创建一个名称为 clsTimer 的类模块,代码如下: Option Explicit Private Declare Function SetTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long, _ ByVal uElapse As Long , ByVal lpTimerFunc As Long) As Long Private Declare Function KillTimer Lib "user32.dll" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long Private bEnable As Boolean Private lDuration As Long Private lTimerId As Long Public Event Timer() Public Property Let Enabled(ByVal vData As Boolean) bEnable = vData If bEnable = True Then StartTimer Else EndTimer End If End Prope...