Excelワークブックのすべてのピボットテーブルをマクロで更新する


84

20種類のピボットテーブルを含むワークブックがあります。すべてのピボットテーブルを見つけてVBAで更新する簡単な方法はありますか?

回答:


170

はい。

ThisWorkbook.RefreshAll

または、Excelのバージョンが十分に古い場合は、

Dim Sheet as WorkSheet, Pivot as PivotTable
For Each Sheet in ThisWorkbook.WorkSheets
    For Each Pivot in Sheet.PivotTables
        Pivot.RefreshTable
        Pivot.Update
    Next
Next

17
ああ、反対票。5年以上経った

3
確かに..それはさわやかです..誰かがこの質問をトピック外として閉じようとさえしています...それは私がマウスか何かを使用するだけでそれをするように頼んだようではありません:D
リピス

3
素晴らしいです。新しい外部データを取得した後でピボットを更新したかったので、これを使用する必要がありました。そのため、ThisWorkbook.RefreshAllは機能しませんでした。
Yasskier 2014

5
ただのメモ。のThisWorkbook.RefreshAll場合、何らかの理由でこの方法は機能しませんApplication.Calculation = xlCalculationManualApplication.Calculation = xlCalculationAutomaticコードを使用する前に、計算プロパティをに設定します。
kolcinx 2016

3
@GSergこの古い投稿を復活させて申し訳ありませんが、質問があります(ここに投稿されています):Update後を行う必要がありRefreshTableますか?2つの違いは何ですか?
オスカーアンソニー

26

このVBAコードは、ブック内のすべてのピボットテーブル/グラフを更新します。

Sub RefreshAllPivotTables()

Dim PT As PivotTable
Dim WS As Worksheet

    For Each WS In ThisWorkbook.Worksheets

        For Each PT In WS.PivotTables
          PT.RefreshTable
        Next PT

    Next WS

End Sub

別の非プログラムオプションは次のとおりです。

  • 各ピボットテーブルを右クリックします
  • テーブルオプションを選択します
  • ダニ「オープンで最新の情報に更新」を選択。
  • [OK]ボタンをクリックします

これにより、ワークブックが開かれるたびにピボットテーブルが更新されます。


20

ActiveWorkbook.RefreshAllピボットテーブルだけでなく、ODBCクエリもすべて更新します。データ接続を参照するVBAクエリがいくつかあり、コマンドがVBAから提供された詳細なしでデータ接続を実行すると、このオプションを使用するとクラッシュします

ピボットのみを更新する場合は、このオプションをお勧めします

Sub RefreshPivotTables()     
  Dim pivotTable As PivotTable     
  For Each pivotTable In ActiveSheet.PivotTables         
    pivotTable.RefreshTable     
  Next 
End Sub 

1
最も投票された答えを確認してください..2番目のアプローチは実際にここで試したものです..しかしブーム全体のために..アクティブシートだけでなく..どちらの場合もそれは本当に依存します..そして私はそれ以来触れていません..
リピス2012

ピボットテーブルがアクティブシートにない場合はどうなりますか?
気紛れに2018年

8

特定の状況では、ピボットテーブルとそのピボットキャッシュを区別したい場合があります。キャッシュには、独自の更新メソッドと独自のコレクションがあります。したがって、ピボットテーブルの代わりにすべてのピボットキャッシュを更新することもできます。

違い?新しいピボットテーブルを作成すると、前のテーブルに基づいてピボットテーブルを作成するかどうかを尋ねられます。いいえと答えた場合、このピボットテーブルは独自のキャッシュを取得し、ソースデータのサイズを2倍にします。「はい」と答えた場合は、ブックを小さく保ちますが、単一のキャッシュを共有するピボットテーブルのコレクションに追加します。コレクション内の単一のピボットテーブルを更新すると、コレクション全体が更新されます。したがって、ワークブック内のすべてのピボットテーブルを更新する場合と、ワークブック内のすべてのキャッシュを更新する場合の違いは想像できます。


5

ピボットテーブルツールバーには、[すべて更新]オプションがあります。それは十分です。他に何もする必要はありません。

Ctrl + Alt + F5を押します


3
同意しません。たとえば、セルが変更されるたびに、リピスが更新プロセスを自動化したい場合はどうなりますか?
StockB 2013年

1

あなたは持っているピボットテーブルのVBにコレクションをワークシートオブジェクト。したがって、次のようなクイックループが機能します。

Sub RefreshPivotTables()
    Dim pivotTable As PivotTable
    For Each pivotTable In ActiveSheet.PivotTables
        pivotTable.RefreshTable
    Next
End Sub

塹壕からのメモ:

  1. ピボットテーブルを更新する前に、保護されているシートの保護を解除することを忘れないでください。
  2. 頻繁に保​​存します
  3. 私はもっ​​と考えて、やがて更新します... :)

幸運を!


0

コード

Private Sub Worksheet_Activate()
    Dim PvtTbl As PivotTable
        Cells.EntireColumn.AutoFit
        For Each PvtTbl In Worksheets("Sales Details").PivotTables
        PvtTbl.RefreshTable
        Next
End Sub 

正常に動作します。

コードはシートのアクティブ化モジュールで使用されるため、シートがアクティブ化されるとちらつき/グリッチが表示されます。


0

特定の接続更新することでき、その接続にリンクされているすべてのピボットが更新されます。

このコードでは、Excelにあるテーブルからスライサーを作成しました

Sub UpdateConnection()
        Dim ServerName As String
        Dim ServerNameRaw As String
        Dim CubeName As String
        Dim CubeNameRaw As String
        Dim ConnectionString As String

        ServerNameRaw = ActiveWorkbook.SlicerCaches("Slicer_ServerName").VisibleSlicerItemsList(1)
        ServerName = Replace(Split(ServerNameRaw, "[")(3), "]", "")

        CubeNameRaw = ActiveWorkbook.SlicerCaches("Slicer_CubeName").VisibleSlicerItemsList(1)
        CubeName = Replace(Split(CubeNameRaw, "[")(3), "]", "")

        If CubeName = "All" Or ServerName = "All" Then
            MsgBox "Please Select One Cube and Server Name", vbOKOnly, "Slicer Info"
        Else
            ConnectionString = GetConnectionString(ServerName, CubeName)
            UpdateAllQueryTableConnections ConnectionString, CubeName
        End If
    End Sub

    Function GetConnectionString(ServerName As String, CubeName As String)
        Dim result As String
        result = "OLEDB;Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Update Isolation Level=2"
        '"OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption for Data=False;Tag with column collation when possible=False"
        GetConnectionString = result
    End Function

    Function GetConnectionString(ServerName As String, CubeName As String)
    Dim result As String
    result = "OLEDB;Provider=MSOLAP.5;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=" & CubeName & ";Data Source=" & ServerName & ";MDX Compatibility=1;Safety Options=2;MDX Missing Member Mode=Error;Update Isolation Level=2"
    GetConnectionString = result
End Function

Sub UpdateAllQueryTableConnections(ConnectionString As String, CubeName As String)
    Dim cn As WorkbookConnection
    Dim oledbCn As OLEDBConnection
    Dim Count As Integer, i As Integer
    Dim DBName As String
    DBName = "Initial Catalog=" + CubeName

    Count = 0
    For Each cn In ThisWorkbook.Connections
        If cn.Name = "ThisWorkbookDataModel" Then
            Exit For
        End If

        oTmp = Split(cn.OLEDBConnection.Connection, ";")
        For i = 0 To UBound(oTmp) - 1
            If InStr(1, oTmp(i), DBName, vbTextCompare) = 1 Then
                Set oledbCn = cn.OLEDBConnection
                oledbCn.SavePassword = True
                oledbCn.Connection = ConnectionString
                oledbCn.Refresh
                Count = Count + 1
            End If
        Next
    Next

    If Count = 0 Then
         MsgBox "Nothing to update", vbOKOnly, "Update Connection"
    ElseIf Count > 0 Then
        MsgBox "Update & Refresh Connection Successfully", vbOKOnly, "Update Connection"
    End If
End Sub

-2

最近、以下のコマンドを使用しましたが、正常に動作しているようです。

ActiveWorkbook.RefreshAll

お役に立てば幸いです。


6
それは大いに役立ちます..しかし、それが実際に上に書かれているのを見ませんでしたか?4年前のように?!(stackoverflow.com/a/70976/8418
Lipis

-3

MS Excel 2003を使用している場合は、[表示]-> [ツールバー]-> [ピボットテーブル]に移動します。このツールバーから、[!]をクリックして更新を実行できます。このシンボル。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.