VBA Macro On Timer样式每隔几秒钟运行代码,即120秒

时间:2010-02-23 16:09:32

标签: excel vba excel-vba timer scheduling

我需要每120秒运行一段代码。我正在寻找一种在VBA中执行此操作的简单方法。我知道可以从Auto_Open事件中获取计时器值以防止必须使用幻数,但是我无法完全了解如何触发计时器以获得每120秒运行一次的东西。

如果可以避免,我真的不想在睡眠中使用无限循环。


修改

基于提供的答案的交叉发布位于:Excel VBA Application.OnTime. I think its a bad idea to use this... thoughts either way?

6 个答案:

答案 0 :(得分:60)

首次打开工作簿时,请执行以下代码:

alertTime = Now + TimeValue("00:02:00")
Application.OnTime alertTime, "EventMacro"

然后在工作簿中只有一个名为“EventMacro”的宏将重复它。

Public Sub EventMacro()
    '... Execute your actions here'
    alertTime = Now + TimeValue("00:02:00")
    Application.OnTime alertTime, "EventMacro"
End Sub

答案 1 :(得分:22)

是的,您可以使用Application.OnTime进行此操作,然后将其置于循环中。它有点像闹钟,你可以在你希望它再次响铃的时候保持按下按钮。以下内容每三秒更新一次单元格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行程中的操作(现在它只是用{{1}更新A1中的时间})。

注意:您需要模块中的代码(ActiveSheet.Cells(1, 1).Value = Time除外),而不是工作表模块。如果你在工作表模块中有它,代码需要稍作修改。

答案 2 :(得分:8)

在工作簿事件中:

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

如果您只希望第一段代码在工作簿打开后执行,则只需在Workbook_Open事件中添加2分钟的延迟

答案 3 :(得分:2)

(这是从MS Access帮助文件中解释的。我确信XL有类似的东西。)基本上,TimerInterval是一个表单级属性。设置后,使用子Form_Timer执行您的预期操作。

Sub Form_Load()
    Me.TimerInterval = 1000 '1000 = 1 second
End Sub

Sub Form_Timer()
    'Do Stuff
End Sub

答案 4 :(得分:0)

我的解决方案:

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

答案 5 :(得分:0)

我发现使用OnTime会很痛苦,特别是在以下情况下:

  1. 您正在尝试编码并且窗口上的焦点会被中断 每次事件触发时。
  2. 您打开了多个工作簿,关闭了应该使用计时器的工作簿,并且它会一直触发并重新打开工作簿(如果您忘记正确杀死事件)。
  3. This article by Chip Pearson非常有启发性。我现在更喜欢使用Windows Timer,而不是OnTime