如何让VBA Macro在后台连续运行?

Cha*_*ton 5 excel vba excel-vba

我想监视一个值,并在满足某些条件时收到电子邮件通知.我有一个像这样的宏:

Do While True

    Worksheet.Calculate

    If Value > 10 Then
        SendEmail
    End If

    Sleep 60*CLng(1000)

Loop
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,它会堵塞整个程序,如果我尝试做任何事情,它将无法响应.

反正有没有完成这个,但让它在后台运行或至少没有崩溃程序?

我以前做的是使用VBScript打开一个不可见的电子表格,VBScript在后台持续运行,监控条件并运行良好,但我的客户真的想要一个GUI,并且它在程序本身.

有什么想法吗?

Chi*_*ten 8

使用该Application.OnTime方法可以安排将在一分钟内运行的代码.

您的代码看起来像这样(未经测试):

Sub CreateNewSchedule()
    Application.OnTime EarliestTime:=DateAdd("n", 1, Now), Procedure:="macro_name", Schedule:=True
End Sub

Sub macro_name()

    If Value > 10 Then
        SendEmail
    Else
        CreateNewSchedule
    End If

End Sub
Run Code Online (Sandbox Code Playgroud)

您可能希望将下一个计划的时间存储在全局变量中,以便Workbook_BeforeClose事件可以取消下一个计划.否则Excel将重新打开工作簿.

Public nextScheduledTime As Date

Sub CreateNewSchedule()
    nextScheduledTime  = DateAdd("n", 1, Now)
    Application.OnTime EarliestTime:=nextScheduledTime , Procedure:="macro_name", Schedule:=True
End Sub

Sub macro_name()

    If Value > 10 Then
        SendEmail
    Else
        CreateNewSchedule
    End If

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
On Error Resume Next
    Application.OnTime EarliestTime:=nextScheduledTime, Procedure:="macro_name", Schedule:=False
End Sub
Run Code Online (Sandbox Code Playgroud)

然后,您可以在预定时间之间继续使用Excel.