簡體   English   中英

Excel VBA - RefreshAll 不更新數據透視表

[英]Excel VBA - RefreshAll not updating pivot tables

我有一個模板工作簿,其中有幾個數據表連接到 sql 連接,以及一些數據透視表,它們的來源是通過數據帶來的。

我的印象是ActiveWorkbook.RefreshAll會更新所有連接,然后更新樞軸。 這實際上是我手動運行刷新時發生的情況。 但是,當我運行 VBA(實際上在 Access 中,但被正確引用等)時,它會更新連接而不是數據透視表?

我在RefreshAll之后嘗試了DoEvents ,但沒有效果。

我現在唯一的選擇是通過所有工作表、數據源、數據透視緩存運行For each並以這種方式刷新它們嗎?

ActiveWorkbook.RefreshAll 實際上就像 RefreshAll 連接和樞軸一樣。 但是,在您的場景中,樞軸可能基於您必須首先刷新的數據。 數據尚未加載時,數據透視表將刷新,因此會出現意外行為。

對此有多種解決方案:

  • 要么將通過連接返回的數據作為數據透視緩存,以便數據返回時數據透視表將自動刷新。 這樣,您也不會將數據本身存儲在工作簿的單獨工作表中。

  • 在代碼中或通過 UI 將所有連接的“后台刷新”屬性設置為 false,然后照常執行。 兩次 第二次數據透視緩存將具有更新的數據並因此按預期刷新。 -編輯:我不推薦這個,因為你會打開數據庫連接兩次,加載數據兩次等等。效率非常低!

  • 如上所述,將“在后台刷新”- 屬性設置為 false。 使用 Refresh all 刷新后,循環遍歷工作表的數據透視表集合以在加載數據后手動刷新它們,如下所示。

代碼:

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

我已經通過使用以下方法解決了這個問題

    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

我通過在代碼中添加一個簡單的“計算”解決了這個問題。

Calculate
ActiveWorkbook.RefreshAll

我在通過宏復制和保存工作簿時遇到了這個問題,並且在不同的數據透視表/緩存刷新方面沒有運氣,但在更改每個數據透視表的 SaveData 屬性方面很幸運。 以防萬一有人像我一樣讀到這個並且正在尋找其他東西來嘗試。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM