VBAmacros定时器样式运行代码每个集合的秒数,即120秒
我需要每120秒运行一段代码。 我正在寻找一个简单的方法来在VBA中做到这一点。 我知道有可能从Auto_Open
事件中获取定时器的值,以防止使用一个幻数,但我不能完全知道如何触发一个定时器来让某个东西每120秒运行一次。
如果我可以避免的话,我真的不想用睡眠的无限循环。
编辑 :
基于提供的答案的交叉post是: Excel VBA Application.OnTime。 我认为使用这个想法是一个糟糕的主意吗?
首次打开工作簿时,执行以下代码:
alertTime = Now + TimeValue("00:02:00") Application.OnTime alertTime, "EventMacro"
然后在工作手册中有一个名为“EventMacro”的macros将重复它。
Public Sub EventMacro() '... Execute your actions here' alertTime = Now + TimeValue("00:02:00") Application.OnTime alertTime, "EventMacro" End Sub
是的,你可以使用Application.OnTime
,然后把它放在一个循环中。 这有点像闹钟,当你想再次响起时,你可以继续敲打小睡button。 以下每三秒用时间更新一次单元格A1。
Dim TimerActive As Boolean Sub StartTimer() Start_Timer End Sub Private Sub Start_Timer() TimerActive = True Application.OnTime Now() + TimeValue("00:00:03"), "Timer" End Sub Private Sub Stop_Timer() TimerActive = False End Sub Private Sub Timer() If TimerActive Then ActiveSheet.Cells(1, 1).Value = Time Application.OnTime Now() + TimeValue("00:00:03"), "Timer" End If End Sub
你可以把StartTimer
过程放在你的Auto_Open
事件中,改变Timer
做法(现在只需要用ActiveSheet.Cells(1, 1).Value = Time
)更新A1中的ActiveSheet.Cells(1, 1).Value = Time
。
注意 :您需要代码(除了StartTimer
)在模块中,而不是工作表模块。 如果您在工作表模块中,代码需要稍作修改。
在工作簿事件中:
Private Sub Workbook_Open() RunEveryTwoMinutes End Sub
在一个模块中:
Sub RunEveryTwoMinutes() //Add code here for whatever you want to happen Application.OnTime Now + TimeValue("00:02:00"), "RunEveryTwoMinutes" End Sub
如果您只希望在工作簿打开后执行第一段代码,则只需将2 mnutes的延迟添加到Workbook_Open
事件
(这是从MS Access帮助文件中解释的,我确信XL有类似的东西)。基本上,TimerInterval是一个表单级的属性。 一旦设置,使用子Form_Timer执行您的预期的行动。
Sub Form_Load() Me.TimerInterval = 1000 '1000 = 1 second End Sub Sub Form_Timer() 'Do Stuff End Sub
我用了很多我的应用程序,需要在一天的定时器上运行代码:
Sub CodeToRunOnATImer() ' declarations here RunCodeEveryX: ' code goes here that you want repeated ' then end with the wait Application.Wait Now + TimeValue("00:00:30") GoTo RunCodeEveryX 'if all code is satisfied the exit out ExitOut: ' close any object you have set here End Sub
我发现使用OnTime
可能会很痛苦,特别是在以下情况下:
- 您正在尝试编写代码,并且每次事件触发时窗口的焦点都会中断。
- 您打开了多个工作簿,closures了应该使用计时器的工作簿,并保持触发并重新打开工作簿(如果您忘记正确地终止事件)。
Chip Pearson的这篇文章非常有启发性。 我宁愿现在使用Windows计时器,而不是OnTime
。
我的解决scheme
Option Explicit Public datHora As Date Function Cronometro(action As Integer) As Integer 'This return the seconds between two >calls Cronometro = 0 If action = 1 Then 'Start datHora = Now End If If action = 2 Then 'Time until that moment Cronometro = DateDiff("s", datHora, Now) End If End Function
如何使用? 简单…
dummy= Cronometro(1) ' This starts the timer seconds= Cronometro(2) ' This returns the seconds between the first call and this one
alertTime = Now + TimeValue("00:02:00") Application.OnTime alertTime, "EventMacro"
然后在工作手册中有一个名为“EventMacro”的macros将重复它。
Public Sub EventMacro() '... Execute your actions here' alertTime = Now + TimeValue("00:02:00") Application.OnTime alertTime, "EventMacro" End Sub
你上面提到的代码,它只能第一次运行,但是应该在每120秒之后调用一次。
我应该做什么来工作我的