我希望监控某个值,并在满足某些条件时收到电子邮件通知。我有一个像这样的宏:
Do While True
Worksheet.Calculate
If Value > 10 Then
SendEmail
End If
Sleep 60*CLng(1000)
Loop
但是,当我运行它时,它会堵塞整个程序,如果我尝试做任何事情,它将无法响应。
是否有任何方法可以完成此操作,但是它是在后台运行还是至少不会使程序崩溃?
之前我正在做的是使用VBScript打开一个不可见的电子表格,VBScript在后台连续运行,监控条件并运行良好,但我的客户真的想要一个GUI,并且它在程序本身。
有什么想法吗?
答案 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。