前言
要不是年会需要使用PPT来做抽奖,我才不会用这么难用的VBA。
VBA要实现延时功能,大多数教程都会拿2016年ExcelHome里的上古帖子不厌其烦地复制粘贴,然后你复制下来发现根本无法运行。
现在我从头给你讲,到底怎样在VBA中实现延时功能
思路
思路很清晰,分三步走:
1. 想办法获取当前时间time_now1
2. 然后给这个时间加上一个数delay_time(这个数就是你要定时的时长)得到time_then
3. 然后做循环,当再次获取当前时间等于time_now2等于time_then的时候跳出循环。并且注意这个时候最好不要使用独占CPU的浪费计算资源的方法。
布局
用一个CommandButton1按钮控件和一个Label1文本控件,在PPT中直观展示怎样实现延时功能。
代码
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资源浪费。