【VBA研究】VBA中编写延时函数

作者:iamlaosong

1、一般延时

一个应用接口需要限制运行速度,需要在循环中加个延时函数,这个延时不需要多么精确,要求有个几秒延时,网上用的比较多的就是用Timer函数编写,Timer是VBA自带的函数,用起来比较方便,一般程序如下:

'延时程序
Sub delay(T As Single)
    Dim time1 As Single
    time1 = Timer
    Do
        DoEvents
    Loop While Timer - time1 < T
End Sub

虽然一般用这个函数延迟用秒做单位,但1秒以内的延时也是可以的,老一点的机器时钟中断为每秒18.2次,就是说时间间隔在0.055秒(55毫秒)左右,现在的机器一般都比这个高,具体多少需要测试。Timer函数根据时钟中断记录当天的时间序列值,以秒为单位,也就是从当天0点开始到当前时间点上所经历的秒数(含小数)。当从23:59分钟跨越到0点是,Timer函数的时间也重新归零开始计算。通过查看函数中的timer值得变化情况,可以确定时钟中断的间隔。例如本人的机器timer值变化如下:

 56742.09 
 56742.11 
 56742.13 
 56742.14 
 56742.16 
 56742.16 
 56742.17 
 56742.19 
 56742.2 
 56742.22 
 56742.23 
 可以看出,时间间隔在10-20毫秒之间(精确显示实际精度是0.015625秒,15.625毫秒)。如果时延在1秒以内,精度要求不高,就可以用这个方法,如:

delay(0.25)

由于延时函数中使用了 DoEvents语句交出了系统控制权,所以不会影响用户的其它操作。

上面方法虽然简单,但是有一个致命的缺陷,就是Timer函数的时间每天都是从0开始,如果从23:59:59开始延时1秒以上的话,这个延时程序将永远执行下去,下面的延时程序将弥补这个缺陷:

'延时程序
Sub delay(T As Single)
    Dim time1, time2 As Single
    time1 = Timer
    Do
        DoEvents
        time2 = Timer - time1
        If time2 < 0 Then time2 = time2 + 86400     '86400=24*3600
    Loop While time2 < T
End Sub


2、精确延时

精确延时可以使用sleep函数,sleep函数是Windows API函数,使用前必须先声明,然后使用,例如:

private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

。。。

    sleep 1000      '延时1秒

。。。

sleep函数延时是毫秒级的,精确度比较高,但它在延时时会将程序挂起,使操作系统暂时无法响应用户操作,所以在长延时的时候不适合使用它。

更好的办法是使用timeGetTime函数,timeGetTime函数返回的是开机到现在的毫秒数,可以支持1毫秒的间隔时间,而且永远增加,不存在回头的问题。当然不是永远不回头,毕竟Long型变量(双字,4字节)也是有取值范围的,这个值在0到2^32之间。大约49.71天。

同sleep函数一样,timeGetTime函数是Windows API函数,使用前必须先声明,即:

Private Declare Function timeGetTime Lib "winmm.dll" () As Long

延时函数和上面的一样,只是将Timer函数换成timeGetTime:

'精确延时程序
Sub delay(T As Long)
    Dim time1 As Long
    time1 = timeGetTime
    Do
        DoEvents
    Loop While timeGetTime - time1 < T
End Sub

注意:延时时间单位是毫秒。由于延时函数中使用了 DoEvents语句交出了系统控制权,所以不会影响用户的其它操作。


  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值