it-swarm-eu.dev

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

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?

78
Lipis

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

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 jeden Pivot-Tisch
  • Wählen Sie Tabellenoptionen
  • Aktivieren Sie die Option "Aktualisieren beim Öffnen".
  • Klicken Sie auf die Schaltfläche OK

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

26
Robert Mearns

ActiveWorkbook.RefreshAll aktualisiert alles, nicht nur die Pivot-Tabellen, sondern auch die ODBC Abfragen. Ich habe ein paar VBA-Abfragen, die sich auf Datenverbindungen beziehen und bei Verwendung dieser Option stürzt der Befehl ab, ohne den die Datenverbindungen ausgeführt werden das Detail aus dem VBA geliefert

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

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

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 diese auf einer vorherigen Tabelle basieren soll. 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 Arbeitsbuch 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 also vorstellen, was der Unterschied zwischen dem Aktualisieren jedes Caches in der Arbeitsmappe und dem Aktualisieren jeder Pivot-Tabelle in der Arbeitsmappe sein könnte.

8

In der Symbolleiste der Pivot-Tabelle gibt es die Option "Alle aktualisieren". Das ist genug. Ich muss nichts anderes tun.

Drücken Sie Strg + Alt + F5

5
Prasenjit

Sie haben eine PivotTables - Auflistung in einem VB - Arbeitsblatt object. 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, den Schutz von geschützten Blättern aufzuheben, bevor Sie die PivotTable aktualisieren.
  2. Oft speichern.
  3. Ich werde an mehr denken und zu gegebener Zeit aktualisieren ... :)

Viel Glück!

1
LohanJ

Sogar wir können eine bestimmte Verbindung aktualisieren und im Gegenzug werden alle damit verknüpften 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
0
Rajiv Singh

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 Aktivierungsblatt-Modul verwendet und zeigt daher ein Flackern/einen Fehler an, wenn das Blatt aktiviert wird.

0
user3564681