web-dev-qa-db-ja.com

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

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

78
Lipis

はい。

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
158
GSerg

この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

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

  • 各ピボットテーブルを右クリックします
  • テーブルオプションを選択
  • 'Refresh on open'オプションにチェックマークを付けます。
  • [OK]ボタンをクリックします

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

25
Robert Mearns

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

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

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

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

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

8

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

Ctrl + alt + F5を押す

5
Prasenjit

VBWorksheetオブジェクトにPivotTablesコレクションがあります。したがって、このようなクイックループは機能します。

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

トレンチからのメモ:

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

がんばろう!

1
LohanJ

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

このコードでは、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
0
Rajiv Singh

コード

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
user3564681