VBA实现毫秒级延时(2022最新版)

前言

要不是年会需要使用PPT来做抽奖,我才不会用这么难用的VBA。

VBA要实现延时功能,大多数教程都会拿2016年ExcelHome里的上古帖子不厌其烦地复制粘贴,然后你复制下来发现根本无法运行。

现在我从头给你讲,到底怎样在VBA中实现毫秒级延时功能。

思路

思路很清晰,分三步走:

1. 想办法获取当前时间(time_now1)

2. 然后给这个时间加上一个数delay_time(这个数就是你要定时的时长)得到time_then

3. 然后做循环,当再次获取当前时间(time_now2)等于time_then的时候跳出循环。并且注意这个时候最好不要使用独占CPU的浪费计算资源的方法。

布局

用一个CommandButton1按钮控件和一个Label1文本控件,在PPT中直观展示怎样实现延时功能。

VBA实现毫秒级延时(2022最新版)_第1张图片

代码

Private Declare PtrSafe Function timeGetTime Lib "winmm.dll" () As Long
Private Sub CommandButton1_Click()
Dim Savetime As Double
Label1.Caption = "点击开始计时"
Savetime = timeGetTime
While timeGetTime < Savetime + 500
DoEvents
Wend
Label1.Caption = "延时时间到"
End Sub

代码解析

1. 先看第一句话:

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

第一句话是很关键的内容,但Declare是上古时代的VBA语句,现在已经不推荐单独用了。需要在其后面加上PtrSafe关键字。具体参考:Declare 语句 (VBA) | Microsoft Docs了解如何使用 Declare 语句 (VBA)https://docs.microsoft.com/zh-cn/office/vba/Language/reference/user-interface-help/declare-statement

这句话的功能就是,将winmn.dll这个系统DLL文件中的timeGetTime拎出来,方便后面使用,并且声明为Long型变量。

2. 再看第二段话:

Private Sub CommandButton1_Click()
Dim Savetime As Double
Label1.Caption = "点击开始计时"
Savetime = timeGetTime
While timeGetTime < Savetime + 500
DoEvents
Wend
Label1.Caption = "延时时间到"
End Sub

Sub...End Sub经典的事件处理函数,CommandButton1是上面拖拽过来的Button控件,CommandButton1_Click()是单击Button控件后的动作。

在动作里,首先定义了Double型的临时变量Savetime,用于暂存按钮按下的时间信息,也即Savetime = timeGetTime

然后做个While...Wend循环,在这个循环里执行DoEvents函数,注意这个函数是CPU资源友好型函数,功能是交出执行控制权,以便操作系统能够处理其他事件。具体参考:

DoEvents 函数 (Visual Basic for Applications) | Microsoft DocsOffice VBA reference topichttps://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/doevents-function跳出循环的方法就是获取到的当前时间等于或大于Savetime + 500的值,从而实现了定时。

刚刚跳过的关于Label1.Caption = "XXX"的两行代码,只是为了直观展示函数运行状态,不展开讲了。

总结

做到延时,需要靠“三步走”的方法实现,同时也要注意用DoEvent函数避免CPU资源浪费。用的时候,直接复制代码,把500换成想要的毫秒数即可。

你可能感兴趣的:(VBA,vba,ppt)