Excel VBA - RefreshAll不更新数据透视表

时间:2016-02-01 13:48:18

标签: vba excel-vba access-vba excel

我有一个模板工作簿,它有几个连接到sql连接的数据表,以及一些数据透视表,它们的数据源是通过的数据。

我的印象是ActiveWorkbook.RefreshAll会更新所有连接,然后更新枢轴。实际上,当我手动运行刷新时会发生这种情况。但是,当我运行VBA(实际上是在Access中,但正确引用等)时,它会更新连接但不更新数据透视表?

我在DoEvents之后尝试RefreshAll没有效果。

现在我唯一的选择是通过所有工作表,数据源,数据透视缓存运行For each并以这种方式刷新它们吗?

3 个答案:

答案 0 :(得分:10)

ActiveWorkbook.RefreshAll实际上就像RefreshAll连接和枢轴一样。但是,在您的方案中,枢轴可能基于您必须首先刷新的数据。数据未加载时,数据透镜将刷新,因此出现意外行为。

有多种解决方案:

  • 要么通过连接返回数据作为pivotcache,所以数据库返回时数据透视表会自动刷新。 这样,您就不会将数据本身存储在工作簿中的单独工作表中。

  • 在背景中设置"刷新"所有连接的属性为false,无论是在代码中还是通过UI,然后按正常方式执行。的两次即可。第二次pivotcaches将拥有更新的数据,从而按预期刷新。 - 编辑:我不建议这样做,因为你将打开数据库连接两次,加载数据两次,等等。非常低效!

  • 如上所述,将"背景中的刷新" - 属性设置为false。使用全部刷新刷新后,循环浏览工作表' pivottable collection在加载数据后手动刷新,如下所示。

代码:

Sub test()

Dim ws as Worksheet
Dim pt as PivotTable

ActiveWorkbook.RefreshAll 'make sure the refresh in bg property is false for all connections

For each ws in ActiveWorkbook.Worksheets
    For each pt in ws.pivottables
        pt.RefreshTable
    Next pt
Next ws

End Sub

或者只是刷新pivotcaches(效率更高,特别是如果多个表使用相同的缓存):

Sub test()
Dim pc as PivotCache

ActiveWorkbook.RefreshAll 'make sure the refresh in bg property is false for all connections

For each pc in ActiveWorkbook.PivotCaches
    pc.Refresh
Next pc

End Sub

答案 1 :(得分:3)

我已使用以下

解决了该问题
    For Each sht In .Sheets
        For Each qt In sht.QueryTables
            qt.Refresh
        Next qt
        For Each lo In sht.ListObjects
            lo.QueryTable.Refresh BackgroundQuery:=False
        Next lo
        For Each pvt In sht.PivotTables
            pvt.PivotCache.Refresh
        Next pvt
    Next sht

答案 2 :(得分:0)

我已经通过添加一个简单的“计算”来解决了这个问题。代码。

Calculate
ActiveWorkbook.RefreshAll