excel RefreshAll不更新透视表

w6mmgewl  于 2022-12-24  发布在  其他
关注(0)|答案(4)|浏览(338)

我有一个模板工作簿,其中有几个数据表连接到sql连接,以及一些数据透视表谁的来源是通过带来的数据。
我的印象是ActiveWorkbook.RefreshAll将更新所有连接,然后更新透视表。这实际上是当我手动运行刷新时发生的事情。然而,当我运行VBA(它实际上在Access中,但被正确引用等)时,它更新连接,但不更新透视表?
我在RefreshAll之后尝试了DoEvents,没有效果。
我现在唯一的选择是在所有工作表、数据源、透视缓存中运行For each并以这种方式刷新它们吗?

nnt7mjpx

nnt7mjpx1#

ActiveWorkbook.RefreshAll实际上执行RefreshAll连接和透视表。但是,在您的方案中,透视表可能基于您必须首先刷新的数据。透视表将在数据尚未加载时刷新,因此出现意外行为。
对此有多种解决方案:

  • 或者将通过连接返回的数据作为pivotcache,以便在返回数据时自动刷新数据透视表。这样,您也不会将数据本身存储在工作簿的单独工作表中。
  • 在代码中或通过UI将所有连接的"Refresh in Background"属性设置为false,然后正常执行。两次。第二次pivotcaches将具有更新的数据,从而按预期进行刷新。-编辑:我不推荐这样做,因为这样会打开数据库连接两次,加载数据两次,等等。效率非常低!
  • 如上所述,将"在后台刷新"属性设置为false。使用"全部刷新"进行刷新后,循环遍历工作表的数据透视表集合,以便在加载数据后手动刷新这些数据透视表集合,如下所示。

代码:

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
dgjrabp2

dgjrabp22#

我已使用以下方法解决了此问题

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
jm81lzqq

jm81lzqq3#

我已经通过在代码中添加一个简单的“Calculate”来解决这个问题。

Calculate
ActiveWorkbook.RefreshAll
xesrikrc

xesrikrc4#

我在通过宏复制和保存工作簿时遇到了这个问题,并且在不同的数据透视表/缓存刷新方面没有什么运气,但在更改每个数据透视表的SaveData属性方面找到了运气。以防有人像我一样阅读此内容并正在寻找其他方法进行尝试。

For Each pt in ws.PivotTables
   pt.SaveData = True
Next pt

相关问题