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

Fin*_*per 38 excel vba scheduling timer excel-vba

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

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


编辑:

基于提供的答案的交叉发布位于:Excel VBA Application.OnTime.我觉得使用这个想法是个坏主意......想法无论如何?

Ala*_*ain 60

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

alertTime = Now + TimeValue("00:02:00")
Application.OnTime alertTime, "EventMacro"
Run Code Online (Sandbox Code Playgroud)

然后在工作簿中有一个名为"EventMacro"的宏将重复它.

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

  • @BerryTsakala - `Application.OnTime` 在新堆栈的顶部“从头开始”调用 Sub。它不像普通的递归方法调用。由于每次调用都有自己的堆栈 - 不可能出现堆栈溢出。 (3认同)

Tod*_*ain 22

是的,你可以使用Application.OnTime它,然后把它放在循环中.它有点像闹钟,你可以在你希望它再次响铃的时候保持按下按钮.以下内容每三秒更新一次Cell 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
Run Code Online (Sandbox Code Playgroud)

您可以将该StartTimer过程放入Auto_Open事件中并更改在该过程中完成的操作Timer(现在它只是更新A1中的时间ActiveSheet.Cells(1, 1).Value = Time).

注意:您需要StartTimer模块中的代码(除此之外),而不是工作表模块.如果您在工作表模块中有它,代码需要稍作修改.


Ale*_*x P 8

在工作簿事件中:

Private Sub Workbook_Open()
    RunEveryTwoMinutes
End Sub
Run Code Online (Sandbox Code Playgroud)

在一个模块中:

Sub RunEveryTwoMinutes()
    //Add code here for whatever you want to happen
    Application.OnTime Now + TimeValue("00:02:00"), "RunEveryTwoMinutes"
End Sub
Run Code Online (Sandbox Code Playgroud)

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