11

在我上一篇文章Auto refresh pivottables data in excel on first run 中,我发现在我第一次执行时,来自外部数据源查询被刷新,大约需要 1 分钟才能执行。在我的第二次运行中,数据透视表已更新。

是否有解决方案(VBA 代码)通过单击在时间安排(如果我们设置了计时器)内同时刷新外部数据源和数据透视表command button

4

5 回答 5

26

在连接属性下,取消选中“启用后台刷新”。这将使连接在被告知时刷新,而不是在其他进程发生时在后台刷新。

禁用后台刷新后,您的 VBA 过程将等待您的外部数据刷新,然后再移动到下一行代码。

然后你只需修改以下代码:

ActiveWorkbook.Connections("CONNECTION_NAME").Refresh
Sheets("SHEET_NAME").PivotTables("PIVOT_TABLE_NAME").PivotCache.Refresh

您还可以在 VBA 中关闭后台刷新:

ActiveWorkbook.Connections("CONNECTION_NAME").ODBCConnection.BackgroundQuery = False
于 2013-04-25T20:46:12.703 回答
12

我使用了上述答案,但使用了 RefreshAll 方法。我还对其进行了更改以允许多个连接而无需指定名称。然后我将它链接到我的电子表格上的一个按钮。

Sub Refresh()

    Dim conn As Variant

    For Each conn In ActiveWorkbook.Connections
        conn.ODBCConnection.BackgroundQuery = False
    Next conn

    ActiveWorkbook.RefreshAll
End Sub
于 2013-09-16T20:02:47.940 回答
4

我认为有一种更简单的方法可以让 excel 等到刷新完成,而无需将 Background Query 属性设置为 False。为什么要乱弄人们的喜好呢?

Excel 2010(及更高版本)具有称为 CalculateUntilAsyncQueriesDone 的方法,您只需在调用 RefreshAll 方法后调用它。Excel 将等待计算完成。

ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone

在将我的模型发送给其他人之前,我通常将这些东西放在一起进行不间断的主计算。像这样的东西:

ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
Application.CalculateFullRebuild
Application.CalculateUntilAsyncQueriesDone
于 2015-05-27T07:07:34.430 回答
0

例如每 5 秒 自动刷新工作簿。适用于模块

Public Sub Refresh()
'refresh
ActiveWorkbook.RefreshAll

alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss
    Application.OnTime alertTime, "Refresh"

End Sub

适用于打开的工作簿

Private Sub Workbook_Open()
alertTime = Now + TimeValue("00:00:05") 'hh:mm:ss
Application.OnTime alertTime, "Refresh"
End Sub

:)

于 2014-02-28T18:14:24.530 回答
0

我在网上找到了这个解决方案,它很好地解决了这个问题。我唯一担心的是循环遍历所有枢轴,如果它们很多,查询可能会变得很耗时:

Sub RefreshTables()

Application.DisplayAlerts = False
Application.ScreenUpdating = False

Dim objList As ListObject
Dim ws As Worksheet

For Each ws In ActiveWorkbook.Worksheets
    For Each objList In ws.ListObjects
        If objList.SourceType = 3 Then
            With objList.QueryTable
                .BackgroundQuery = False
                .Refresh
            End With
        End If
    Next objList
Next ws

Call UpdateAllPivots

Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub

Sub UpdateAllPivots()
Dim pt As PivotTable
Dim ws As Worksheet

For Each ws In ActiveWorkbook.Worksheets
    For Each pt In ws.PivotTables
        pt.RefreshTable
    Next pt
Next ws

End Sub
于 2019-10-03T16:13:40.153 回答