excel - 按时间间隔运行宏的代码?

标签 excel time intervals vba

如何设置宏在特定时间运行,然后以设定的时间间隔运行?我希望它在每小时的顶部运行,因此我想在上午 07:00 启动它,然后在我希望它再次运行后每小时运行一次。这是代码:

Sub Refresh_All()
'
' Refresh_All Macro
'
' Keyboard Shortcut: Ctrl+Y
'
    ChDir "Q:\Quality Control"
    Workbooks.Open Filename:= _
        "Q:\Quality Control\Internal Failure Log - Variable Month.xlsm"
    Dim endTime As Date
    endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
DoEvents
    Loop
    ActiveWorkbook.RefreshAll
       endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.Save
    endTime = DateAdd("s", 5, Now())
    Do While Now() < endTime
        DoEvents
    Loop
    ActiveWindow.Close
    ChDir "Q:\Reports"
    Workbooks.Open Filename:= _
        "Q:\Reports\Finished-Transfer Report-variable month.xlsm"
        endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.RefreshAll
     endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.Save
        endTime = DateAdd("s", 5, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWindow.Close
    ActiveWorkbook.RefreshAll
        endTime = DateAdd("s", 10, Now())
    Do While Now() < endTime
        DoEvents
    Loop
ActiveWorkbook.Save
End Sub

最佳答案

Lumigraphics提出了关于内存使用的一个很好的观点,应该考虑这一点。为了学习的目的,我将提出一个替代解决方案,它不需要任务调度程序,并且可以完全在显示工作簿中工作。

在 VB 编辑器中,添加这个新子例程

Public Sub RefreshDataEachHour()

    Application.OnTime Now + TimeValue("01:00:00"), "Refresh_All"

End Sub

并将以下行添加到 Refresh_All 例程的末尾

调用 RefreshDataEachHour

Refresh_All 例程第一次运行时,它将调用这个新过程,该过程将等待一个小时,然后调用 Refresh_All。在 Refresh_All 结束时,它再次返回到此存储过程,该过程将再次等待一个小时,然后调用 Refresh_All 等。这将重复,直到退出 Excel 应用程序。

下面的这部分超出了您的问题范围,但我认为无论如何提及都很重要。

基本上,Application.OnTime 安排任务在将来的某个时间运行。您可能希望在某个时间点结束此计划任务。为此,您必须使用参数 Schedule:=False 调用 Application.OnTime 方法,并且必须传入您使用第一个 计划该过程的确切时间。 >Application.OnTime 调用。

要处理这种情况,请声明一个全局变量(在所有子例程之外)并将该变量传递到一个将取消任务的新子例程中。

例如,您可以声明

公共(public) RunWhen 作为日期

然后您可以按如下方式修改上述过程:

Public Sub RefreshDataEachHour()

    RunWhen = Now + TimeValue("01:00:00")
    Application.OnTime EarliestTime:=RunWhen,Procedure:="Refresh_All",Schedule:=True

End Sub

然后您可以添加另一个子例程来处理任务的取消,如下所示:

Public Sub CancelRefresh()

    Application.OnTime EarliestTime:=RunWhen, Procedure:="Refresh_All", Schedule:=False

End Sub

每当您使用Call CancelRefresh时,应该从队列中删除您的过程。

关于excel - 按时间间隔运行宏的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29782256/

相关文章:

php - 如何将mysql表数据写入excel文件但不下载只存储文件

excel - 每 30 分钟移动一次鼠标指针

javascript - 更改 HH 的时间字符串 :mm am/pm to 24 hour time

unix - 如何在指定的时间间隔内 tail -f 文件(或类似文件)?

java - 如何在 Android 中使用计时器?

vba - 显示宏选项

ruby - 哪个 gem 支持导入/导出到 ruby​​ 中的 xlsx 文件

date - SAS 按日期和时间合并

c - 在 C 中打印新行之前是否可以等待几秒钟?

android - android间隔怎么样