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中直观展示怎样实现延时功能。

代码

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换成想要的毫秒数即可。

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VBA(Visual Basic for Applications)是一种用于编写Excel宏的编程语言,可以用于实现自定义二下拉菜单。要实现这样的功能,首先需要在Excel中创建两个不同的数据源,一个用于一下拉菜单,另一个用于二下拉菜单。然后使用VBA代码来实现下拉菜单的动态变化。 首先,在Excel中添加一个一下拉菜单,例如在单元格A1中选择水果类型(如苹果、橙子、香蕉)。然后在另一个单元格B1中添加一个二下拉菜单,这个下拉菜单将根据A1单元格中选择的水果类型来动态变化。接下来,需要用VBA代码实现这个动态变化的功能。 首先,在Excel中按下Alt + F11组合键进入VBA编辑器,在这里可以编写VBA代码。首先需要编写一个Worksheet_Change事件来监控A1单元格的变化,当A1单元格的值发生变化时,自动更新B1单元格的下拉菜单选项。具体代码如下: Private Sub Worksheet_Change(ByVal Target As Range) If Not Application.Intersect(Target, Me.Range("A1")) Is Nothing Then Me.Range("B1").ClearContents Select Case Me.Range("A1").Value Case "苹果" With Me.Range("B1").Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="苹果-1,苹果-2,苹果-3" .IgnoreBlank = True .InCellDropdown = True .ShowInput = True .ShowError = True End With Case "橙子" '类似的代码 Case "香蕉" '类似的代码 End Select End If End Sub 上面的代码实现了当A1单元格的值发生变化时,B1单元格的下拉菜单选项会相应地发生变化。根据A1单元格的值,通过Select Case语句来设置B1单元格的下拉菜单选项。这样就实现了自定义二下拉菜单的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值