web-dev-qa-db-ja.com

Excel VBA-ピボットテーブルを更新しないRefreshAll

私は、SQL接続に接続されたいくつかのデータテーブルと、そのデータのソースとなるピボットテーブルを含むテンプレートブックを持っています。

ActiveWorkbook.RefreshAllはすべての接続を更新してから、ピボットを更新します。実際に、すべての更新を手動で実行するとどうなりますか。ただし、VBA(実際にはAccessにありますが、正しく参照されているなど)を実行すると、接続は更新されますがピボットテーブルは更新されませんか?

DoEventsの後にRefreshAllを試しましたが、効果はありませんでした。

For eachすべてのワークシート、データソース、ピボットキャッシュを介してそれらを更新しますか?

8
GavinP

以下を使用して問題を解決しました

    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
3
GavinP

ActiveWorkbook.RefreshAllは、実際にはRefreshAll接続とピボットを行います。ただし、シナリオでは、ピボットはおそらく最初に更新する必要があるデータに基づいています。ピボットはデータがまだ読み込まれていないときに更新されるため、予期しない動作が発生します。

これには複数の解決策があります:

  • 接続を介してデータをピボットキャッシュとして返すか、データが返されたときにピボットテーブルが自動的に更新されるようにします。この方法では、ワークブックの別のシートにデータ自体が保存されることもありません。

  • すべての接続について、コードまたはUIを介して「バックグラウンドで更新」プロパティをfalseに設定し、通常どおり実行します。 2回。 2回目は、pivotcacheに更新されたデータが含まれるため、期待どおりに更新されます。 -編集:db接続を2回開いたり、データを2回ロードしたりするため、これはお勧めしません。非常に非効率的です

  • 上記のように、「バックグラウンドで更新」-プロパティを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

または、単にピボットキャッシュのみを更新します(特に、複数のテーブルが同じキャッシュを使用する場合はより効率的です)。

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
10
Rik Sportel

コードに簡単な「計算」を追加することで問題を解決しました。

Calculate
ActiveWorkbook.RefreshAll
0
BuckTurgidson