“Application.OnTime:精准的闹铃”总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
有没有遇到过这样的场合:在对数据分析时,需要定期(每天、每周)对大量数据进行汇总、统计;定时清理电脑或服务器上临时文件、过期的日志文件等
如果能设置好时间让宏代码定时执行就好了,这时就需要用到Application.OnTime
为了更好地展示其实现效果,安排了一个小小的案例,咱们边玩边学,知识就这么水灵灵地钻进了脑子里
在上一期,积木块的运动是被动的,通过方向键控制“积木块”的移动,每按一次方向键移动一格现在,继续对其修改,让它自己动起来。为了配合这次操作简单易上手,特意在工作表里添加了两个按钮“开始”和“停止”。当我们按下“开始”按钮,积木块便会以每2秒一格的速度稳定下落。这个过程会一直持续,直到我们按下“暂停”按钮为止之所以能实现这个功能,核心是利用了Application.OnTime方法。这个方法就像一个内置的“定时触发器”,可以轻松地让代码按照我们设定的固定时间间隔自动执行
当然,想挑战自我的小伙伴,可以考虑在代码中增加一个判断:当积木块在移动过程中触碰到下方蓝色边框时,它能自动停止下落,就无需手动按暂停键了代码实现逻辑:利用Application.OnTime方法,我们安排一个名为RepeatTask的过程(宏),让它在2秒后自动执行一次。其核心在于:每当RepeatTask过程运行完毕后,它会再次调用Application.OnTime,重新设定自己下一次的执行时间(2秒)。这样,程序就形成了一个自我循环的任务链条
如果想终止这个任务链条,只需要在其参数列表的最后增加"Schedule:=False”即可,在参考代码中的StopTimer内就有用到
Option ExplicitPublic blockRange As RangePublic NextRunTime As DoublePublic TimerEnabled As Boolean'每2秒执行一次Sub StartTimer() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet1") '初始化一个L形状的区域 Set blockRange = Union(ws.Range("F7"), ws.Range("F8"), ws.Range("F9"), ws.Range("G9")) blockRange.Interior.Color = RGB(255, 165, 0) ' 设置为橙色 TimerEnabled = True ' 安排在2秒后执行名为 "RepeatTask" 的过程 NextRunTime = Now + TimeValue("00:00:02") Application.OnTime EarliestTime:=NextRunTime, Procedure:="RepeatTask"End Sub'下落动作Sub RepeatTask() If Not TimerEnabled Then Exit Sub Dim newRange As Range blockRange.Interior.Color = vbWhite Set newRange = blockRange.Offset(1, 0) newRange.Interior.Color = RGB(255, 165, 0) ' 设置为橙色 Set blockRange = newRange ' 安排下一次执行(2秒后) NextRunTime = NextRunTime + TimeValue("00:00:02") Application.OnTime EarliestTime:=NextRunTime, Procedure:="RepeatTask"End Sub'停止Sub StopTimer() TimerEnabled = False On Error Resume Next Application.OnTime EarliestTime:=NextRunTime, Procedure:="RepeatTask", Schedule:=FalseEnd Sub
以上操作步骤完成后,就可以直观感受这个定时任务了!尤其是想学用VBA开发小游戏的伙伴们,可以试着操作起来了,你一定需要好了,今天的分享到此结束了,咱们下期继续!
本公众号一直在不间断地分享免费的编程案例和实用技巧。无论您是用来提升自动化办公效率还是想提升自我,请关注我的公众号,解锁更多的编程知识