【问题标题】:How to refresh database data in Excel at regular intervals?如何定期刷新Excel中的数据库数据?
【发布时间】:2019-07-16 15:13:03
【问题描述】:

在我正在制作的 Excel 电子表格/VBA 脚本中,我需要从数据库中调用数据,并每 5 分钟刷新一次值。程序从按下按钮开始,并应持续运行,直到用户中断执行。我目前不确定如何在不暂停电子表格的情况下让 Excel/VBA“等待”5 分钟,并且理想情况下,不会导致计算效率低下。

我尝试过使用“Application.Wait”和“Sleep”功能,但在 5 分钟等待期间,这两个功能都会暂停电子表格。

我当前的解决方案是使用“While”循环,其中包含“DoEvents”,如下面的代码所示。这使得程序只运行“While”循环 5 分钟,并且由于“DoEvents”,它不会暂停电子表格。然而,虽然电子表格可用,但这在计算上效率低下,因为程序执行在技术上并未暂停,它只是连续运行“While”循环,并且可能最终使用我的程序的一些较慢的计算机可能会显着减慢通过这个。

我目前的解决方案如下:

    Sub MainProgram()
    'dimension variables, open database connection, etc.
    Do While 1 < 2 'ad infinitum
        'get database data, write to spreadsheet, etc.
        WasteTime()
    Loop
    End Sub


    Sub WasteTime()
    EndTime = Now + TimeSerial(0,5,0)
    While Now < EndTime
        DoEvents
    Wend
    End Sub

如上所述,问题在于计算效率低下。在整个WasteTime 循环中,CPU 利用率相当高。所以我想知道,有没有什么办法可以在不暂停电子表格和不连续运行代码的情况下暂停脚本,从而给 CPU 带来负担?

【问题讨论】:

  • 或许可以看看Application.OnTime
  • 也许开启自动保存,并设置interval for that。然后添加一个刷新数据的Workbook.BeforeSave事件?
  • Application.OnTime 工作!谢谢大本!

标签: excel vba


【解决方案1】:

正如 BigBen 在 cmets 中提到的那样,Application.OnTime 是最好的选择。它通过安排在将来调用第二个宏来避免您描述的开销。

下面是一个例子。您可以使用常量变量修改等待时间。这些应该在同一个模块中(或将theCalculation 宏更改为不私有)。

Sub TheTimerMac()
     'enter in timevalue (hour:Minute:Second)
     Const DelayTime As String = "00:05:00" 

     Dim nextRunTime As Date
     nextRunTime = Now + TimeValue(DelayTime)

     'Schedules application to execute below macro at set time.
     Application.OnTime nextRunTime, "TheCalculation"

End Sub



Private Sub TheCalculation()
     'whatever you use for your calc here
     Application.CalculateFull

     'This will restart the timer portion.
     Call TheTimerMac

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 2017-08-08
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多