Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1276to1280
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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 »

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 ;)

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

97 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige