【分享成果,随喜正能量】 你拥有青春的时候,就要感受它。不要虚掷你的黄金时代,不要去倾听枯燥乏味的东西,不要设法挽留无望的失败,不要把你的生命献给无知、平庸和低俗。。
《VBA信息获取与处理》教程是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,八十四讲。今日的内容是”专题十一:VBA如何做到延时获得数据信息”:使用SetTimer和KillTimer设计计时器
第四节 延时获取数据取得类似计时器功能
大家好,我们继续延时获取数据的专题讲解,这节内容将给大家讲解一个API函数用于取得类似一个计时器的界面效果。
1 使用SetTimer设置触发事件时间和使用KillTimer设置暂停
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 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
Public TimerSeconds As Single
Sub 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 Sub
Sub mynzE()
On Error Resume Next
KillTimer 0&, TimerID
Sheets("sheet4").Shapes(1).Visible = True
End Sub
Sub 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) + 1
End Sub
Sub mynzF()
Cells(1, 2) = 0
End 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) + 1
End Sub
对于这个过程,其实就是一个计时累加的过程。
5)KillTimer 0&, TimerID
Sheets("sheet4").Shapes(1).Visible = True
上述代码实现计时器的退出和按钮的重置。
3 使用SetTimer和KillTimer计时器的实现效果
我们点击开始按钮:
这个时候计时开始,同时开始按钮消失:
当我们按下停止时开始按钮才会重新出现:
好了,这样就实现了计时器的功能,也就是说实现了获取延时数据。
本节知识点回向:
- SetTimer和KillTimer的意义是什么?
② 本节的讲解对开始按钮进行了设计,原因是什么?大家可以试试如果不进行这样的设计,有何不妥。
本节代码参考文件“011工作表.xlsm”
我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序:
【分享成果,随喜正能量】据说每个人需要一面镜子,可以常常自照,知道自己是个什么东西。不过,能自知的人根本不用照镜子;不自知的东西,照了镜子也没有用。 。