Aktualisieren aller Pivot-Tabellen in meiner Excel-Arbeitsmappe mit einem Makro

84

Ich habe eine Arbeitsmappe mit 20 verschiedenen Pivot-Tabellen. Gibt es eine einfache Möglichkeit, alle Pivot-Tabellen zu finden und in VBA zu aktualisieren?

Lipis
quelle

Antworten:

170

Ja.

ThisWorkbook.RefreshAll

Oder wenn Ihre Excel-Version alt genug ist,

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
GSerg
quelle
17
Ooh, eine Gegenstimme. Nach mehr als fünf Jahren ist das eine erfrischende Veränderung;)
GSerg
3
In der Tat ... das ist erfrischend ... jemand versucht sogar, diese Frage als nicht zum Thema gehörend zu schließen ... Es ist nicht so, als hätte ich darum gebeten, dies nur mit der Maus oder irgendetwas zu tun: D
Lipis
3
Fantastisch, ich musste es verwenden, da ich die Drehpunkte aktualisieren wollte, nachdem ich neue externe Daten erhalten hatte, sodass ThisWorkbook.RefreshAll für mich nicht funktionierte.
Yasskier
5
Nur eine Notiz. Die ThisWorkbook.RefreshAllMethode funktioniert aus irgendeinem Grund nicht, wenn Application.Calculation = xlCalculationManual. Setzen Sie die Berechnungseigenschaft auf, Application.Calculation = xlCalculationAutomaticbevor Sie den Code verwenden.
Kolcinx
3
@GSerg Sorry für diese alte Post wiederzubeleben, aber ich habe eine Frage (posted hier ): Müssen wir ein tun , Updatenachdem das RefreshTable? Was ist der Unterschied zwischen den beiden?
Oscar Anthony
26

Dieser VBA-Code aktualisiert alle Pivot-Tabellen / Diagramme in der Arbeitsmappe.

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

Eine andere nicht programmatische Option ist:

  • Klicken Sie mit der rechten Maustaste auf jede Pivot-Tabelle
  • Wählen Sie Tabellenoptionen
  • Aktivieren Sie die Option "Beim Öffnen aktualisieren" .
  • Klicken Sie auf die Schaltfläche OK

Dadurch wird die Pivot-Tabelle jedes Mal aktualisiert, wenn die Arbeitsmappe geöffnet wird.

Robert Mearns
quelle
20

ActiveWorkbook.RefreshAllaktualisiert alles, nicht nur die Pivot-Tabellen, sondern auch die ODBC-Abfragen. Ich habe einige VBA-Abfragen, die sich auf Datenverbindungen beziehen, und die Verwendung dieser Option stürzt ab, wenn der Befehl die Datenverbindungen ohne die vom VBA bereitgestellten Details ausführt

Ich empfehle die Option, wenn Sie nur die Drehpunkte aktualisieren möchten

Sub RefreshPivotTables()     
  Dim pivotTable As PivotTable     
  For Each pivotTable In ActiveSheet.PivotTables         
    pivotTable.RefreshTable     
  Next 
End Sub 
Kevin
quelle
1
Überprüfen Sie die am häufigsten gewählte Antwort. Der zweite Ansatz ist tatsächlich das, was Sie hier versucht haben. Aber für den gesamten Boom. Nicht nur für das aktive Blatt. In beiden Fällen kommt es wirklich darauf an. Und ich habe es seitdem nicht mehr angefasst.
Lipis
Was ist, wenn sich die Pivot-Tabelle nicht im aktiven Blatt befindet?
Freakishly
8

Unter bestimmten Umständen möchten Sie möglicherweise zwischen einer PivotTable und ihrem PivotCache unterscheiden. Der Cache verfügt über eine eigene Aktualisierungsmethode und eigene Sammlungen. Wir hätten also alle PivotCaches anstelle der PivotTables aktualisieren können.

Der Unterschied? Wenn Sie eine neue Pivot-Tabelle erstellen, werden Sie gefragt, ob Sie sie basierend auf einer vorherigen Tabelle möchten. Wenn Sie Nein sagen, erhält diese Pivot-Tabelle einen eigenen Cache und verdoppelt die Größe der Quelldaten. Wenn Sie "Ja" sagen, halten Sie Ihr WorkBook klein, fügen jedoch eine Sammlung von Pivot-Tabellen hinzu, die einen einzelnen Cache gemeinsam nutzen. Die gesamte Sammlung wird aktualisiert, wenn Sie eine einzelne Pivot-Tabelle in dieser Sammlung aktualisieren. Sie können sich daher vorstellen, was der Unterschied zwischen dem Aktualisieren jedes Caches im WorkBook und dem Aktualisieren jeder Pivot-Tabelle im WorkBook sein könnte.

Steve WahWah Weeks
quelle
5

In der Symbolleiste der Pivot-Tabelle gibt es die Option Alle aktualisieren. Das genügt. Ich muss nichts anderes tun.

Drücken Sie Strg + Alt + F5


quelle
3
Ich bin nicht einverstanden. Was ist, wenn Lipis beispielsweise den Aktualisierungsprozess automatisieren möchte, wenn eine Zelle geändert wird?
StockB
1

Sie haben eine PivotTables- Auflistung für ein VB- Arbeitsblattobjekt . Eine schnelle Schleife wie diese funktioniert also:

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

Notizen aus den Gräben:

  1. Denken Sie daran, alle geschützten Blätter zu schützen, bevor Sie die PivotTable aktualisieren.
  2. Sparen Sie oft .
  3. Ich werde an mehr denken und zu gegebener Zeit aktualisieren ... :)

Viel Glück!

LohanJ
quelle
0

Der Code

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

funktioniert gut.

Der Code wird im Aktivierungsblattmodul verwendet und zeigt daher ein Flimmern / einen Fehler an, wenn das Blatt aktiviert wird.

user3564681
quelle
0

Sogar wir können eine bestimmte Verbindung aktualisieren und im Gegenzug werden alle damit verbundenen Pivots aktualisiert.

Für diesen Code habe ich einen Slicer aus einer in Excel vorhandenen Tabelle erstellt :

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
Rajiv Singh
quelle
-1

Ich habe den unten aufgeführten Befehl in der jüngeren Vergangenheit verwendet und er scheint gut zu funktionieren.

ActiveWorkbook.RefreshAll

Hoffentlich hilft das.

RBhandal
quelle
6
Es hilft sehr ... aber hast du nicht gesehen, dass es tatsächlich oben geschrieben steht? Wie vor 4 Jahren?! ( stackoverflow.com/a/70976/8418 )
Lipis
-2

Wenn Sie MS Excel 2003 verwenden, gehen Sie zu Ansicht-> Symbolleiste-> Pivot-Tabelle. In dieser Symbolleiste können Sie eine Aktualisierung durchführen, indem Sie auf klicken! dieses Symbol.

Karuna
quelle