在时间表内一起刷新外部数据源和数据透视表

时间:2013-04-25 18:30:27

标签: excel-vba pivot-table vba excel

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

是否有解决方案( VBA代码)在一个时间表内同时刷新外部数据源和数据透视表(如果我们设置一个计时器),请点击command button?< / p>

5 个答案:

答案 0 :(得分:21)

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

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

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

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

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

ActiveWorkbook.Connections("CONNECTION_NAME").ODBCConnection.BackgroundQuery = False

答案 1 :(得分:11)

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

Sub Refresh()

    Dim conn As Variant

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

    ActiveWorkbook.RefreshAll
End Sub

答案 2 :(得分:4)

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

Excel 2010(及更高版本)有一个名为CalculateUntilAsyncQueriesDone的方法,所有你必须在调用RefreshAll方法后调用它。 Excel将等到计算完成。

ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone

在将模型发送给其他人之前,我通常会将这些内容放在一起,以便不间断地完成主计算。像这样:

ThisWorkbook.RefreshAll
Application.CalculateUntilAsyncQueriesDone
Application.CalculateFullRebuild
Application.CalculateUntilAsyncQueriesDone

答案 3 :(得分: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

:)

答案 4 :(得分: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