私は、SQL接続に接続されたいくつかのデータテーブルと、そのデータのソースとなるピボットテーブルを含むテンプレートブックを持っています。
ActiveWorkbook.RefreshAll
はすべての接続を更新してから、ピボットを更新します。実際に、すべての更新を手動で実行するとどうなりますか。ただし、VBA(実際にはAccessにありますが、正しく参照されているなど)を実行すると、接続は更新されますがピボットテーブルは更新されませんか?
DoEvents
の後にRefreshAll
を試しましたが、効果はありませんでした。
For each
すべてのワークシート、データソース、ピボットキャッシュを介してそれらを更新しますか?
以下を使用して問題を解決しました
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
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
コードに簡単な「計算」を追加することで問題を解決しました。
Calculate
ActiveWorkbook.RefreshAll