TCD Excel et VBA

Fermé
Ordilibre - 30 mars 2005 à 09:52
 lilirousse - 8 juil. 2015 à 17:22
Bonjour,
J'utilise beaucoup les TCD dans excel. Hors, pour obtenir des valeurs issues de ces tableaux, je voudrais créer des macros. Je m'y perds un peu dans l'utilisation des fonctions VBA liées aux TCD. Existe t il un site qui les explique clairement avec des exemples?

Voici mon problème. J'aimerais extraire d'un TCD dans une feuille à part, les 20 premiers items d'un champs ainsi que les données associées. De plus, je souhaite que ces 20 items correspondent aux 20 premières données classées par ordre croissant.

Merci d'avance.

4 réponses

Merci pour cette info. Je connais déjà ce site et je n'y ai malheureusement pas trouvé ma réponse.

Après quelques heures de recherche, j'ai compris les éléments suivants:

En VBA, pour définir une variable correspondant à un objet TCD, on utilise PivotTable comme ceci:
"Set tableau = Worksheets("Essai").Range("A1").PivotTable"

Pour obtenir la liste des champs de données, on utilise Datafields

"i = 0
For Each champ In tableau.DataFields
Worksheets("Essai").Cells(10 + i, 1).Value = champ.Name
i = i + 1
Next champ"

Pour obtenir la liste des items du 1er champ de donnée on utilise PivotItems

"For Each champ In tableau.DataFields(1).PivotItems
Worksheets("Essai").Cells(10 + i, 1).Value = champ.Name
i = i + 1
Next champ"

Pour obtenir la liste des champs de ligne, on utilise RowFields

"i = 0
For Each champ In tableau.RowFields
Worksheets("Essai").Cells(10 + i, 2).Value = champ.Name
i = i + 1
Next champ"


Pour obtenir la liste des items du 1er champ de ligne, on utilise Pivotitems

"For Each champ In tableau.RowFields(1).PivotItems
Worksheets("Essai").Cells(10 + i, 2).Value = champ.Name
i = i + 1
Next champ"

Pour obtenir la liste des champs de colonne, on utilise ColumnFields

"i = 0
For Each champ In tableau.ColumnFields
Worksheets("Essai").Cells(10 + i, 3).Value = champ.Name
i = i + 1
Next champ"

Pour obtenir la liste des items du 1er champ de colonne, on utilise Pivotitems

For Each champ In tableau.ColumnFields(1).PivotItems
Worksheets("Essai").Cells(10 + i, 3).Value = champ.Name
i = i + 1
Next champ


Mais comment faire pour obtenir les données elles-mêmes correspondant à ces ligne ou ces colonnes sous forme de vecteur? Ce doit être évident pour un programmeur. En ce qui me concerne, j'y vais à taton. Je suis complètement novice en programmation. Je pense qu'un habitué du VBA doit pouvoir me répondre facilement.

Merci d'avance.
5
gbinforme Messages postés 14946 Date d'inscription lundi 18 octobre 2004 Statut Contributeur Dernière intervention 24 juin 2020 4 684
30 mars 2005 à 22:55
bonjour

un site qui devrait répondre à ton attente :

http://www.excelabo.net/xl/tcd.php

0
lien mort
0
random Messages postés 1612 Date d'inscription vendredi 26 novembre 2004 Statut Membre Dernière intervention 30 mars 2006 155
31 mars 2005 à 17:51
ben tu enregistres une macro
qui trie tes données par ordre croissant
puis qui fait le tableau croisé dynamique en prenant 20 lignes
ton programme sera écrit
il te reste à apporter deux ou trois modifs manu
éventuelles
0
Ben si vous arrivez à vous en sortir avec une réponse comme ça, chapeau !
0
Désolé mais je n'avance pas...

mon pb est pourtant simple:

"récupérer les calculs du TCD dans une variable vecteur (correspondant à une ligne ou une colonne du TCD)."

je n'arrive pas à croire que personne n'a imaginer de faire cela un jour.
0
lilian65 Messages postés 1 Date d'inscription lundi 23 mai 2005 Statut Membre Dernière intervention 23 mai 2005
23 mai 2005 à 18:45
Bonjour,

Je ne sais pas si tu as trouvé la réponse à toutes tes questions.
Je travaille aussi sur des TCD, et aujourd'hui je sais afficher les 5 premiers champs d'une ligne ou d'unne colonne par contre je galère pour récupérer les valeurs d'une intersection d'une ligne ou d'une colonne (pour récupérer les totaux d'une ligne par exemple).


Pour afficher les 5 premieres référence de mon tableau il suffit d'écrire :

With ActiveSheet.PivotTables("Tableau croisé dynamique6").PivotFields( _
"Référence")
For i = 1 To 5
.PivotItems(i).Visible = True
Next
End With
et pour cacher les autres

With ActiveSheet.PivotTables("Tableau croisé dynamique6").PivotFields( _
"Référence")
For i = 6 To .PivotItems.Count
.PivotItems(i).Visible = false
Next
End With
0
Cela fait plaisir de voir que d'autres butent sur les même problèmes.

Voilà les conclusions d'un travail de plusieurs jours avant que je me résolve à procéder différemment pour contourner le pb.

1) il est facile de récupérer dans un TCD toutes ses étiquettes grace notamment à la fonction .pivotitems (voir les messages précédents pour savoir comment faire)

2) pour obtenir une valeur calculée d'un TCD, il semble qu'il n'existe pas d'autre moyen que d'utiliser la fonction
GetPivotData([DataField], [Field1], [Item1], [Field2], [Item2], [Field3], [Item3], [Field4], [Item4], [Field5], [Item5], [Field6], [Item6], [Field7], [Item7], [Field8], [Item8], [Field9], [Item9], [Field10], [Item10], [Field11], [Item11], [Field12], [Item12], [Field13], [Item13], [Field14], [Item14]) As Range

Le pb avec cette fonction, c'est qu'il faut justement utiliser les champ et item en claire. Pour récupérer la valeur, on ne peut pas pratiquer sous forme d'index tel que tableau (i,j) ou i serait le n° de la colonne et j celui de la ligne .

Donc pour contourner le pb, j'utilise un TCD dans ma feuille et je vais chercher les données qui m'interessent en utilisant la fonction DECALER(réf;lignes;colonnes;hauteur;largeur)
0