Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Erstellung Pivottabelle per Makro

Erstellung Pivottabelle per Makro
31.03.2015 15:04:30
Carlu
Hallo zusammen,
ich möchte gerne per Makro eine Pivottabelle in Excel 2010 erzeugen. Dabei hatte ich ein Makro aufgezeichnet und auf dieser Grundlage bisher folgenden Code hinterlegt:
Columns("A:AW").Select
Sheets.Add
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"Materialliste!R1C1:R1048576C49", Version:=xlPivotTableVersion14). _
CreatePivotTable TableDestination:="Tabelle1!R3C1", TableName:= _
"PivotTable1", DefaultVersion:=xlPivotTableVersion14
Sheets("Tabelle1").Select
Cells(3, 1).Select
Die Rohdaten befinden sich als Auflistung in dem Tabellenblatt Materialliste, die Pivottabelle wird in ein neues Tabellenblatt namens Tabelle1 hinterlegt als PivotTable1. Wenn das Makro mit neuer Datei, die die Rohdaten enthält, ausgeführt wird, gibt Excel nun folgenden Fehler raus:
Laufzeitfehler '1004':
Bezug ist ungültig.
Ich finde ehrlich gesagt seit 3 Stunden keinen Fehler. Wenn ich die Pivottabelle dann wieder manuell erzeuge und die Makroaufzeichnung mitlaufen lasse, wird genau dieser obige Code von Excel angegeben! Mittlerweile bin ich hier völlig ratlos woran es liegen könnte! Eine Hilfestellung wäre großartig! Vielen Dank schon mal vorab!
Grüße
Carlu

Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Erstellung Pivottabelle per Makro
31.03.2015 16:34:17
fcs
Hallo Carlu,
Pivotberichte haben unter VBA so ihre Tücken.
Soweit möglich sollte man man mit Objektvariablen arbeiten und diesen dann jeweils die passenden Objekte zuweisen. Im cufgezeichneten Code muss man dann die aufgezeichneten Namen und Zellbereiche durch die aus den Objektvariablen ermittelten Werte ersetzen.
Das betrifft hier dann die Tabellennamen, den pivot-Tabellennamen und ggf. den Datenbereich.
Nachfolgend ein entsprechend modifiziertes Makro.
Bis zur Zeile "Exit Sub" generiert es den leeren Pivot-Bericht.
Danach hab ich Beispiele angefügt, wie man dann die Felder und Formatierungen einbauen kann.
Gruß
Franz
Sub MakePivot()
Dim wkb As Workbook
Dim wksData As Worksheet, rngData As Range
Dim wksPivot As Worksheet, pvTab As PivotTable, pvField As PivotField
Dim strFeld As String
Set wkb = ActiveWorkbook
Set wksData = wkb.Worksheets("Materialliste") 'Tabelle mit Datenbasis
wkb.Worksheets.Add after:=wksData
Set wksPivot = ActiveSheet
With wksData
'Datenbereich für Pivotbericht definieren _
- ist ggf. günstiger als komplette Spalten zu nehmen
Set rngData = .Range(.Cells(1, 1), _
.Cells(.UsedRange.Row + .UsedRange.Rows.Count - 1, 49))
wkb.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:="'" & .Name & "'!" & rngData.Address(True, True, xlR1C1), _
Version:=xlPivotTableVersion14).CreatePivotTable _
Tabledestination:="'" & wksPivot.Name & "'!R3C1", _
TableName:="PivotTab1", _
Defaultversion:=xlPivotTableVersion14
End With
wksPivot.Activate
Range("A3").Select
Exit Sub
'Beispiele, wie man die Inhalte des Pivotberichtes konfigurieren kann
'Pivottable Objektvariable zuordnen
Set pvTab = wksPivot.PivotTables(1)
'Pivottabelle konfigurieren
With pvTab
'Pivotbericht-Berichtslayout in Tabellendarstelltung anzeigen
.RowAxisLayout Rowlayout:=xlTabularRow
'Felder im Datenbereich definieren
strFeld = "Summe Zahlenwert" 'Beschriftung/Name des Datenfeldes
.AddDataField .PivotFields("Zahlenwert"), strFeld, xlSum
With .PivotFields(strFeld)
.NumberFormat = "#,##0.00"
End With
strFeld = "Summe Zeitwert"
.AddDataField .PivotFields("Zeitwert"), strFeld, xlSum
With .PivotFields(strFeld)
.NumberFormat = "[h]:mm:ss"
End With
strFeld = "Anzahl Mat_Nr"
.AddDataField .PivotFields("Mat_Nr"), strFeld, xlCount
With .PivotFields(strFeld)
.NumberFormat = "#,##0"
End With
' Zeilenfelder definieren
With .PivotFields("Mat_Nr")
.Orientation = xlRowField
.Position = 1
End With
With .PivotFields("Datum")
.Orientation = xlRowField
.Position = 2
'keine Teilergebnisse für Feld anzeigen
.Subtotals = Array(False, False, False, False, False, _
False, False, False, False, False, False, False)
End With
With .PivotFields("Text01")
.Orientation = xlRowField
.Position = 3
End With
'Datenfelder bei mehreren Datenfeldern im Zeilenbereich anzeigen
With .DataPivotField
.Orientation = xlRowField
.Position = 4
End With
'Spaltenfelder definieren
With .PivotFields("Text02")
.Orientation = xlColumnField
.Position = 1
End With
End With
End Sub

Anzeige
AW: Erstellung Pivottabelle per Makro
01.04.2015 10:41:58
Carlu
Hallo Franz,
zunächst sehr herzlichen Dank für Deine Erläuterung und Deine sehr ausführliche Ausarbeitung!!!
Ich habe den Code heute Morgen direkt eingebaut zunächst bis zu Deinem genannten Exit Sub und parallel das Lokalfenster mitlaufen lassen, um die Werte der Objektvariablen ansehen zu können.
Dabei wird auch für rngData der korrekte Wert mit u.a. der 153 als letzte Datenzeile im Tabellenblatt Materialliste angezeigt.
Allerdings kommt an quasi gleicher Stelle (s. folgend) wie vorher die gleiche Fehlermeldung:
wkb.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:="'" & .Name & "'!" & rngData.Address(True, True, xlR1C1), _
Version:=xlPivotTableVersion14).CreatePivotTable _
Tabledestination:="'" & wksPivot.Name & "'!R3C1", _
TableName:="PivotTab1", _
Defaultversion:=xlPivotTableVersion14
Muss ich an dieser Stelle noch etwas ergänzen bzw. habe ich hier etwas vergessen abzuändern?
Um eine erneute Hilfe wäre ich natürlich erneut sehr dankbar!!!
Grüße
Carlu

Anzeige
AW: Erstellung Pivottabelle per Makro
01.04.2015 13:12:34
fcs
Hallo Carlu,
ich hab keine gute Idee, wo da bei dir der Wurm drin ist.
Ich hatte mir eine kleine Testtabelle mit 49 Spalten gebastelt und da funktioniert es reibungslos.
Ich arbeite mit der Excelversion Office Professional 2010/Excel 2010 (Version: 14.0.7128.5000 (32-Bit)) und VBA 7.0 (Version 1627, Forms3: 14.0.6009.100).
Ich hab noch ein paar Dinge probiert:
1. Parameter für die Adresse der Datenquelle xlR1C1 --&gt xlA1
Excel war da in der Vergangenheit pingelig und der Rekorder unsauber.
      wkb.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:="'" & .Name & "'!" & rngData.Address(True, True, xlA1), _
Version:=xlPivotTableVersion14).CreatePivotTable _
Tabledestination:="'" & wksPivot.Name & "'!R3C1", _
TableName:="PivotTab1", _
Defaultversion:=xlPivotTableVersion14

2. Parameter für die Version von PivotCache und PivotTabelle weglassen
      wkb.PivotCaches.Create(SourceType:=xlDatabase, _
SourceData:="'" & .Name & "'!" & rngData.Address(True, True, xlR1C1)) _
.CreatePivotTable Tabledestination:="'" & wksPivot.Name & "'!R3C1", _
TableName:="PivotTab1"

Mit beiden Änderungen funktionierte das Makro bei mir.
In der Datenquelle
- dürfen in der Titelzeile keine leeren Zellen vorkommen
- dürfen in der Titelzeile keine verbundenen Zellen vorkommen
- sollte man verbundene Zellen im Datenbereich vermeiden, sie können Probleme bei der Auswertung machen.
Das hätte aber auch schon beim manuellen Erstellen des Pivotberichts als Fehler angezeigt werden müssen.
Hier bin ich dann ohne Beispieltabelle mit meinem Excel-Latei am Ende.
Gruß
Franz
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Pivottabelle per Makro in Excel 2010 erstellen


Schritt-für-Schritt-Anleitung

Um eine Pivottabelle in Excel 2010 per Makro zu erstellen, befolge diese Schritte:

  1. Excel öffnen und die Datei mit den Rohdaten (z.B. Materialliste) laden.
  2. VBA-Editor öffnen:
    • Drücke ALT + F11, um den VBA-Editor zu starten.
  3. Neues Modul einfügen:
    • Klicke mit der rechten Maustaste auf „VBAProject (DeineDatei.xlsx)“ und wähle „Einfügen“ > „Modul“.
  4. Makro schreiben: Füge den folgenden Code in das Modul ein:
Sub MakePivot()
    Dim wkb As Workbook
    Dim wksData As Worksheet, rngData As Range
    Dim wksPivot As Worksheet, pvTab As PivotTable
    Set wkb = ActiveWorkbook
    Set wksData = wkb.Worksheets("Materialliste") ' Tabelle mit Datenbasis
    wkb.Worksheets.Add after:=wksData
    Set wksPivot = ActiveSheet

    With wksData
        Set rngData = .Range(.Cells(1, 1), .Cells(.UsedRange.Rows.Count, 49))
        wkb.PivotCaches.Create(SourceType:=xlDatabase, _
        SourceData:="'" & .Name & "'!" & rngData.Address(True, True, xlR1C1)).CreatePivotTable _
        TableDestination:="'" & wksPivot.Name & "'!R3C1", _
        TableName:="PivotTable1"
    End With

    wksPivot.Activate
    Range("A3").Select
End Sub
  1. Makro ausführen:
    • Schließe den VBA-Editor und drücke ALT + F8, wähle MakePivot und klicke auf „Ausführen“.

Häufige Fehler und Lösungen

  1. Laufzeitfehler '1004': Bezug ist ungültig:

    • Überprüfe, ob der Datenbereich in der Materialliste korrekt ist und keine leeren oder verbundenen Zellen enthält.
  2. Falsche Version für PivotCache:

    • Stelle sicher, dass die Version des PivotCaches und der Pivottabelle korrekt angegeben wird. Wenn du die Version weglässt, könnte das Problem behoben werden.
  3. Falscher Zellbezug:

    • Der Zellbezug sollte in der richtigen Notation (xlR1C1 oder xlA1) angegeben werden. Teste beide Varianten.

Alternative Methoden

Es gibt verschiedene Möglichkeiten, eine Pivottabelle zu erstellen:

  • Manuelles Erstellen: Gehe auf „Einfügen“ > „Pivottabelle“ und wähle den Datenbereich manuell aus.
  • Makro aufzeichnen: Nutze die Makroaufzeichnung, um Deine Schritte aufzuzeichnen und anschließend den VBA-Code zu analysieren.
  • Power Query: Verwende Power Query, um Daten zu transformieren und dann eine Pivottabelle zu erstellen.

Praktische Beispiele

Ein einfaches Beispiel für die Erstellung einer Pivottabelle könnte so aussehen:

Sub CreateSimplePivot()
    Dim ws As Worksheet
    Dim pc As PivotCache
    Dim pt As PivotTable
    Dim rng As Range

    Set ws = ThisWorkbook.Worksheets("Materialliste")
    Set rng = ws.Range("A1:D100") ' Beispiel-Datenbereich

    Set pc = ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rng)
    Set pt = pc.CreatePivotTable(TableDestination:=ThisWorkbook.Sheets.Add().Name, TableName:="PivotTable")

    ' Felder hinzufügen
    With pt
        .PivotFields("Produkt").Orientation = xlRowField
        .PivotFields("Verkäufe").Orientation = xlDataField
    End With
End Sub

Tipps für Profis

  • Verwende Objektvariablen, um die Lesbarkeit und Wartbarkeit des Codes zu erhöhen.
  • Teste den Code in einer separaten Datei, um Fehler zu identifizieren, bevor du ihn auf die echten Daten anwendest.
  • Halte deinen Datenbereich dynamisch, indem du UsedRange oder ListObjects verwendest, um den Bereich automatisch zu erfassen.

FAQ: Häufige Fragen

1. Wie kann ich das Makro anpassen?
Du kannst die Variablen im Makro ändern, um andere Datenbereiche oder Tabellennamen zu verwenden. Achte darauf, die richtigen Zellreferenzen zu verwenden.

2. Was mache ich, wenn die Pivottabelle nicht aktualisiert wird?
Überprüfe den Datenbereich und stelle sicher, dass alle Daten korrekt formatiert sind. Du kannst die Pivottabelle auch manuell aktualisieren, indem du mit der rechten Maustaste darauf klickst und „Aktualisieren“ wählst.

3. Kann ich das Makro in einer anderen Excel-Version verwenden?
Der Code wurde für Excel 2010 optimiert, sollte aber auch in neueren Versionen funktionieren. Teste den Code vorher in deiner Version, um sicherzustellen, dass alles wie gewünscht funktioniert.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige