Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tableau dynamique

7 réponses
Avatar
dyj Orange
Mon application génère une feuille avec des résultats. Dans une autre
feuille, je crée manuellement un TCD alimenté par les données de ma feuille
résultats.
Pour cela et par manque d'expérience, j'ai enregistré une macro. En
regardant le code de cette macro, il y a 3 champs qui semblent dynamiques.
TableName:="Tableau croisé dynamique14"
ActiveSheet.PivotTables("Tableau croisé dynamique14")
PivotTables("Tableau croisé dynamique14")

Le chiffre "14" est incrémenté à chaque fois que je reconstruis mon tableau.
Si je supprime puis recrée la feuille incluant le TCD, et si je réutilise ma
macro pour créer le TCD, il faut que je modifie mes variables avec le
chiffre "15".

D'où ma question. Peut on avoir toujours le même indice ".." pour ne pas
modifier ma macro.
Merci.

7 réponses

Avatar
michdenis
Bonjour,

Voici un petit exemple simple de code.

à chaque exécution de code, la procédure supprime le TDC "Denis"
et le recrée. Tu pourrais utiliser une plage de cellule définit
dynamiquement en utilisant une "plage nommée" et la fonction
decaler(). Tu obtiendrais à titre d'exemple :
Nom : MichD
fait référence à :
ÞCALER($A$1;;;NBVAL($A:$A);NBVAL($1:$1))

Et pour mettre à jour ton TDC "MichD" dans ta feuille "MichD"
Sub Test()
Worksheets("MichD").PivotTables("MichD").PivotCache.Refresh
End Sub


Voici un exemple simple comment procéder : En colonne A:A des Noms
d'élève et dans la colonne B:B des notes d'étudiant. Le PivotTable
tient compte des modifications apportées à la plage de cellules à
chaque exécution de la procédure.

'-----------------------------
Sub CreerTCD()
'Déclaration des variables
Dim Adr As String, Dest As String
Dim Pc As PivotCache
Dim Pt As PivotTable

'Si le TDC existe déjà il faut le supprimer
'avant de relancer la procédure sinon une
'erreur est générée c'est ce pourquoi j'ajoute
'la ligne de code suivante :
'On Error Resume Next
'Feuil1.PivotTables("Denis").TableRange2.Clear

With ActiveWorkbook
'Avec la feuille source des données
'(adapter le nom de la feuille + plage de cellules)
With .Worksheets("feuil1")
'Définir la plage de data source
Adr = .Name & "!" & .Range("A1:B" & _
.Range("A65536").End(xlUp).Row).Address
End With
'Avec la feuille où le TDC sera crée :
'adapter le nom de la feuille et la plage de cellule
With .Worksheets("Feuil2")
'Effacer le tdc si il existe
.PivotTables("Denis").TableRange2.Clear
'Définir la cellule où sera créé le TDC
Dest = .Name & "!" & .Range("A4").Address
End With
'Création du PivotCache
Set Pc = .PivotCaches.Add(SourceType:=xlDatabase, SourceData:­r)
'création du PivotTable
Set Pt = Pc.CreatePivotTable(TableDestination:=Range(Dest), _
TableName:="Denis", DefaultVersion:=xlPivotTableVersion10)
End With

With Pt
'Ajout d'un champ en ligne
.AddFields RowFields:="Étudiant"
'Ajout d'un champ "Data" dans le TDC
.PivotFields("Note").Orientation = xlDataField
End With

End Sub
'-----------------------------



MichD
--------------------------------------------
"dyj Orange" a écrit dans le message de groupe de discussion : 4cd98012$0$5405$

Mon application génère une feuille avec des résultats. Dans une autre
feuille, je crée manuellement un TCD alimenté par les données de ma feuille
résultats.
Pour cela et par manque d'expérience, j'ai enregistré une macro. En
regardant le code de cette macro, il y a 3 champs qui semblent dynamiques.
TableName:="Tableau croisé dynamique14"
ActiveSheet.PivotTables("Tableau croisé dynamique14")
PivotTables("Tableau croisé dynamique14")

Le chiffre "14" est incrémenté à chaque fois que je reconstruis mon tableau.
Si je supprime puis recrée la feuille incluant le TCD, et si je réutilise ma
macro pour créer le TCD, il faut que je modifie mes variables avec le
chiffre "15".

D'où ma question. Peut on avoir toujours le même indice ".." pour ne pas
modifier ma macro.
Merci.
Avatar
dyj Orange
Merci de m'avoir proposé une solution que j'essaie de mettre à ma sauce !!!!
Je n'arrive pas à créer le tableau. Voici mon code personnalisé que
j'invoque à partir d'un bouton. Si je commente l'instruction clear du
tableau et le On error, vba se plante sur le "Set Pt= ".
Merci pour ton aide.
******************************************************
Sub CreerTCD()
'Déclaration des variables
Dim Adr As String, Dest As String, FeuilleS As String, FeuilleR As String
Dim ChampLigne As String, ChampData As String
Dim Pc As PivotCache
Dim Pt As PivotTable

FeuilleS = "Ajouts MFP" ' Feuille source de données
FeuilleR = "Rapport" ' Feuille où le tableau est enregistré
NomTableau = "Variance" ' Nom du tableau à créer
ChampLigne = "Agence" ' Ligne
ChampData = "Nom Produit" ' Données

'Si le TDC existe déjà il faut le supprimer avant de relancer la procédure
sinon erreur
''' On Error Resume Next

With ActiveWorkbook

With .Worksheets(FeuilleS) ' Avec la feuille source "FeuilleS" définir
la plage de data source
Adr = .Name & "!" & .Range("B4:G" & _
.Range("G65536").End(xlUp).Row).Address
End With

With .Worksheets(FeuilleR) 'Avec la feuille "FeuilleR" où le TDC sera
crée :
''' .PivotTables(NomTableau).TableRange2.Clear 'Effacer le tdc si il
existe
Dest = .Name & "!" & .Range("A5").Address 'Définir la cellule où
sera créé le TDC
End With
'Création du PivotCache
Set Pc = .PivotCaches.Add(SourceType:=xlDatabase, SourceData:­r)
'création du PivotTable
Set Pt = Pc.CreatePivotTable(TableDestination:=Range(Dest), _
TableName:=NomTableau, DefaultVersion:=xlPivotTableVersion10)
End With

With Pt
.AddFields RowFields:=ChampLigne 'Ajout d'un champ
en ligne
.PivotFields(ChampData).Orientation = xlDataField 'Ajout d'un champ
"Data"
End With

End Sub
******************************************************

"michdenis" a écrit dans le message de groupe de discussion :
ibc0dj$9mp$

Bonjour,

Voici un petit exemple simple de code.

à chaque exécution de code, la procédure supprime le TDC "Denis"
et le recrée. Tu pourrais utiliser une plage de cellule définit
dynamiquement en utilisant une "plage nommée" et la fonction
decaler(). Tu obtiendrais à titre d'exemple :
Nom : MichD
fait référence à :
ÞCALER($A$1;;;NBVAL($A:$A);NBVAL($1:$1))

Et pour mettre à jour ton TDC "MichD" dans ta feuille "MichD"
Sub Test()
Worksheets("MichD").PivotTables("MichD").PivotCache.Refresh
End Sub


Voici un exemple simple comment procéder : En colonne A:A des Noms
d'élève et dans la colonne B:B des notes d'étudiant. Le PivotTable
tient compte des modifications apportées à la plage de cellules à
chaque exécution de la procédure.

'-----------------------------
Sub CreerTCD()
'Déclaration des variables
Dim Adr As String, Dest As String
Dim Pc As PivotCache
Dim Pt As PivotTable

'Si le TDC existe déjà il faut le supprimer
'avant de relancer la procédure sinon une
'erreur est générée c'est ce pourquoi j'ajoute
'la ligne de code suivante :
'On Error Resume Next
'Feuil1.PivotTables("Denis").TableRange2.Clear

With ActiveWorkbook
'Avec la feuille source des données
'(adapter le nom de la feuille + plage de cellules)
With .Worksheets("feuil1")
'Définir la plage de data source
Adr = .Name & "!" & .Range("A1:B" & _
.Range("A65536").End(xlUp).Row).Address
End With
'Avec la feuille où le TDC sera crée :
'adapter le nom de la feuille et la plage de cellule
With .Worksheets("Feuil2")
'Effacer le tdc si il existe
.PivotTables("Denis").TableRange2.Clear
'Définir la cellule où sera créé le TDC
Dest = .Name & "!" & .Range("A4").Address
End With
'Création du PivotCache
Set Pc = .PivotCaches.Add(SourceType:=xlDatabase, SourceData:­r)
'création du PivotTable
Set Pt = Pc.CreatePivotTable(TableDestination:=Range(Dest), _
TableName:="Denis", DefaultVersion:=xlPivotTableVersion10)
End With

With Pt
'Ajout d'un champ en ligne
.AddFields RowFields:="Étudiant"
'Ajout d'un champ "Data" dans le TDC
.PivotFields("Note").Orientation = xlDataField
End With

End Sub
'-----------------------------



MichD
--------------------------------------------
"dyj Orange" a écrit dans le message de groupe de discussion :
4cd98012$0$5405$

Mon application génère une feuille avec des résultats. Dans une autre
feuille, je crée manuellement un TCD alimenté par les données de ma feuille
résultats.
Pour cela et par manque d'expérience, j'ai enregistré une macro. En
regardant le code de cette macro, il y a 3 champs qui semblent dynamiques.
TableName:="Tableau croisé dynamique14"
ActiveSheet.PivotTables("Tableau croisé dynamique14")
PivotTables("Tableau croisé dynamique14")

Le chiffre "14" est incrémenté à chaque fois que je reconstruis mon tableau.
Si je supprime puis recrée la feuille incluant le TCD, et si je réutilise ma
macro pour créer le TCD, il faut que je modifie mes variables avec le
chiffre "15".

D'où ma question. Peut on avoir toujours le même indice ".." pour ne pas
modifier ma macro.
Merci.
Avatar
michdenis
Pour pouvoir créer un nouveau TDC dans une plage de destination
précise, il faut que l'ancien TDC qui y prend place soit supprimé. C'est
ce que fait la ligne de code :
| ''' .PivotTables(NomTableau).TableRange2.Clear 'Effacer le tdc si il

Le nom du PivotTable doit réellement exister. On peut remplacer son
nom par son "Index"... s'il y en a qu'un dans la feuille, son index = 1

Voici un fichier exemple qui illustre le code que je t'ai soumis :
http://cjoint.com/?0lklSOjqOOa

Tout le code est commenté, ligne par ligne.


MichD
--------------------------------------------
Avatar
michdenis
Voici un fichier exemple illustrant le code que je t'ai transmis.
Le code est commenté ligne par ligne.

Si dans la plage de destination, il y a déjà un TDC, ce dernier doit
être supprimé avant de pouvoir le récréer à l'aide d'un code.
Pour ce faire, il faut s'assurer que le nom de ce TDC soit conforme
au nom employé dans le code. S'il n'y a qu'un TDC dans une feuille
on peut utiliser l'index au lieu de son nom. Dans ce cas l'index = 1

http://cjoint.com/?0lklxySnSX


MichD
--------------------------------------------
Avatar
dyj Orange
Je suis arrivé à mettre en évidence mon problème. J'utilise ton classeur et
ton code. La seule modification que j'y apporte pour comprendre ton code,
c'est de modifier les variables: nom des feuilles, nom du tableau, nom des
champs.
Pas de problème avec tableau et champs.

Dès que je nomme "feuil1" avec "Ajouts Z1", le tableau ne se crée pas.
Visiblement le blanc du nom ne plait pas à l'instruction SourceData:­r
Si je mets "AjoutsZ1" le tableau est crée.

Y-a-t-il une incompatibilité avec un blanc dans les noms de feuilles ?

"michdenis" a écrit dans le message de groupe de discussion :
ibdu35$9q8$

Voici un fichier exemple illustrant le code que je t'ai transmis.
Le code est commenté ligne par ligne.

Si dans la plage de destination, il y a déjà un TDC, ce dernier doit
être supprimé avant de pouvoir le récréer à l'aide d'un code.
Pour ce faire, il faut s'assurer que le nom de ce TDC soit conforme
au nom employé dans le code. S'il n'y a qu'un TDC dans une feuille
on peut utiliser l'index au lieu de son nom. Dans ce cas l'index = 1

http://cjoint.com/?0lklxySnSX


MichD
--------------------------------------------
Avatar
michdenis
| Y-a-t-il une incompatibilité avec un blanc dans les noms de feuilles ?

Non, mais dans certaines circonstances, on doit ajouter des guillemets
simples autour du nom de l'onglet d'une feuille contenant un espace

"'Ajouts Z1'"

Pour cette raison, au lieu d'utiliser un espace dans le nom de l'onglet de
la feuille, il est plus simple d'employer un "underscore" (_) au lieu d'un espace

"Ajouts_Z1"



MichD
--------------------------------------------
"dyj Orange" a écrit dans le message de groupe de discussion : 4cdabc77$0$5386$

Je suis arrivé à mettre en évidence mon problème. J'utilise ton classeur et
ton code. La seule modification que j'y apporte pour comprendre ton code,
c'est de modifier les variables: nom des feuilles, nom du tableau, nom des
champs.
Pas de problème avec tableau et champs.

Dès que je nomme "feuil1" avec "Ajouts Z1", le tableau ne se crée pas.
Visiblement le blanc du nom ne plait pas à l'instruction SourceData:­r
Si je mets "AjoutsZ1" le tableau est crée.

Y-a-t-il une incompatibilité avec un blanc dans les noms de feuilles ?

"michdenis" a écrit dans le message de groupe de discussion :
ibdu35$9q8$

Voici un fichier exemple illustrant le code que je t'ai transmis.
Le code est commenté ligne par ligne.

Si dans la plage de destination, il y a déjà un TDC, ce dernier doit
être supprimé avant de pouvoir le récréer à l'aide d'un code.
Pour ce faire, il faut s'assurer que le nom de ce TDC soit conforme
au nom employé dans le code. S'il n'y a qu'un TDC dans une feuille
on peut utiliser l'index au lieu de son nom. Dans ce cas l'index = 1

http://cjoint.com/?0lklxySnSX


MichD
--------------------------------------------
Avatar
dyj Orange
Comme c'est mon appli qui génère les feuilles, pas de problèmes pour les
renommer. Merci pour tout ce temps que tu m'as consacré et qui m'a permis
d'avancer.

"dyj Orange" a écrit dans le message de groupe de discussion :
4cdabc77$0$5386$

Je suis arrivé à mettre en évidence mon problème. J'utilise ton classeur et
ton code. La seule modification que j'y apporte pour comprendre ton code,
c'est de modifier les variables: nom des feuilles, nom du tableau, nom des
champs.
Pas de problème avec tableau et champs.

Dès que je nomme "feuil1" avec "Ajouts Z1", le tableau ne se crée pas.
Visiblement le blanc du nom ne plait pas à l'instruction SourceData:­r
Si je mets "AjoutsZ1" le tableau est crée.

Y-a-t-il une incompatibilité avec un blanc dans les noms de feuilles ?

"michdenis" a écrit dans le message de groupe de discussion :
ibdu35$9q8$

Voici un fichier exemple illustrant le code que je t'ai transmis.
Le code est commenté ligne par ligne.

Si dans la plage de destination, il y a déjà un TDC, ce dernier doit
être supprimé avant de pouvoir le récréer à l'aide d'un code.
Pour ce faire, il faut s'assurer que le nom de ce TDC soit conforme
au nom employé dans le code. S'il n'y a qu'un TDC dans une feuille
on peut utiliser l'index au lieu de son nom. Dans ce cas l'index = 1

http://cjoint.com/?0lklxySnSX


MichD
--------------------------------------------