3

我有一个 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 的回答,为我指明了正确的方向!

4

2 回答 2

3

对于 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
于 2013-05-23T16:00:34.253 回答
0

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

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

于 2013-05-23T15:19:10.070 回答