2016-07-11 3 views
0

Ich habe eine Arbeitsmappe mit 70 plus Blatt. Jedes Blatt wird erstellt und benannt, und ich lege entsprechende Daten mithilfe von Filtern in das Arbeitsblatt ein. Der Datenbereich kann sich Woche für Woche ändern. Ich habe ein vba-Programm geschrieben, um alles zu tun, aber Pivot-Tabellen in jedem Arbeitsblatt mit den eindeutigen gefilterten Daten zu erstellen. Meine Frage ist, wie erstelle ich eine Pivot-Tabelle in jedem Arbeitsblatt innerhalb der for-Schleife? Ich habe abgezogen, dass das Problem in meinem Code unten der Quelldatenabschnitt im Code ist. Der Datenbereich für jede Registerkarte ist unterschiedlich (die Spalten bleiben gleich, die Anzahl der Zeilen ist jedoch unterschiedlich). Muss ich die Pivot-Tabellen auch umbenennen, wenn sie innerhalb der Schleife durchlaufen?Erstellen Sie Pivot-Tabellen innerhalb einer for-Schleife vba

Sub Ptloop() 

dim x as long 
dim SorceRange as Range 
dim k as long 
'start of first generated work sheet 
x=4 
'number of worksheets 
k=75 


Set SourceRange = Range("A4", ActiveCell.End(xlDown).End(xlToRight)) 

For Each Worksheet In ActiveWorkbook.Sheets 
If x <= k Then 

ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _ 
    Sheets(x).SourceRange, Version:=xlPivotTableVersion14). _ 
    CreatePivotTable TableDestination:=Sheets(x).Cells(4, 21), TableName:="PivotTable3", DefaultVersion _ 
    :=xlPivotTableVersion14 
x = x + 1 
Else 
Exit For 
End If 
Next Worksheet 
End Sub 
+0

Sie müssen Dynamic Range verwenden. Weitere Informationen finden Sie in diesem Artikel [Erstellen dynamischer Bereiche mit einem Makro] (http://www.contextures.com/xlNames03.html#Pivot) – skkakkar

+0

Bringen Sie das 'SourceRange'-Set in die' For-Schleife' und qualifizieren Sie es für das 'ws' . So 'Set SourceRange = Worksheet.Range (" A4 ", Worksheet.Range (" A4 ") l.End (xlDown) .End (xlToRight))'. Sie können jeden PT mit 'PivoTable & x' benennen, wenn Sie möchten, dass sie anders sind. Es ist jedoch nicht notwendig, wenn sie alle auf verschiedenen Blättern sind. –

Antwort

0

Es gibt nur wenige Dinge, die den Code aus werfen kann, oder das Potenzial haben, auch.

Bitte beachten Sie den Refaktorcode unten für ein saubereres, einfacher zu wartendes Programm.

Option Explicit 'this forces variable declaration and is a "must use" programming tool 

Sub Ptloop() 

Dim ws as Worksheet 'make sure to qualify the worksheet to a variable 
         'using `Worksheet` could be problematic since its a reserved word in Excel for the `Worksheet` object itself 

Dim SourceRange as Range 

For Each ws In ThisWorkbook.Worksheets 'if you have a chart or macro sheet in your workbook `Sheets` will produce an error, if you only need actual Worksheets, use that directly 

    If ws.Index > 3 Then 'use the index property, you only want worksheets after sheet 3 

     With ws 'work directly with the object and assignment parentage to all objects 

      'set the range inside the loop to capture the data for that specific sheet 
      Set SourceRange = .Range("A4", .Range("A4").End(xlDown).End(xlToRight)) 

      'ActiveWorkbook may or may not refer to the workbook you really want to work with .. ThisWorkbook refers to the book running the code 
      ThisWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=SourceRange, Version:=xlPivotTableVersion14). _ 
       CreatePivotTable TableDestination:=.Cells(4, 21), TableName:="PivotTable" & ws.Index, DefaultVersion _ 
       :=xlPivotTableVersion14 

     End With 

    End If 

Next ws 

End Sub 
+0

Perfekt! Ich danke dir sehr. Ich hatte eine Menge Probleme mit dem SourceRange-Teil. Danke für den Tipp mit ws.Index. Es hat mein Makro stark vereinfacht. Danke vielmals. – mmayfield

Verwandte Themen