Microsoft Excel

Herbers Excel/VBA-Archiv

Pivot per VBA Starten.

Betrifft: Pivot per VBA Starten. von: Renner
Geschrieben am: 16.11.2014 19:04:21

Hallo an alle,
ich hebe ein Problem eine Pivot Tabelle per VBA starten zu lassen. Ich habe mir eine Video angeschaut, https://www.youtube.com/watch?v=XYrUxpzFBBI
und einfach nachgemacht. An Sich sind die Befehle nicht schwer, doch bei mir klappt es einfach nicht. Bekomme Laufzeitfehler, beim Tabelle anlegen. :( Ich hatte zufällig das Problem gelöst, doch dann ist mir der Excel abgestürzt :( Wie das immer so ist, komme ich nicht mehr auf die Lösung. Habe alles schon rumprobiert. Vielleicht habt ihr eine Idee.

Private Sub cb_pivot_Click()

'DEKLARIEREN DER OBJEKTE
'Deklariereneiner Pivottabelle
Dim pt As PivotTable
' Deklarieren des Zwischenspeicher (Buffer) für die Wertebeireiche
Dim cashe As PivotCache
'Deklarieren der Felder in der Pivottabelle Spalten
Dim pf As PivotField
'Deklariern der Kategorien der Felder (Werte der Spalten)
Dim pi As PivotItem

'ZIELARBEITSBLATT
'Pivot Arbeitsblatt auswehlen
Sheets("Pivot").Select
 ' Bereits bestehende Pivot-Tabellen werden gelöscht
    With ActiveSheet
        For Each pt In .PivotTables
            pt.TableRange2.Delete
        Next pt
    End With
Sheets("Auftrag").Select
'dynamischer Datenbereich
   Dim lzp As Integer 'lz=letzteZeile
  'letzte Zeile bestimmen
      With Sheets("Auftrag")
    'letzte Zeile bestimmen
         lzp = Auftrag.Cells(Rows.Count, "A").End(xlUp).Row '
Set cashe = ActiveWorkbook.PivotCaches.Create(xlDatabase, Range(Cells(2, 1), Cells(lzp, 19)))
End With
' Neue Pivottabelle mit dynamischer Zeilenanzahl erstellen
    Sheets("Pivot").Select
    'Pivottabelle auf Tabellenblatt erstellen
    Set pt = ActiveSheet.PivotTables.Add(cashe, Range("A1"), "MeinePivottabelle")
End Sub

Vielen Dank
Dima

  

Betrifft: AW: Pivot per VBA Starten. von: fcs
Geschrieben am: 16.11.2014 20:18:32

Hallo Dima,

die Ursache für den Fehler ist entweder die Zeile

         lzp = Auftrag.Cells(Rows.Count, "A").End(xlUp).Row '
weil es kein Tabelle mit dem Code-Namen Auftrag gibt,
oder der Speicherort des Makros unter einem Tabellenblatt-Modul. In diesem Fall können Zeilen mit Range oder Cells auf das falsche Tabellenblatt verweisen, weil bei Code unter einem Tabellenblatt Cells und Range immer auf dieses Blatt verweisen und nicht auf das gerade aktive Tabellenblatt, wie dies in einem allgemeinen der Fall ist. Wenn der Code unter dem Blatt "Auftrag" steht, dann gibt es Probleme in Zeile
    Set pt = ActiveSheet.PivotTables.Add(cashe, Range("A1"), "MeinePivottabelle")
da Range("A1") auf das Blatt "Auftrag" verweist und die Pivottab im aktiven Blatt "Pivot" eingefügt werden soll.
Die Reparatur wäre:
    With Sheets("Pivot")
      .Select
    'Pivottabelle auf Tabellenblatt erstellen
      Set pt = .PivotTables.Add(cashe, .Range("A1"), "MeinePivottabelle")
    End With
Du musst hier also darauf achten,dass komplett auf die anderen Tabellenblätter verwiesen. Dazu ist es hilfreich auch für die Tabellenblätter Objektvariablen zu verwenden.

Dann sieht dein Makro wie folgt aus.

Gruß
Franz
Private Sub cb_pivot_Click()

'DEKLARIEREN DER OBJEKTE
'Tabellenblatt mit den Quelldaten der Pivottabelle
Dim wksData As Worksheet
'Tabellenblatt in dem Pivotbericht erstellt werden soll
Dim wksPivot As Worksheet
'Deklariereneiner Pivottabelle
Dim pt As PivotTable
' Deklarieren des Zwischenspeicher (Buffer) für die Wertebeireiche
Dim cashe As PivotCache
'Deklarieren der Felder in der Pivottabelle Spalten
Dim pf As PivotField
'Deklariern der Kategorien der Felder (Werte der Spalten)
Dim pi As PivotItem

'Quelltabellenblatt
  Set wksData = Sheets("Auftrag")
'ZIELARBEITSBLATT
  Set wksPivot = Sheets("Pivot")
  
'Pivot Arbeitsblatt auswählen
  wksPivot.Select
' Bereits bestehende Pivot-Tabellen werden gelöscht
    With wksPivot
        For Each pt In .PivotTables
            pt.TableRange2.Delete
        Next pt
    End With
  wksData.Select
'dynamischer Datenbereich
  Dim lzp As Integer 'lz=letzteZeile
  'letzte Zeile bestimmen
  With wksData
    'letzte Zeile bestimmen
    lzp = .Cells(.Rows.Count, "A").End(xlUp).Row '
    Set cashe = ActiveWorkbook.PivotCaches.Create(xlDatabase, .Range(.Cells(2, 1), .Cells(lzp,  _
19)))
  End With
' Neue Pivottabelle mit dynamischer Zeilenanzahl erstellen
    With wksPivot
        .Select
        'Pivottabelle auf Tabellenblatt erstellen
        Set pt = .PivotTables.Add(cashe, .Range("A1"), "MeinePivottabelle")
    End With
End Sub