Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Daten aus Pivot-Tabelle automatisiert kopieren

Daten aus Pivot-Tabelle automatisiert kopieren
Frank
Guten Tag liebe Community,
aus gegebenem Anlass möchte ich mir verschiedene Prozesse vereinfachen bzw. um einiges beschleunigen, daher gehe ich den Weg eines VBA-Makros.
Meine VBA-Kenntnisse sind äußert mangelhaft - ich bitte dies zu berücksichtigen/verzeihen. ;)
Folgendes Makro habe ich erstellt:
ActiveSheet.PivotTables("PivotTabelle").PivotFields("Feld").ClearAllFilters
ActiveSheet.PivotTables("PivotTabelle").PivotFields("Feld").CurrentPage = _
"Variable"
On Error Resume Next
Range("A5:A1000").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Tabellenblatt").Select
Range("A1").Select
ActiveSheet.Paste
Sheets("PivotTabelle").Select 

Dieses Makro bewirkt, das aus der "PivotTabelle" ein Datenpaket ausgelesen wird, dieses kopiert wird und in ein dafür vorgesehenes "Tabellenblatt" eingefügt wird. Dieser Schritt soll an die 500 Mal monatlich durchgeführt werden. Demnach müsste ich immer wieder diesen 11-Zeiler untereinander kopieren. Nun tun sich zwei Fragen auf:
1. Ist es möglich per Schleife oder ähnliches dies um einiges zu kürzen?
2. Ist es möglich "Tabellenblatt" und "Variable" in eine Mappe oder ein Tabellenblatt zu legen (Zelle A1,A2 usw.), sodass sich das Makro immer wieder darauf bezieht?
Nun denn, meine Vorstellungen Schwarz auf Weiß wiederzugeben und vor allem zu verstehen ist nicht leicht, ich hoffe dennoch, das mir jemand diesbezüglich helfen kann.
Gruß
Frank

Anzeige
AW: Daten aus Pivot-Tabelle automatisiert kopieren
25.08.2012 07:51:34
Josef

Hallo Frank,
probier mal.
Sub savePivot()
  Dim rng As Range, rngSettings As Range
  
  On Error Resume Next
  
  With Application
    .EnableEvents = False
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
  End With
  
  With Sheets("Einstellungen") 'Tabellen mit den Tabellennamen in A1:Ax und den Seitennamen in B1:Bx
    Set rngSettings = Range("A1:B" & .Cells(.Rows.Count, 1).End(xlUp).Row)
  End With
  
  For Each rng In rngSettings.Rows
    With Sheets("PivotTabelle")
      With .PivotTables("PivotTabelle").PivotFields("Feld")
        .ClearAllFilters
        .CurrentPage = rng.Cells(1, 2).Text
      End With
      .Range("A5").CurrentRegion.Copy Sheets(rng.Cells(1, 1).Text).Range("A1")
    End With
  Next
  
  On Error GoTo 0
  
  With Application
    .EnableEvents = True
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
  End With
  
  Set rngSettings = Nothing
  Set rng = Nothing
End Sub


Die Einstellungen stehen im Blatt "Einstellungen", die Tabellennamen stehen in A1:Ax und die Seitennamen in B1:Bx.

« Gruß Sepp »

Anzeige
AW: Daten aus Pivot-Tabelle automatisiert kopieren
25.08.2012 13:39:06
Frankl
Guten Tag Sepp,
vorab möchte ich mich für diese grandiose Arbeit bedanken. Jedoch funktioniert das Makro bisher noch nicht so ganz und ich möchte nicht bezweifeln, das es an mir liegt, denn das Makro scheint durchzulaufen, doch fügt es keinen Inhalt ein.
Zur besseren Veranschaulichung habe ich eine Test-Mappe mit eingebundenem Makro hochgeladen.
https://www.herber.de/bbs/user/81576.xlsm

Darüber hinaus stellt sich mir noch eine Frage: Wenn nun mehrere Berichtsfilter ("Feld1", "Feld3") mit in die Auswahl einfließen sollen, wie verhält sich dies auf den Code?
Bis hierhin noch einmal vielen Dank für die Mühen.
Gruß

Anzeige
Datei lässt sich nicht laden! o.T.
25.08.2012 13:45:32
Josef
« Gruß Sepp »

AW: Datei lässt sich nicht laden! o.T.
25.08.2012 14:04:15
Frankl
Bei mir funktioniert alles einwandfrei - merkwürdig.
Nachfolgend befindet sich hier ein Mirror der Datei:
http://www.xup.in/dl,15580470/savePivot_beispiel.xlsm
Gruß

Anzeige
Pivottabelle, Berichtsfelder automatisch setzen
27.08.2012 13:11:07
fcs
Hallo Frankl,
ich hab mir mal das von Sepp vorgeschlagene Makro in deiner Datei vorgenommen.
Im Prinzip funktioniert es.
Es gibt aber ein schwerwiegendes Problem beim Setzen des Bericht-Filters für Feld3.
Dies sind in der Tabelle Zahlen.
Unter VBA funktioniert das Setzen das Filters nicht, egal ob man CurrentPage-Wert als Text oder Zahl setzt.
Scheinbar passieren da im Hintergrund bei der Werteverarbeitung im Makro Typumwandlungen, die einen Fehler verursachen und keine Auswertung zulassen.
Eine Auswertung ist nur möglich, wenn in der Quelltabelle und den Einstellungen die Zahlen in Spalte "Feld3" durch Einfügen eines Hochkommas in Text umgewandelt werden.
Das kann man auch per Makro machen.
Danach hab ich den Pivot-Bericht gelöscht und neu aufgebaut, da Excel im Hintergrund scheinbar bei den Auswahllisten der Berichtsfelder noch irgendwelchen Datenmurks gespeichert hatte.
Wegen besserer Darstellung (Feldnamen) nach dem Kopieren der Pivottabellendaten sollte unter den Optionen die Ansicht auf "Klassisch" umgstellt werden.
Zusätzlich hab ich im Makro Fehlerbehandlungen eingebaut, da man mit
On Error Resume Next
hier nicht mehr vernünftig weiter kommt.
Fehlt für eine angegebene Wertekombination Feld1/Feld3 das Tabellenblatt, dann wird dieses angelegt (Blatt "Muster" wird kopiert und umbenannt).
Eine Frage ist noch offen:
Willst du beim Kopieren die komplette Pivot-Tabelle kopieren oder nur die Werte?
Gruß
Franz
https://www.herber.de/bbs/user/81598.xlsm

Anzeige
AW: Pivottabelle, Berichtsfelder automatisch setzen
27.08.2012 17:24:59
Frankl
Hallo Franz,
unglaublich! Ich bin überwältigt, das sich auch hier wieder jemand die Zeit nimmt und aushilft - vielen vielen Dank!
Zu deiner Frage: Sinnvoll wäre das reine kopieren der Werte, ist jedoch auch anderweitig regelbar. Ich habe mit großer Begeisterung festgestellt, dass im Code dies der Befehl "pvTab.TableRange1.Copy" bewirkt.
Zwei Fragen stellen sich mir allerdings auch noch (diese müssen nicht auch noch mit in ein Makro eingebaut werden, es reicht theoretisch eine Erläuterung bzw. ein Lösungsansatz)
Zum einen: Wie verhält sich der Code, wenn sich die "Tabellen-Namen" nicht im gleichen Dokument befinden, sondern lokal anderweitig gelagert sind?
Zum anderen: Kann ich mehrer Elemente in "Feld3" anwählen (z.B. die Feld3-Werte per Komma trennen)?
Lieben Gruß
Frankl

Anzeige
AW: Pivottabelle, Berichtsfelder automatisch setzen
27.08.2012 19:16:24
fcs
Hallo Frankl,
...... Ich habe mit großer Begeisterung festgestellt, dass im Code dies der Befehl "pvTab.TableRange1.Copy" bewirkt.
Mit "pvTab.TableRange1" wird der zu kopierende Teil/Zellbereich des Pivot-Tabellenberichtes festgelegt.
Die Art des Kopierens wird in der nachfolgenden Zeile festgelegt mit der PasteSpecial-Methode.
wksZiel.Cells(1, 1).PasteSpecial Paste:=xlPasteValues
Zum einen: Wie verhält sich der Code, wenn sich die "Tabellen-Namen" nicht im gleichen Dokument befinden, sondern lokal anderweitig gelagert sind?
Das ist grundsätzlich kein Problem. Es muss dann aber im Code noch eine Workbook-Objektvariable für die Zieldatei eingeführt werden und wksZiel (Tabellen-Objektvariable) muss in Verbindung mit dieser Variablen gesetzt werden.
In der Textdatei findest du den entsprechend angepassten Code.
In der Datei mit dem Makro befinden sich die Tabellen
PivotTabelle, Quelldaten, Einstellungen und Muster
In der Datei "Ziel.xlsx" (Name beliebig festlegbar) die Tabellenblätter in die die Daten kopiert werden sollen.
Man könnte aber auch noch die Tabellen Einstellungen und Muster inklusive der Makros in eine separate Datei auslagern.
Vor der Ausführung des Makros müssen aber alle Dateien geöffnet sein, wobei man auch dies durch Einbau entsprechender Dateiauswahldialoge auch anders steuern kann.
Zum anderen: Kann ich mehrer Elemente in "Feld3" anwählen (z.B. die Feld3-Werte per Komma trennen)?
Ja, Semikolon ist aber das bessere Trennzeichen. Allerdings muss dann der Code für eine Mehrfachauswahl umgeschrieben werden. D.h. nach dem zurücksetzen des Filters müssen in der PivotItem-Liste des Berichtfeldes die nicht gewünschten Einträge in einer Schleife ausgeblendet werden.
In der Textdatei findest du die Hauptprozedur angepasst für Zieldateien in anderer Arbeitsmappe und Mehrfach-Auswahl für das 2. Berichtsfeld (Feld3).
https://www.herber.de/bbs/user/81608.txt
Gruß
Franz

Anzeige
AW: Pivottabelle, Berichtsfelder automatisch setzen
28.08.2012 10:19:49
Frankl
Ein weiteres Mal, kann ich meine Dankbarkeit nur schwer in Worte fassen, an solch ein umfangreiches Makro habe ich nicht einmal ansatzweise gedacht.
Das ist genau das, was ich mir vorgestellt habe. Bloß, kann man das Makro nicht noch ein wenig benutzerfreundlicher machen, in dem man die "Ziel.xlsx" mit im Tabellenblatt "Einstellungen" auslagert (bspw. in Spalte K oder so ähnlich), sprich die "Ziel.xlsx" durch eine Variable ersetzen?
Nun stehe ich jedoch noch vor einem kleinen Problem: Ich habe als Beispiel einen Datensatz der mehrere Monate in aufsteigender Reihenfolge von links nach rechts ausgeben soll. Dies funktioniert soweit auch wenn ALLE Monate vorhanden sind. Wenn jedoch nun ein Monat fehlt, verschiebt sich die Ausgabe und wird inkorrekt. Gibt es eine Möglichkeit das direkt im Makro anzupassen (ohne viel Aufwand versteht sich) oder kann ich das in der Pivot-Tabelle bzw. im Datensatz frühzeitig korrigieren? Andernfalls müsste man per Hand kontrollieren, was auch kein großes Problem darstellt.
Zur Veranschaulichung habe ich ein Bild angehangen:
Userbild
Wenn hier ein Monat rausfällt, müsse dieser ausgeschnitten werden und an die richtige Stelle kopiert werden.
Gruß
Frankl

Anzeige
AW: Pivottabelle, Berichtsfelder automatisch setzen
28.08.2012 13:28:01
fcs
Hallo Frankl,
du traust dich aber auch kein bischen ein wenig im Makro zu experimentieren.
Folgende Zeile muss du anpassen, wenn du den Namen der Zieldatei aus einer Zelle einlesen willst.

Set wbkZiel = Workbooks("Ziel.xlsx")                   'Name ggf. anpassen
'ändern in
Set wbkZiel = Workbooks(wbk.Sheets("Einstellungen").Range("L1").Value) 'Zelle ggf. anpassen

Fehlende Monate in der Auswertung.
1. Im Pivot-Bericht kannst du nichts machen. Was nicht da ist kann der Bericht nicht erfinden.
2. Datequellen anpassen - mit Dummy-Daten auffüllen.
Sehr mühselig - du müsstest ja erst einmal ermitteln, welche Daten-Kombinationen fehlen.
3. Zielblätter anpassen.
Wenn deine Zeile1 in den Zieltabellenblättern immer den identischen Aufbau und Werte hat, wie in der Grafik angezeigt, dann kann man das per Makro korrigieren.
Sub fehlende_Monate_einfuegen()
Dim wks As Worksheet
Dim lngSpalte As Long, iMonat As Integer
Dim strZeile1 As String
Dim strFeld1 As String
Dim strFeld2 As String
Set wks = ActiveSheet
With wks
'Summenfeld-Bezeichnungen in Zeile2 einlesen
strFeld1 = .Cells(2, 2).Text
strFeld2 = .Cells(2, 3).Text
'fehlende Spalten einfügen
For lngSpalte = 2 To 24 Step 2
iMonat = iMonat + 1
Select Case iMonat
Case 1: strZeile1 = "Werte Jan."
Case 2: strZeile1 = "Werte Feb."
Case 3: strZeile1 = "Werte Mar."
Case 4: strZeile1 = "Werte Apr."
Case 5: strZeile1 = "Werte Mai."
Case 6: strZeile1 = "Werte Jun."
Case 7: strZeile1 = "Werte Jul."
Case 8: strZeile1 = "Werte Aug."
Case 9: strZeile1 = "Werte Sep."
Case 10: strZeile1 = "Werte Okt."
Case 11: strZeile1 = "Werte Nov."
Case 12: strZeile1 = "Werte Dez."
End Select
If .Cells(1, lngSpalte).Value  strZeile1 Then
.Range(.Columns(lngSpalte), .Columns(lngSpalte + 1)).Insert
.Cells(1, lngSpalte).Value = strZeile1
.Cells(2, lngSpalte).Value = strFeld1
.Cells(2, lngSpalte + 1).Value = strFeld2
End If
Next
End With
End Sub
So ein Makro könnte man natürlich dann auch in die Hauptprozedur einbinden.
Gruß
Franz

Anzeige
AW: Pivottabelle, Berichtsfelder automatisch setzen
28.08.2012 15:49:59
Frankl
Großartig! Dieses Makro in all seiner Vielfalt wird mir in Zukunft viele Stunden Arbeit pro Monat ersparen. Gerne bin ich bereit dies zu honorieren.
Achja, kann ich das letzte kleine zurzeit extern ausgelagerte Makro per "call"-Befehl in die Hauptprozedur einbinden?
Meine bisherige Ansätze sind leider in die Hose gegangen ;)

Anzeige
AW: Pivottabelle, Berichtsfelder automatisch setzen
28.08.2012 17:14:21
fcs
Hallo Frankl,
die externe Sub muss du am Anfang wie folgt anpassen, so dass das zu überarbeitende Zielblatt als Parameter übergeben wird.
Sub fehlende_Monate_einfuegen(wks As Worksheet)
Dim lngSpalte As Long, iMonat As Integer
Dim strZeile1 As String
Dim strFeld1 As String
Dim strFeld2 As String
With wks
'Summenfeld-Bezeichnungen in Zeile2 einlesen

In der Hauptprozedur fügst du den Aufruf der Prozedur in folgender Position ein.
    Application.CutCopyMode = False
Call fehlende_Monate_einfuegen(wks:=wksZiel)     'Neue Zeile für Subaufruf
NextEinstellung:
Next

Gerne bin ich bereit dies zu honorieren.
Ich bin empfänglich für Bargeld, Süßwaren und nützliche! Werbegeschenke"
Du kannst mich über die im Link angezeigte E-Mail-Adresse kontaktieren. https://www.herber.de/cgi-bin/profile/call_profile.pl?user=fcs
Gruß
Franz
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Automatisiertes Kopieren von Daten aus Pivot-Tabellen in Excel


Schritt-für-Schritt-Anleitung

  1. VBA-Makro erstellen: Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen. Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  2. Code eingeben: Füge folgenden Code in das Modul ein, um Daten aus einer Pivot-Tabelle zu kopieren:

    Sub savePivot()
       Dim rng As Range, rngSettings As Range
       On Error Resume Next
    
       With Application
           .EnableEvents = False
           .ScreenUpdating = False
           .Calculation = xlCalculationManual
       End With
    
       With Sheets("Einstellungen") ' Tabellenblatt für Einstellungen
           Set rngSettings = Range("A1:B" & .Cells(.Rows.Count, 1).End(xlUp).Row)
       End With
    
       For Each rng In rngSettings.Rows
           With Sheets("PivotTabelle")
               With .PivotTables("PivotTabelle").PivotFields("Feld")
                   .ClearAllFilters
                   .CurrentPage = rng.Cells(1, 2).Text
               End With
               .Range("A5").CurrentRegion.Copy Sheets(rng.Cells(1, 1).Text).Range("A1")
           End With
       Next
    
       On Error GoTo 0
    
       With Application
           .EnableEvents = True
           .ScreenUpdating = True
           .Calculation = xlCalculationAutomatic
       End With
    End Sub
  3. Einstellungen anpassen: Stelle sicher, dass die richtigen Tabellenblätter und Pivot-Tabellen im Code angegeben sind.

  4. Makro ausführen: Schließe den VBA-Editor und führe das Makro über ALT + F8 aus, indem du savePivot auswählst.


Häufige Fehler und Lösungen

  • Fehler beim Kopieren: Wenn das Makro durchläuft, aber keine Daten eingefügt werden, überprüfe, ob die Pivot-Tabelle korrekt benannt ist und ob die Zellen in der Pivot-Tabelle die erwarteten Werte enthalten.

  • Feldfilter funktioniert nicht: Achte darauf, dass die Werte in den Berichtsfeldern als Text gesetzt sind. Manchmal ist eine Typumwandlung nötig, um die Filter korrekt anzuwenden.

  • Tabellenblatt nicht gefunden: Stelle sicher, dass die Ziel-Tabellenblätter im Code existieren oder erstelle sie dynamisch, wenn sie nicht vorhanden sind.


Alternative Methoden

  1. Daten manuell kopieren: Du kannst die Pivot-Tabelle manuell kopieren, indem du die gewünschten Zellen markierst, mit CTRL + C kopierst und in das Ziel-Tabellenblatt mit CTRL + V einfügst.

  2. Pivot-Tabelle duplizieren: Wenn du eine Pivot-Tabelle für verschiedene Szenarien benötigst, kannst du die gesamte Pivot-Tabelle duplizieren, indem du sie kopierst und in ein neues Arbeitsblatt einfügst.


Praktische Beispiele

  • Pivot-Tabelle in andere Datei kopieren: Um die Pivot-Tabelle in eine andere Datei zu kopieren, öffne die Ziel-Datei und passe den Code entsprechend an, sodass die Zieldatei referenziert wird.

  • Werte aus Pivot-Tabelle übernehmen: Um nur die Werte und nicht die Formeln zu übernehmen, verwende die PasteSpecial-Methode im Code.

    .Range("A5").CurrentRegion.Copy
    Sheets(rng.Cells(1, 1).Text).Range("A1").PasteSpecial Paste:=xlPasteValues

Tipps für Profis

  • Fehlerbehandlung einfügen: Integriere Fehlerbehandlungen wie On Error Resume Next um sicherzustellen, dass das Makro auch bei unerwarteten Eingaben weiterläuft.

  • Namen dynamisch ändern: Wenn du die Namen der Ziel-Tabellenblätter in einer Zelle speicherst, kannst du diese dynamisch im Code verwenden, um die Wartung zu erleichtern.


FAQ: Häufige Fragen

1. Wie kann ich mehrere Berichtsfelder in meiner Pivot-Tabelle verwenden? Du kannst mehrere Berichtsfelder im VBA-Code hinzufügen, indem du für jedes Feld einen Filter anwendest.

2. Wie kann ich sicherstellen, dass die Pivot-Tabelle immer die neuesten Daten enthält? Füge am Anfang deines Makros den Befehl .PivotTable.RefreshTable hinzu, um die Daten vor dem Kopieren zu aktualisieren.

3. Kann ich die Pivot-Tabelle auch in eine andere Excel-Datei kopieren? Ja, du kannst die Ziel-Datei im Code referenzieren. Stelle sicher, dass die Datei geöffnet ist, wenn du das Makro ausführst.

4. Was tun, wenn ich eine leere Zeile in den kopierten Daten habe? Überprüfe die Daten in der Pivot-Tabelle und stelle sicher, dass keine Filter aktiv sind, die leere Zeilen erzeugen könnten.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige