VBA zum aktualisieren von Pivot
#1
Hallo,

ich habe hier ein Worksheet mit einer Tabelle auf der sehr viele Pivottabellen auf unterschiedlichen Arbeitsblättern beruhen.

Wenn ich Änderungen in der Tabelle vornehme muss ich alle Pivottabellen manuell aktualisieren.

Gibt es eine Möglichkeit über ein VBA alle Pivottabellen gleichzeitig zu aktualisieren?

Am besten bei jedem speichern und neu öffnen der Datei.

Excel 2010
Top
#2
Moin!
Schaue Dir mal die Workbook.RefreshAll-Methode an.
https://msdn.microsoft.com/de-de/vba/exc...thod-excel

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#3
Hi,

ich mache es immer so:

Hinter jedes zu aktualisierende Tabellenblatt:
Code:
Option Explicit

Private Sub Worksheet_Activate()
   Call Pivot_aktualisieren
End Sub

in ein allgemeines Modul:
Code:
Option Explicit

Sub Pivot_aktualisieren()
   '
   ' Pivot_aktualisieren: alle Pivot einer einzelnen Tabelle
   ' (c) 21.09.2011, Ralf
   ' Aufgerufen mit Worksheet_Activate() im betreffenden Tabellenblatt
   '
   Dim pt As PivotTable
   '

      'Alle Pivot-Tabellen eines Tabellenblattes durchlaufen
      For Each pt In ActiveSheet.PivotTables
        
         'Den PivotCache der PT aktualisieren
         pt.PivotCache.Refresh
      Next pt
  
'   Dim i As Integer
'   Dim j As Integer
'   j = ActiveSheet.PivotTables.Count           ' die Nummer der Pivot pro Sheet muß fortlaufend sein ohne Lücken
'
'   For i = 1 To j
'      ActiveSheet.PivotTables("PivotTable" & i).PivotCache.Refresh
'   Next i
  
End Sub

Sub AllePivotTabellenaktualisieren()            ' (c) Thomas Ramel
   'Variablen deklarieren
   Dim ws                        As Worksheet
   Dim pt                        As PivotTable
  
   'Alle Tabellenblätter der Mappe durchlaufen
   For Each ws In ActiveWorkbook.Worksheets
      
      'Alle Pivot-Tabellen eines Tabellenblattes durchlaufen
      For Each pt In ws.PivotTables
        
         'Den PivotCache der PT aktualisieren
         pt.PivotCache.Refresh
      Next pt
   Next ws
End Sub

Public Sub PT_SetSourceNames()
'Setzt überschriebene Namen von Feld-Inhalten wieder
'auf den ursprünglichen Wert zurück
'zuvor ev. die Sub DeleteOldPivotItemsWB() laufen lassen
Dim ws                        As Worksheet
Dim pt                        As PivotTable
Dim pF                        As PivotField
Dim pI                        As PivotItem

    For Each ws In ActiveWorkbook.Worksheets
        For Each pt In ws.PivotTables
            pt.PivotCache.Refresh
            For Each pF In pt.PivotFields
                For Each pI In pF.PivotItems
                    pI.Name = pI.SourceName
                Next pI
            Next pF
        Next pt
    Next ws
End Sub
Top
#4
Problem ist, dass die Tabelle monatlich gegen eine neue getauscht / aktualisiert wird.

Das Worksheet mit der Tabelle geht also evtl. verloren.

Deshalb sollte die Aktualisierung nicht an das Tabellenblatt gebunden sein.
Top
#5
Hallo,

Zitat:Problem ist, dass die Tabelle monatlich gegen eine neue getauscht / aktualisiert wird.

Das Worksheet mit der Tabelle geht also evtl. verloren.

Deshalb sollte die Aktualisierung nicht an das Tabellenblatt gebunden sein.


wenn es zu umständlich ist, nach dem Tausch den 3-Zeiler in die neue Tabelle zu kopieren, könntest du auch das per VBA eintragen lassen.

siehe dazu den uralten Beitrag bei Herber
http://www.herber.de/forum/archiv/792to7...uegen.html
Top
#6
Was spricht gegen mein .RefreshAll im Workbook_Open oder _BeforeSave?
@Wastl:
Da dies extrem in die Sicherheit eingreift,
(Zugriff aufs VBA-Projektobjektmodell vertrauen im Trust-Center)
lehne ich so etwas grundsätzlich ab!
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#7
Ich habe jetzt folgendes:

Code:
Option Explicit

Private Sub Aktualisieren()

   Call Pivot_aktualisieren

End Sub
Aber das muss ich ja irgendwie auch anstoßen.
Ich möchte, dass die Funktion automatisch beim öffnen und speichern der Datei aufgerufen wird ohne dass man eine Tastenkombination oder einen Button drücken muss.
Top
#8
Hi,

dann schreibe halt diesen Befehl
Code:
Call AllePivotTabellenaktualisieren()
in den Workbook_Open()- und Workbook_BeforeSave()-Event von "DieseArbeitsmappe", so wie ich es schon analog für den anderen Code im Worksheet_Activate-Event vorgeschlagen hatte.
Ein bißchen Experimentierfreude hätte ich schon erwartet.
Top
#9
Fangen wir mal so an:

Ich verstehe, dass ich eine Methode benötige die die Pivottabellen (oder alles) aktualisiert.
Diese Methode wäre wohl Call AllePivotTabellenaktualisieren()

Ich verstehe aber nicht, was der workbook opener ist. Ist das eine eigene VBA? Oder muss ich hier etwas zusätzlich aktivieren?
Wo kann ich diese Events erstellen / aktivieren?
Top
#10
Hi Max

Gehe im VBA-Editor auf 'DieseArbeitsmappe mit Doppelklick

du siehst meist ein leeres Fenster, in das oben 2 auswahlboxen eingefügt sind.
Stelle die linke auswahl mal auf Workbook und gugg mal was in der rechten alles drin steht

Hilft das weiter?
[-] Folgende(r) 1 Nutzer sagt Danke an Wastl für diesen Beitrag:
  • StrammerMax
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste