TCD Excel et VBA

Ordilibre -  
 lilirousse -
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.
Configuration: PC
WXP

4 réponses

  1. Ordilibre
     
    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
  2. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour

    un site qui devrait répondre à ton attente :

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

    0
    1. lilirousse
       
      lien mort
      0
  3. random Messages postés 1612 Statut Membre 155
     
    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
    1. Marco786
       
      Ben si vous arrivez à vous en sortir avec une réponse comme ça, chapeau !
      0
  4. ordilibre
     
    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
    1. lilian65 Messages postés 1 Statut Membre
       
      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
    2. Ordilibre
       
      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