SetTimer和KillTimer是两个windows的API函数,利用这两个函数可以设置事件的触发和停止触发。SetTimer是一种API函数,位于user32.dll中。可以利用这个函数每隔一段时间执行一件事。使用方法比较简单,通常告诉Windows一个时间间隔,然后Windows以此时间间隔周期性触发程序。可以调用对应的KillTimer函数销毁指定的时钟。我在上讲的讲解中提到,如果是64位office系统,我们在引用的时候要小心些,我在这套教程中给出的程序还无法实现64位系统的调试,这里我给出这个两个API函数的两种引用: #If VBA7 Then Public Declare PtrSafe Function SetTimer Lib "user32" (ByVal HWnd As LongPtr, _ ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr Public Declare PtrSafe Function KillTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long#Else Public Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, _ ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Public Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long#End If需要大家注意的是参数较多,但不可少。这种引用建立后,VBA中将使用Windows的SetTimer和KillTimer函数。SetTimer指示Windows每隔NumberOfSeconds*1000毫秒执行一个指定过程,直到调用KillTimer。在此期间,应用程序是正常执行的,并且事件正常发生。
2 使用SetTimer和KillTimer设计计时器的代码设计
下面我们看一下利用这两个函数实现计时器的代码:#If VBA7 Then Public Declare PtrSafe Function SetTimer Lib "user32" (ByVal HWnd As LongPtr, _ ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtrPublic Declare PtrSafe Function KillTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr) As LongPublic TimerID As LongPtr#Else Public Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, _ ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As LongPublic Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As LongPublic TimerID As Long#End If Public TimerSeconds As SingleSub mynzD() Sheets("sheet4").Select Sheets("sheet4").Shapes(1).Visible = False TimerSeconds = 1 ' how often to "pop" the timer. TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf TimerProc)End SubSub mynzE() On Error Resume Next KillTimer 0&, TimerID Sheets("sheet4").Shapes(1).Visible = TrueEnd SubSub TimerProc(ByVal HWnd As Long, ByVal uMsg As Long, _ ByVal nIDEvent As Long, ByVal dwTimer As Long) ' This procedure is called by Windows. Put your code here. Cells(1, 2) = Cells(1, 2) + 1End SubSub mynzF() Cells(1, 2) = 0End Sub代码截图:代码讲解:1)#If VBA7 Then Public Declare PtrSafe Function SetTimer Lib "user32" (ByVal HWnd As LongPtr, _ ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr Public Declare PtrSafe Function KillTimer Lib "user32" (ByVal HWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long Public TimerID As LongPtr#Else Public Declare Function SetTimer Lib "user32" (ByVal HWnd As Long, _ ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Public Declare Function KillTimer Lib "user32" (ByVal HWnd As Long, ByVal nIDEvent As Long) As Long Public TimerID As Long #End If以上代码是对API函数的引用和公用变量的声明。注意在应用程序中我仅给出了32位系统的代码,以及64位OFFICE代码。2)Sheets("sheet4").Shapes(1).Visible = False以上代码是对开始按钮的设置,避免了多重点击出现的重复计时。这也是对于我第一套教程《VBA代码解决方案》中有关ON TIME知识点讲解的完善,大家可以对照这个知识点和这讲的代码比较一下,加上上面的按钮设计后会更好些。3)TimerSeconds = 1 ' how often to "pop" the timer.TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOfTimerProc)以上给出触发事件的时间为1秒,触发的是TimerProc。4)Sub TimerProc(ByValHWnd As Long, ByValuMsg As Long, _ByValnIDEvent As Long, ByValdwTimer As Long)' This procedure is called by Windows. Put your code here.Cells(1, 2) = Cells(1, 2) + 1End Sub 对于这个过程,其实就是一个计时累加的过程。5)KillTimer 0&, TimerIDSheets("sheet4").Shapes(1).Visible = True 上述代码实现计时器的退出和按钮的重置。