usleep延时0.毫秒_VBA延时获取数据取得类似计时器功能

4419b95b5d86cd1bfd48b6263ccc1255.png

大家好,我们今日讲解“VBA信息获取与处理”教程中第十一个专题“VBA如何做到延时获得数据信息”的第四节“延时获取数据取得类似计时器功能”,这个专题是非常有用的知识点,希望大家能掌握利用。

第四节 延时获取数据取得类似计时器功能

大家好,我们继续延时获取数据的专题讲解,这节内容将给大家讲解一个API函数用于取得类似一个计时器的界面效果。

1 使用SetTimer设置触发事件时间和使用KillTimer设置暂停

SetTimer和KillTimer是两个windows的API函数,利用这两个函数可以设置事件的触发和停止触发。

SetTimer是一种API函数,位于user32.dll中。可以利用这个函数每隔一段时间执行一件事。使用方法比较简单,通常告诉Windows一个时间间隔,然后Windows以此时间间隔周期性触发程序。可以调用对应的KillTimer函数销毁指定的时钟。

我在上讲的讲解中提到,如果是64位office系统,我们在引用的时候要小心些,我在这套教程中给出的程序还无法实现64位系统的调试,这里我给出这个两个API函数的两种引用:
#If VBA7 And Win64 Then

' 64-bit Office

Public Declare PtrSafe Function SetTimer Lib "user32" ( _

ByValHWnd As LongLong, ByValnIDEvent As LongLong, _

ByValuElapse As LongLong, _

ByVallpTimerFunc As LongLong) As LongLong

Public Declare PtrSafe Function KillTimer Lib "user32" ( _

ByValHWnd As LongLong, _

ByValnIDEvent As LongLong) As LongLong

Public Declare PtrSafe Function GetTickCount Lib "kernel32" () As LongLong

#Else'32-bit Office

Public Declare Function SetTimer Lib "user32" ( _

ByValHWnd As Long, _

ByValnIDEvent As Long, _

ByValuElapse As Long, _

ByVallpTimerFunc As Long) As Long

Public Declare Function KillTimer Lib "user32" ( _

ByValHWnd As Long, _

ByValnIDEvent As Long) As Long

Public Declare Function GetTickCount Lib "kernel32" () As Long

#End If

需要大家注意的是参数较多,但不可少。这种引用建立后,VBA中将使用Windows的SetTimer和KillTimer函数。SetTimer指示Windows每隔NumberOfSeconds*1000毫秒执行一个指定过程,直到调用KillTimer。在此期间,应用程序是正常执行的,并且事件正常发生。

2 使用SetTimer和KillTimer设计计时器的代码设计

下面我们看一下利用这两个函数实现计时器的代码:

Public Declare Function SetTimer Lib "user32" (ByValHWnd As Long, _

ByValnIDEvent As Long, ByValuElapse As Long, ByVallpTimerFunc As Long) As Long

Public Declare Function KillTimer Lib "user32" (ByValHWnd As Long, ByValnIDEvent As Long) As Long

Public TimerID As Long

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&, AddressOfTimerProc)

End Sub

Sub mynzE()

On Error Resume Next

KillTimer 0&, TimerID

Sheets("sheet4").Shapes(1).Visible = True

End Sub

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

Sub mynzF()

Cells(1, 2) = 0

End Sub

代码截图:

b73e02b23742d0945969c4213bcc4141.png

代码讲解:

1)Public Declare Function SetTimer Lib "user32" (ByValHWnd As Long, _

ByValnIDEvent As Long, ByValuElapse As Long, ByVallpTimerFunc As Long) As Long

Public Declare Function KillTimer Lib "user32" (ByValHWnd As Long, ByValnIDEvent As Long) As Long

Public TimerID As Long

Public TimerSeconds As Single

以上代码是对API函数的引用和公用变量的声明。注意在应用程序中我仅给出了32位系统的代码,如果读者要64位代码可以根据我上述的讲解自行修改。

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计时器的实现效果

我们点击开始按钮:

01e6c9f64b19c172ac3df9edfc1f3540.png

这个时候计时开始,同时开始按钮消失:

4ee4e55ffa883e04094366f48773ed9f.png

当我们按下停止时开始按钮才会重新出现:

4d940e730d82f7e3fada6e36f0fcae7a.png

好了,这样就实现了计时器的功能,也就是说实现了获取延时数据。

4877c2262b4f14699455fbdfac91ddc1.png

本节知识点回向:

  1. SetTimer和KillTimer的意义是什么?

② 本节的讲解对开始按钮进行了设计,原因是什么?大家可以试试如果不进行这样的设计,有何不妥。

本节代码参考文件“011工作表.xlsm”

4877c2262b4f14699455fbdfac91ddc1.png

积木编程的思路内涵:

在我的系列书籍中一直在强调“搭积木”的编程思路,这也是学习利用VBA的主要方法,特别是职场人员,更是要采用这种方案。其主要的内涵:

1 代码不要自己全部的录入。你要做的是把积木放在合适的位置然后去修正代码,一定要拷贝,从你的积木库中去拷贝,然后修正代码,把时间利用到高效的思考上。

2 建立自己的“积木库”。平时在学习过程中,把自己认为有用的代码放在一起,多积累,在用到的时候,可以随时拿来。你的积木库资料越多,你做程序的思路就会越广。

4877c2262b4f14699455fbdfac91ddc1.png

VBA的应用界定

VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对VBA的应用界定。在取代OFFICE新的办公软件没有到来之前,谁能在数据处理方面做到极致,谁就是王者。其中登峰至极的技能非VBA莫属!

我记得20年前自己初学VBA时,那时的资料甚少,只能看源码自己琢磨,真的很难。20年过去了,为了不让学习VBA的朋友重复我之前的经历,我根据自己多年VBA实际利用经验,推出了六部VBA专门教程:

第一套:VBA代码解决方案 是VBA中各个知识点的讲解,教程共147讲,覆盖绝大多数的VBA知识点,初学必备;

第二套:VBA数据库解决方案 数据库是数据处理的专业利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,适合中级人员的学习。

第三套:VBA数组与字典解决方案 数组和字典是VBA的精华,字典是VBA代码水平提高的有效手段,值得深入的学习,是初级及中级人员代码精进的手段。

第四套:VBA代码解决方案之视频 是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。这套教程是第一套教程的视频讲解,听元音更易接受。

第五套:VBA中类的解读和利用 这是一部高级教程,讲解类的虚无与肉身的度化,类的利用虽然较少,但仔细的学习可以促进自己VBA理论的提高。这套教程的领会主要是读者的领悟了,领悟一种佛学的哲理。

第六套教程:《VBA信息获取与处理》是一部高级教程,涉及范围更广,实用性更强,面向中高级人员。教程共二十个专题,包括:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪切板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。

大家可以根据以上资料1→3→2→6→5或者是4→3→2→6→5的顺序逐渐深入的逐渐学习。教程提供讲解的同时提供了大量的积木,如需要可以WeChat: NZ9668

35428e2bd1a33e3280e034263115797d.png

学习VBA是个过程,也需要经历一种枯燥的感觉

如太白诗云:众鸟高飞尽,孤云独去闲。相看两不厌,只有敬亭山。学习的过程也是修心的过程,修一个平静的心。在代码的世界中,心平静了,心情好了,身体自然而然就好。心静则正,内心里没有那么多邪知邪见,也就没有那么多妄想。利人就是利己。这些教程也是为帮助大家起航,助上我自己之力,我的上述教程是我多的经验的传递,

“水善利万物而不争”,绵绵密密,微则无声,巨则汹涌。学习亦如此,知道什么是自己所需要的,不要蜷缩在一小块自认为天堂的世界里,待到暮年时再去做自欺欺人的言论。要努力提高自己,用一颗充满生机的心灵,把握现在,这才是进取。越是有意义的事情,困难会越多。愿力决定始终,智慧决定成败。不管遇到什么,都是风景。看淡纷争,看轻得失。茶,满也好,少也好,不要计较;浓也好,淡也好,其中自有值得品的味道。去感悟真实的时间,静下心,多学习,积累福报。而不是天天混日子,也不是天天熬日子。在后疫情更加严峻的存量残杀世界中,为自己的生存进行知识的储备,特别是新知识的储备。学习时微而无声,利用时则巨则汹涌。

每一分收获都是成长的记录,怎无凭,正是这种执着,成就了朝霞的灿烂。最后将一阙词送给致力于VBA学习的朋友,让大家感受一下学习过程的枯燥与执着:

浮云掠过,暗语无声,

唯有清风,惊了梦中啼莺。

望星,疏移北斗,

奈将往事雁同行。

阡陌人,昏灯明暗,

忍顾长亭。

多少VBA人,

暗夜中,悄声寻梦,盼却天明。

怎无凭!

回向学习利用VBA的历历往事,不胜感慨,谨以这些文字给大家,分享我多年工作实际经验的成果,随喜这些有用的东西,给确实需要利用VBA的同路人。

分享成果,随喜正能量

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值