ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

VBA实现延时(2022最新版)

2022-01-05 21:58:10  阅读:430  来源: 互联网

标签:VBA 2022 Label1 timeGetTime 延时 最新版 Savetime Sub


前言

要不是年会需要使用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) icon-default.png?t=LBL2https://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 topicicon-default.png?t=LBL2https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/doevents-function跳出循环的方法就是获取到的当前时间等于或大于Savetime + 500的值,从而实现了定时。

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

总结

做到延时,需要靠“三步走”的方法实现,同时也要注意用DoEvent函数避免CPU资源浪费。

标签:VBA,2022,Label1,timeGetTime,延时,最新版,Savetime,Sub
来源: https://blog.csdn.net/yuanchenglei/article/details/122332223

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有