作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想监控一个值并在满足某些条件时收到电子邮件通知。我有一个像这样的宏:
Do While True
Worksheet.Calculate
If Value > 10 Then
SendEmail
End If
Sleep 60*CLng(1000)
Loop
但是,当我运行它时,它会阻塞整个程序,并且如果我尝试执行任何操作,它就会变得无响应。
是否有办法完成此任务,但让它在后台运行,或者至少不会使程序崩溃?
我之前所做的是使用 VBScript 打开一个不可见的电子表格,并且 VBScript 在后台连续运行,监视状况并且工作正常,但我的客户确实想要一个 GUI,并将其包含在程序本身中。
有什么想法吗?
最佳答案
使用 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。
关于vba - 如何让VBA宏在后台持续运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31210921/
我是一名优秀的程序员,十分优秀!