Changer PivotCache
Bonjour a tous (desole je suis sur un qwerty, donc je ne sais pas mettre les accents)!
Je suis nouveau sur VBA, j'ai commence il y a seulement deux semaines donc mes connaissances sont assez limitees.
J'utilise excel 2013.
Mon probleme est le suivant:
Je recois deux tableaux que je dois comparer. Les fichiers sont assez mal fait donc j'ai cree une macro qui les remet en forme correctement et ensuite j ai fait des pivot table sur une autre sheet qui utilisent ces fichiers comme sources. Cette macro sera utilisee regulierement: les utilisateurs colleront leurs deux fichiers dans deux feuilles differentes et a partir de la, les pivot table mettront en evidence certaines choses.
Le probleme est que les pivot table sont completement perdues dans les references apres la transformation des fichiers a cause du rajout de deux colonnes (ce qui est logique). J aimerais donc creer une macro qui change les pivots cache une fois ces fichiers transformes.
J ai cherche sur beaucoup de forums la reponse la plus classique est celle-ci:
"Sub ChangePivotDataSourceRange()
Dim sht As Worksheet
Dim SrcData As String
Dim pvtCache As PivotCache
'Determine the data range you want to pivot
Set sht = ThisWorkbook.Worksheets("Sheet1")
SrcData = sht.Name & "!" & Range("A1:R100").Address(ReferenceStyle:=xlR1C1)
'Create New Pivot Cache from Source Data
Set pvtCache = ActiveWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=SrcData)
'Change which Pivot Cache the Pivot Table is referring to
ActiveSheet.PivotTables("PivotTable1").ChangePivotCache (pvtCache)
End Sub"
Le nom de ma sheet source c'est DataT et celle ou se trouve ma pivot Transition table et le nom super original de ma pivot est (PivotTable1):
Le code remanie avec mes sheets donne ceci:
"
Sub ChangePivotDataSourceRange()
Dim sht As Worksheet
Dim SrcData As String
Dim pvtCache As PivotCache
Dim Max_RowT As Integer, Max_ColT As Integer
Worksheets("DataT").Activate
Max_ColT = Application.WorksheetFunction.CountA(Range("1:1"))
Max_RowT = Application.WorksheetFunction.CountA(Range("A:A"))
'Determine the data range you want to pivot
Set sht = ThisWorkbook.Worksheets("DataT")
SrcData = sht.Name & "!" & Range("A1:R100").Address(ReferenceStyle:=xlR1C1)
'Create New Pivot Cache from Source Data
Set pvtCache = ActiveWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
sourcedata:=SrcData)
'Change which Pivot Cache the Pivot Table is referring to
Worksheets("Transition table").Activate
ActiveSheet.PivotTables("PivotTable1").ChangePivotCache (pvtCache)
End Sub "
J'obtiens alors une erreur 438.
Si vous avez une idee qui pourrait m aider ce serait top!
J'ai oublie de dire que j'utilise Max_RowT et Max_ColT pour changer le range dynamiquement, ce qui donne:
"SrcData = sht.Name & "!" & Range(Cells(1,1),Cells(Max_RowT,Max_ColT)).Address(ReferenceStyle:=xlR1C1)
Bonjour et bienvenu(e),
Merci de joindre un fichier à ta demande.
Cdlt.
Bonjour,
D'abord merci pour votre reponse. Il s'avere que j'ai trouve la solution a mon probleme en utilisant le code suivant:
Sub TransitionDataT()
Dim Data_sht As Worksheet
Dim Pivot_sht As Worksheet
Dim StartPoint As Range
Dim DataRange As Range
Dim PivotName As String
Dim NewRange As String
'Set Variables Equal to Data Sheet and Pivot Sheet
Set Data_sht = ThisWorkbook.Worksheets("DataT")
Set Pivot_sht = ThisWorkbook.Worksheets("Transition table")
'Enter in Pivot Table Name
PivotName = "PivotTable1"
'Dynamically Retrieve Range Address of Data
Set StartPoint = Data_sht.Range("A1")
Set DataRange = Data_sht.Range("A1").CurrentRegion
'Cells(1, 1), Cells(Max_RowT, Max_ColT))
NewRange = Data_sht.Name & "!" & _
DataRange.Address(ReferenceStyle:=xlR1C1)
DataRange.Select
'change Pivot Table Data Source Range Address
Pivot_sht.PivotTables(PivotName).ChangePivotCache _
ThisWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
sourcedata:=NewRange)
'
''Ensure Pivot Table is Refreshed
Pivot_sht.PivotTables(PivotName).RefreshTable
End Sub
Le probleme etait du a la selection des donnees sources (la formule selectionnait l'ensemble de la fuille excel).
Bonne journee,
Raphael