2017-10-18 9 views
0

J'ai créé une table croisée dynamique dans la même feuille avec les données source. Maintenant, je veux créer un deuxième tableau croisé dynamique dans la même feuille avec la même source de données, mais avec différentes données imprimées dans le tableau croisé dynamique (bien sûr). Je continue d'obtenir une erreur, car il est dit que Table Pivot ne peut pas remplacer une autre table de Pivot. Cependant, ils ont choisi les plages où les tableaux croisés dynamiques sont créés, ils ne se remplacent pas les uns les autres. J'ai testé manuellement aussi. De plus, si j'enregistre le processus, il utilise simplement les références exactes pour les données sources, que je ne veux pas utiliser parce que le lastrow et la lastcolumn changent tous les jours. Juste pour le rappeler, la macro fonctionne très bien pour créer la première table. La deuxième table est le problème. Ci-dessous, je vais fournir mon code tel qu'il est maintenant.Deux tableaux croisés dynamiques dans la même feuille Excel

Dim DSheet As Worksheet 
Dim PCache As PivotCache 
Dim PTable1 As PivotTable 
Dim PTable2 As PivotTable 
Dim PRange As Range 

Application.DisplayAlerts = True 
Set DSheet = Worksheets("Budget_Report") 

Set PRange = DSheet.Range(Cells(1, 53), Cells.SpecialCells(xlCellTypeLastCell)) 

Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange) 
Set PTable1 = PCache.CreatePivotTable(TableDestination:=DSheet.Cells(4, 1), TableName:="PivotTable1") 
Set PTable2 = PCache.CreatePivotTable(TableDestination:=DSheet.Cells(17, 2), TableName:="PivotTable2") 

With ActiveSheet.PivotTables("PivotTable1") 

    With .PivotFields("T-Lane") 
    .Orientation = xlRowField 
    .Position = 1 
    .Subtotals(1) = True 
    .Subtotals(1) = False 
    End With 

    With .PivotFields("Monthly Cost FCST") 
    .Orientation = xlDataField 
    .Position = 1 
    .Function = xlAverage 
    .Caption = "Monthly Cost Forecast" 
    End With 

End With 

With ActiveSheet.PivotTables("PivotTable2") 

    With .PivotFields("Oran") 
    .Orientation = xlRowField 
    .Position = 1 
    .Subtotals(1) = True 
    .Subtotals(1) = False 
    End With 

    With .PivotFields("Monthly Cost FCST") 
    .Orientation = xlDataField 
    .Position = 1 
    .Function = xlAverage 
    .Caption = "Monthly Cost Forecast" 
    End With 

End With 
+0

Sans voir vos données, il est difficile de dire si ou comment les tableaux croisés se chevaucheront. Pourquoi utilisez-vous le code pour créer les tableaux croisés dynamiques? L'idée avec les tableaux croisés dynamiques est que seules les données changent, donc les définitions des tableaux pivotants restent les mêmes et il suffit de les rafraîchir. En outre, envisagez d'utiliser des objets de table Excel comme source pour les tableaux croisés dynamiques, puis la source de données augmentera et rétrécira dynamiquement. Des livres ont été écrits sur ce sujet, vous pouvez donc faire un peu plus de recherche et d'apprentissage sur les tableaux croisés dynamiques et les sources de données dynamiques. – teylyn

+0

@teylyn merci pour les commentaires! Je voulais les créer automatiquement, car cette macro s'exécuterait chaque jour dans différents classeurs. (Je vais copier coller tous les jours à d'autres feuilles! –

Répondre

1

Lors de l'insertion de la première table de pivotement et d'insérer une autre avant remplissage de la première, la plage de la table de pivotement vide de la première table de pivot occupe la cellule de destination [de DSheet.Cells (17, 2)] de la deuxième pivot.

Je pense que vous devriez insérer le premier tableau croisé dynamique et le remplir, puis en insérer un autre et le remplir aussi.

Voir si cela résout votre problème.

Dim DSheet As Worksheet 
Dim PCache As PivotCache 
Dim PTable1 As PivotTable 
Dim PTable2 As PivotTable 
Dim PRange As Range 

Application.DisplayAlerts = True 
Set DSheet = Worksheets("Budget_Report") 

Set PRange = DSheet.Range(Cells(1, 53), Cells.SpecialCells(xlCellTypeLastCell)) 

Set PCache = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=PRange) 
Set PTable1 = PCache.CreatePivotTable(TableDestination:=DSheet.Cells(4, 1), TableName:="PivotTable1") 

With ActiveSheet.PivotTables("PivotTable1") 

    With .PivotFields("T-Lane") 
    .Orientation = xlRowField 
    .Position = 1 
    .Subtotals(1) = True 
    .Subtotals(1) = False 
    End With 

    With .PivotFields("Monthly Cost FCST") 
    .Orientation = xlDataField 
    .Position = 1 
    .Function = xlAverage 
    .Caption = "Monthly Cost Forecast" 
    End With 

End With 

Set PTable2 = PCache.CreatePivotTable(TableDestination:=DSheet.Cells(17, 2), TableName:="PivotTable2") 

With ActiveSheet.PivotTables("PivotTable2") 

    With .PivotFields("Oran") 
    .Orientation = xlRowField 
    .Position = 1 
    .Subtotals(1) = True 
    .Subtotals(1) = False 
    End With 

    With .PivotFields("Monthly Cost FCST") 
    .Orientation = xlDataField 
    .Position = 1 
    .Function = xlAverage 
    .Caption = "Monthly Cost Forecast" 
    End With 

End With 
+0

qui fonctionne parfaitement! –

+0

Heureux que cela a fonctionné. :) – sktneer

+0

@sktneer juste curieux pourquoi vous n'utilisez pas vos objets 'Pivot' après que vous les« Set »? Au lieu de 'Avec ActiveSheet.PivotTables (" PivotTable1 ")' vous pouvez utiliser 'Avec PTable1', la même chose pour" PivotTable2 " –

0

De l'MSDN doc on pivot tables:

"Important" Si vous définissez les tableaux croisés dynamiques multiples sur la feuille de calcul Excel , il est possible les tables résultantes peuvent croître et se chevauchent les uns des autres si l'activité renvoie un grand ensemble de données. Dans ce scénario, vous recevrez "Un rapport de tableau croisé dynamique ne peut pas chevaucher un autre rapport de tableau croisé dynamique " lorsque vous actualisez les données. Vous pouvez corriger cette erreur en ajoutant des colonnes ou des lignes supplémentaires entre les tables pivotantes à pour permettre aux tables de se développer sans chevauchement.