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

时间:2015-07-03 16:19:35

标签: vba excel-vba excel

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

Do While True

    Worksheet.Calculate

    If Value > 10 Then
        SendEmail
    End If

    Sleep 60*CLng(1000)

Loop

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

是否有任何方法可以完成此操作,但是它是在后台运行还是至少不会使程序崩溃?

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

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

使用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

您可能希望将下一个计划的时间存储在全局变量中,以便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

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

答案 1 :(得分:1)

我认为你需要通过DoEvents调用专门处理应用程序事件堆栈。这允许用户与电子表格进行交互,通常宏将优先。您的代码看起来像:

Do While True

    If Value > 10 Then
        SendEmail
    End If

    Sleep 60*CLng(1000)

    DoEvents
Loop

如果您想继续使用VBScript,还可以使用HTA构建GUI。