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可能会很痛苦,特别是在以下情况下:

  1. 您正在尝试编写代码,并且每次事件触发时窗口的焦点都会中断。
  2. 您打开了多个工作簿,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秒之后调用一次。

我应该做什么来工作我的