【问题标题】:How to set a delay in VB Script to let Excel update data如何在 VB 脚本中设置延迟以让 Excel 更新数据
【发布时间】:2013-05-28 16:11:41
【问题描述】:

我有一个 Excel 文件,它自动从外部数据库加载数据(通过数据连接到 Accesss 数据库,该数据库又链接到 Sharepoint 表)。我需要自动化以下过程:

  • 打开 Excel 文件
  • 等待数据刷新
  • 运行宏(在此文件中)
  • 关闭文件

我的脚本是:

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("excel spreadsheet.xlsm")
WScript.Sleep 1000 * 60 * 5
objExcel.Run "macro_name"
objWorkbook.close False
objExcel.Application.Quit

但是,无论我在 WScript.sleep 中设置什么延迟,它都不会更新数据;相反,它会在电子表格中已有的数据上运行宏。谁能帮忙,拜托!


解决方案

最后(并且得益于几天的现场测试),以下似乎是最干净和最有效的:

  1. 从 VB 脚本中完全删除“WScript.Sleep 1000 * 60 * 5”行
  2. 在 Excel 中,清除每个连接的“属性”中的“启用后台刷新”复选框
  3. 在主代码之前的宏中添加以下行

    ActiveWorkbook.RefreshAll

非常感谢 Philip 和 Santosh 的回答,为我指明了正确的方向!

【问题讨论】:

    标签: excel vbscript database-connection updates vba


    【解决方案1】:

    对于 Excel-VBA,您可以使用以下任何一种来暂停代码。

    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    

    Private Sub delay(seconds As Long)
        Dim endTime As Date
        endTime = DateAdd("s", seconds, Now())
        Do While Now() < endTime
            DoEvents
        Loop
    End Sub
    

    Application.Wait (Now() + TimeSerial(0, 0, 5))
    


    示例代码 (将暂停 10 秒)
    Set objExcel = CreateObject("Excel.Application")
    Set objWorkbook = objExcel.Workbooks.Open("excel spreadsheet.xlsm")
    objExcel.Wait (Now + TimeSerial(0, 0,10))
    objExcel.Run "macro_name"
    objWorkbook.close False
    objExcel.Application.Quit
    

    【讨论】:

    • 我认为 OP 可能需要在调用他的宏之前以编程方式强制刷新查询表,或者,修改 Excel VBA 中的宏(如果可用)以引用,然后调用 Application.Wait TimeSerial ...
    • @Philip 我觉得第三步(•运行宏)发生在所需数据可用之前。不太确定。
    • 同意,向宏添加刷新行似乎最简单。将 BackgroundQuery 设置为 FALSE 应该注意数据更新/宏运行的其余部分的顺序。将在源数据库更改时报告 tomo 或几天后。 @ Santosh:根据我过去使用 Excel 的经验,Application.Wait 不能很好地处理查询(至少是 Bloomberg 的查询)。无法评论 #1 和 #2 选项 - 但无论如何谢谢!
    • @r-q 当您创建 applicationSet objExcel = CreateObject("Excel.Application") 的对象时,您必须将 wait 应用为 objExcel.Wait (Now + TimeSerial(0, 0,10))。请尝试并告诉我们。谢谢
    【解决方案2】:

    在您的工作簿中,您需要在运行代码之前刷新 QueryTables 中的数据。

    为什么不在 excel vba 宏的开头调用查询表上的 Refresh 方法?

    【讨论】:

    • 完美,非常感谢,添加 Range("Table_ExternalData_15").ListObject.QueryTable.Refresh BackgroundQuery:=False 并且它似乎有效。将在一夜之间通过 VB 脚本对其进行测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    相关资源
    最近更新 更多