Bonjour tout le monde,

J'ai un problème que je n'arrive pas à résoudre:

J'ai créé une macro qui crée un tableau croisé dynamique à partir d'une source de données, jusque là rien de compliqué.

J'ai ajouté un peu de gestion d'erreur, car je ne serai certainement pas le seul à utiliser ce programme.

En gros, on ouvre le classeur contenant la source, on crée un onglet "TCD" et on crée le pivot table dedans.

Je fais le check suivant : Si , lorsqu'on ouvre le classeur, l'onglet TCD existe déja, on supprime le TCD contenu dans l'onglet et on en recrée un, sinon on ne fait rien.

En gros j'ai 2 traitements sur 2 fichiers légèrement différents, sur l'un cela fonctionne sans problème, sur l'autre cela ne fonctionne pas.

Voici le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
 
Sub create_TCD(traite As Variant, target As Workbook)
 
'Déclaration des variables
Dim wshTCD      As Worksheet
Dim PvtTCD      As PivotTable
Dim source_table As Range
Dim input_sheet As String
Dim last_col, last_row As Long
 
 
'Code et noms d'onglets différents selon le traite
If traite = "source1" Then
    input_sheet = "Q_25_08_Crea_Bord_source1"
    GoTo traitement_source1
ElseIf traite = "source2" Then
    input_sheet = "Q_25_06_Crea_Bord_source2"
    GoTo traitement_source2
End If
 
 
'************************************************************************************************************
'Traitement des données source1
'************************************************************************************************************
traitement_source1:
'Calcul des dimensions du tableau à récupérer
last_row = target.Sheets(input_sheet).Range("b20").End(xlDown).Row
last_col = target.Sheets(input_sheet).Range("b20").End(xlToRight).Column
 
'Définition du tableau source
target.Sheets(input_sheet).Activate
Set source_table = target.Sheets(input_sheet).Range(Cells(20, 2), Cells(last_row, last_col))
'source_table.Select
 
'Vérification : "l'onglet TCD n'existe pas déja. Si oui, on efface le TCD en gardant l'onglet"
On Error Resume Next
target.Sheets("TCD").Activate
 
If Err.Number = 0 Then
   'Suppression de tous les TCD existants dans la feuille
    target.Sheets("TCD").Range("A1:Z100").ClearContents
Else
    'Création d'un nouvel onglet pour le stockage du TCD
    Sheets.Add
    ActiveSheet.Name = "TCD"
End If
 
On Error GoTo 0
 
 
 
'Affectation du TCD à la feuille "TCD"
Set wshTCD = Worksheets("TCD")
 
 
   'Ajout d'un TCD sur l'onglet "TCD"
    Set PvtTCD = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=source_table) _
          .CreatePivotTable(tabledestination:=wshTCD.Range("B5"), TableName:="TCD_" & traite)
 
    'Ajout des champs au TCD
    With PvtTCD
 
    '### Champ Ligne
 
 
    '### Champ Colonne
            With .PivotFields("MOTIVO PAGAM")
            .Orientation = xlColumnField
            .Position = 1
        End With
 
    '### Champ Etiquette de données
        With .PivotFields("TIPO TRAT")
            .Orientation = xlPageField
            .Position = 1
        End With
 
                With .PivotFields("ANNO GEN")
            .Orientation = xlPageField
            .Position = 1
        End With
 
 
    '### Champ Valeurs
        With .PivotFields("TIPO TRAT")
            .Orientation = xlDataField
        End With
 
 
       'Filtrage des données
       PvtTCD.PivotFields("TIPO TRAT").CurrentPage = "1VITA" 'On ne regarde que les traités "1VITA"
       PvtTCD.PivotFields("ANNO GEN").EnableMultiplePageItems = True
       On Error Resume Next
       PvtTCD.PivotFields("ANNO GEN").PivotItems("2001").Visible = False 'On exclut la génération 2001 du filtre
        On Error GoTo 0
    End With
 
    GoTo Fin_Proc
 
 
'************************************************************************************************************
'Traitement des données source2
'************************************************************************************************************
traitement_source2:
'Calcul des dimensions du tableau à récupérer
last_row = ActiveSheet.Range("b20").End(xlDown).Row
last_col = ActiveSheet.Range("b20").End(xlToRight).Column
 
'Définition du tableau source
target.Sheets(input_sheet).Activate
Set source_table = target.Sheets(input_sheet).Range(Cells(20, 2), Cells(last_row, last_col))
source_table.Select
 
'Vérification : "l'onglet TCD n'existe pas déja. Si oui, on efface le TCD en gardant l'onglet"
On Error Resume Next
target.Sheets("TCD").Activate
 
If Err.Number = 0 Then
   'Suppression de tous les TCD existants dans la feuille
    target.Sheets("TCD").Range("A1:Z100").ClearContents
Else
    'Création d'un nouvel onglet pour le stockage du TCD
    Sheets.Add
    ActiveSheet.Name = "TCD"
End If
 
On Error GoTo 0
 
 
'Affectation du TCD à la feuille "TCD"
Set wshTCD = Worksheets("TCD")
wshTCD.Activate
 
 
   'Ajout d'un TCD sur l'onglet "TCD"
    Set PvtTCD = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=source_table) _
          .CreatePivotTable(tabledestination:=wshTCD.Range("B5"), TableName:="TCD_" & traite)
 
    'Ajout des champs au TCD
    With PvtTCD
 
    '### Champ Ligne
        With .PivotFields("ANNO GEN")
            .Orientation = xlRowField
            .Position = 1
        End With
 
    '### Champ Colonne
        With .PivotFields("MOTIVO PAGAM")
            .Orientation = xlColumnField
            .Position = 1
        End With
 
    '### Champ Etiquette de données
        With .PivotFields("TIPO TRAT")
            .Orientation = xlPageField
            .Position = 1
        End With
 
 
    '### Champ Valeurs
        With .PivotFields("ANNO GEN")
            .Orientation = xlDataField
            .Function = xlCountNums
        End With
 
 
       'Filtrage des données
       PvtTCD.PivotFields("TIPO TRAT").CurrentPage = "1VITA" 'On ne regarde que les traités "1VITA"
 
 
    End With
 
    GoTo Fin_Proc
 
 
 
 
Fin_Proc:
 
End Sub
Je ne sais pas pourquoi, mais cela ne fonctionne pas pour le traitement de la source 2 si le TCD existait déja lors de l'ouverture du fichier (ligne 136 du code), or le code est identique au traitement de la source 1, la seule chose qui change c'est ce que je met dans les lignes et les colonnes dans le TCD (après la ligne 136 du code).

L'erreur renvoyée est la suivante :"La méthode create de l'objet pivotcache a échoué".

J'ai fait des recherches sur internet, et j'ai essayé de vider le cache des TCD, mais l'erreur persiste.

Si jamais vous pouvez m'aider, cela me permettrait de terminer cette macro!

merci!