Power Query Tables不会下载数据,直到VBA完成执行

时间:2017-09-27 10:57:48

标签: excel vba excel-vba oledb powerquery

我有一个包含4个工作表的电子表格,每个工作表都连接到一个电源查询,该查询连接到OLEDB数据库并运行select以将数据导入工作簿。

我正在尝试自动刷新查询。

我在工作簿中有VBA   - 禁用后台刷新,
  - 运行Workbook.RefreshAll,
  - 将后台刷新重置为true(因为我需要这个以便自动化软件能够首先运行它)和
  - 然后等待30秒,以便在开始保存工作簿之前为自动化软件提供一些时间。

所有软件都会调用工作簿中的宏,然后保存后续执行。

查询正确地一个接一个地执行,我可以告诉表中的数据已经刷新。

已经下载行的电源查询确认发生在VBA完成执行之后,因此自动化软件在完成此操作之前保存它并且Excel将下载报告为失败。当一切正常时,这不是问题,但我们不知道下载何时真正失败,除非我添加某种行计数比较,这实际上是一种解决方法而不是实际解决方案。

我尝试在工作簿中创建两个subs,一个用于刷新,另一个用于调用第一个sub然后等待30秒,我希望下载在第一个子完成执行后完成,但是这并没有&# 39; t发生。我尝试一次刷新一个连接而不是使用RefreshAll,尝试刷新实际的电源查询表而不是连接,并尝试刷新后台查询设置为true然后循环直到刷新标记为完成(如果你工作一步一步,但如果你只是完全运行VBA就会崩溃。

我还尝试在VBA末尾保存电子表格,但它仍会等到保存完成后才能更新电源查询状态。

我最新的VBA:

Sub Workbook_RefreshAll()

Application.DisplayAlerts = False

For Each objConnection In ThisWorkbook.Connections

    'Temporarily disable background-refresh
    objConnection.OLEDBConnection.BackgroundQuery = False
    objConnection.OLEDBConnection.MaintainConnection = False

Next

ActiveWorkbook.RefreshAll

For Each objConnection In ThisWorkbook.Connections

    'Re-enable background-refresh
    objConnection.OLEDBConnection.BackgroundQuery = True
    objConnection.OLEDBConnection.MaintainConnection = True

Next

newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 30
waitTime = TimeSerial(newHour, newMinute, newSecond)

Application.Wait waitTime

End Sub

(我无法记住维护连接参数是否真的有帮助,因为我试图强制连接在每次刷新后丢弃,但它确实有效,所以无法将其取出。)

1 个答案:

答案 0 :(得分:1)

而不是var viewModel = kendo.observable({ isVisible: true, onSave: function(e) { kendoConsole.log("event :: save(" + kendo.stringify(e.values, null, 4) + ")"); }, products: new kendo.data.DataSource({ schema: { model: { id: "ProductID", fields: { ProductName: { type: "string" }, UnitPrice: { type: "number" } } } }, batch: true, transport: { read: { url: "https://demos.telerik.com/kendo-ui/service/products", dataType: "jsonp" }, update: { url: "https://demos.telerik.com/kendo-ui/service/products/update", dataType: "jsonp" }, create: { url: "https://demos.telerik.com/kendo-ui/service/products/create", dataType: "jsonp" }, parameterMap: function(options, operation) { if (operation !== "read" && options.models) { return {models: kendo.stringify(options.models)}; } } } }) }); kendo.bind($("#example"), viewModel); 尝试以下内容:

Application.Wait