XL 2016 VBA - TCD - Questions diverses

Dudu2

XLDnaute Barbatruc
Bonjour le Forum,

Je m'adresse aux spécialistes des TCD et de leur manipulation en VBA.
Je suis très peu versé dans ce domaine et pour un utilisateur intensif de TCDs je dois réaliser certaines tâches en VBA.

La première est de reconstituer un TCD en VBA en partant d'un modèle de TCD existant (et évidemment d'une source de même modèle).
Je suppose qu'il y a plusieurs étapes: les champs, les filtres, les tris, les groupes...

Merci pour toute indication de méthode, code etc...
Désolé pour cette question très ouverte. Peut-être n'est-elle pas judicieuse dans le cadre du forum.
 
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour à tous
Il est bien plus simple de changer par VBA la source d'un TCD et d’enregistrer le fichier avec sa nouvelle source

Décomposer totalement un TCD n'est pas possible pour certains cas.

J'avais testé tous les cas possibles il y a 5 ans et constaté notamment que les regroupements ne sont pas tous récupérables par VBA
Sauf si les propriétés ont évolué depuis (et donc pas sur 2016)...
 

dysorthographie

XLDnaute Accro
Merci @dysorthographie,
Je vais approfondir demain mais je crains que tu ne doives m'en dire davantage sur ce fichier et cette classe.
oui pas de problème! ce que je peux dire dès maintenant c'est qu'il s'agit d'un couteau suis , ou du mois pour ce qui me concerne de Montmorency!

il possède des méthode qui permet de manipuler un TDC!
on déclare une instance et on parcours les méthode!

VB:
Sub test()
Dim Tdc As New clsTdcRD
Sheets("Data").UsedRange = Sheets("Data").UsedRange.Value
Tdc.CreerTableau ActiveWorkbook, "Data!" & Sheets("Data").UsedRange.Address, "TDC", "Data"
Tdc.NewPivotTables "Qualification", TypeFiltre
Tdc.NewPivotTables "Motif", TypeFiltre
Tdc.NewPivotTables "Affecté à", Typeligne
Tdc.NewPivotTables "Services", Typeligne
Tdc.NewDataField "CA", Somme
Tdc.AfficheTotal True, True
Tdc.Style PivotStyleMedium9

If Tdc.FiltreTypeFiltre("Qualification", "Développement ") = False Then MsgBox "Pastrouvé"
If Tdc.FiltreTypeFiltre("Motif", "Commercial ") = False Then MsgBox "Pastrouvé"

End Sub
Sub Test2()
Dim D As New clsTdcRD
D.CopyTdc Sheets("TDC"), "TDC", Sheets("Feuil1"), "toto"
D.TdcExistant Sheets("Feuil1"), "toto"
D.DataSource Sheets("Data").Range("A1").CurrentRegion
End Sub
mais c'est l'auberge espagnol, également, ou chacun apporte ce qu'il a!
 

Pièces jointes

  • clsTdcRD.zip
    1.9 KB · Affichages: 6
Dernière édition:

Dudu2

XLDnaute Barbatruc
Les Experts, j'ai une proposition à vous faire et vous me dites...
  1. Créer un classeur vierge
  2. Copier la source des données sur la 1ère feuille du classeur vierge quitte à l'échantillonner à 25 lignes pour pas avoir trop de données à trimballer
  3. Copier le TCD.TableRange2 sur la 2ème feuille du classeur vierge
  4. Changer la source de données du TCD copié sur la tableau de la 1ère feuille du classeur vierge.
Et faire la manip inverse lors de l'application du "modèle" à une nouvelle source de données.
 
Dernière édition:

dysorthographie

XLDnaute Accro
la règle N°1 qu'il faut au maximum respecter, est c'un informaticien est en fainéant, tout comme ceux qui lui demande de développer une macro par feignantise de tout ce taper à la main!

donc on déclare que ce qu'il semble nécessaire au bon fonctionnement du programme!

on capitalise dans des module le travail accompli pour les réchauffer le cas échéant!

VB:
Sub a()
ThisWorkbook.Sheets("Data").Copy
With ActiveWorkbook
    ThisWorkbook.Sheets("Tdc").Copy After:=.Worksheets("Data")
    DataSource TdcExistant(.Worksheets("TDC"), "TDC"), .Worksheets("Data").Range("A1").CurrentRegion
    .SaveAs "toto", xlOpenXMLWorkbookMacroEnabled
    .Close False
End With
End Sub
Public Sub DataSource(tb As PivotTable, Plage As Range)
tb.ChangePivotCache Plage.Parent.Parent.PivotCaches. _
     Create(SourceType:=xlDatabase, SourceData:=Plage.Parent.Name & "!" & Plage.Address, Version:=xlPivotTableVersion12)
End Sub
Public Function TdcExistant(Sh As Worksheet, Tdc As String) As PivotTable

For Each td In Sh.PivotTables
   If UCase(td.Name) = UCase(Tdc) Then
         Set TdcExistant = td
         Exit For
   End If
Next

End Function
 

Dudu2

XLDnaute Barbatruc
Avec le SourceData je récupère des trucs indigestes:
VB:
    'Range type "Tableau1"
    'Range type "Classeur1!Tableau1"
    'Range type "L5C3:L8C5"
    'Range type "Feuil1!L5C3:L8C5"
    'Range type "[Classeur1]Feuil1!L5C3:L8C5"
J'ai pas très envie de parser tout çà.
Y pas un truc ? Un Evaluate ou autre ?
 

dysorthographie

XLDnaute Accro
Avec le SourceData je récupère des trucs indigestes:
VB:
    'Range type "Tableau1"
    'Range type "Classeur1!Tableau1"
    'Range type "L5C3:L8C5"
    'Range type "Feuil1!L5C3:L8C5"
    'Range type "[Classeur1]Feuil1!L5C3:L8C5"
J'ai pas très envie de parser tout çà.
Y pas un truc ? Un Evaluate ou autre ?
en fait je ne comprend pas ce que tu veux faire!

  1. tu as des data que tu veux copier sur un nouveau classeur
  2. tu veux copier le TDC comme modèle
  3. tu veux changer la source du TDC pour lui affecter l'address des data nu nouveau classeur!
qui y t'il a parser!
VB:
Sub a()
Dim ADD As String
 ADD = TdcExistant(ThisWorkbook.Sheets("Tdc"), "TDC").PivotCache.SourceData
ThisWorkbook.Sheets("Data").Copy
With ActiveWorkbook
    ThisWorkbook.Sheets("Tdc").Copy After:=.Worksheets("Data")
    DataSource TdcExistant(.Worksheets("TDC"), "TDC"), ADD
    .SaveAs "toto", xlOpenXMLWorkbookMacroEnabled
    .Close False
End With
End Sub
Public Sub DataSource(tb As PivotTable, Plage As String)
tb.PivotCache.SourceData = Plage '
End Sub
Public Function TdcExistant(Sh As Worksheet, Tdc As String) As PivotTable

For Each td In Sh.PivotTables
   If UCase(td.Name) = UCase(Tdc) Then
         Set TdcExistant = td
         Exit For
   End If
Next
End Function
 

Dudu2

XLDnaute Barbatruc
Il y a mon cher @dysorthographie, et j'en suis bien désolé, que je comprends strictement RIEN à ton code.

Déjà ça commence par:
ThisWorkbook.Sheets("Data").Copy
Et ça enchaine sur:
ThisWorkbook.Sheets("Tdc").Copy
Délà ça je ne comprends pas pour quoi 2 Copy sans Paste.

Ensuite la Sheets("Data") je ne la connais pas, je ne connais que le TCD qui est l'un des TCDs de la feuille active (le seul ou celui sur lequel se trouve la cellule active). Donc pour trouver OÙ se trouvent les data, il faut que j'analyse le SourceData du TCD qui peut être ici ou là, dans le même classeur ou dans un autre, sur une feuille ou sur une autre.

De plus, je ne veux pas faire un Copy de la Sheets("Tdc") car celle-ci peut théoriquement contenir plusieurs TCDs. C'est le TCD que je veux copier, par la feuille où il se trouve.

Le code que j'ai indiqué en Post #20 fait l'affaire. Testé validé.
Sauf que j'ai pris comme hypothèse que la source de données est dans le même classeur et sous forme de Tableau Structuré. Mais évidemment c'est une raccourci qui n'est pas une généralité.

Et hélas, le SourceData est dans un format inexploitable directement en Range (en tous cas à ma connaissance) et il faut en extirper:
- La classeur des data
- La feuille des data
- Le Range des data
pour pouvoir le copier sur la destination. D'où le parsing. Mais il y a peut-être une solution pour l'éviter ?
 
Dernière édition:

dysorthographie

XLDnaute Accro
ThisWorkbook.Sheets("Data").Copy
J'ai un onglet qui contient les données utiliser dans le tableau dynamique croisé

Je ne sais pas comment s'appelle le tiens mais histoire de comprendre exécutés
ThisWorkbook.Sheets("ton onglet").Copy pour tester !

Si le but est de recréer un TDC qui respecte le même modèle qu'un fichier source, autant copier le TDC et lui affecter la bonne plages de données celle que j'appelle Data.

Pour info TDC Tableau Dynamique Croisé

Mais de toute évidence j'ai rien compris !
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
J'ai un onglet qui contient les données utiliser dans le tableau dynamique croisé
Ok mais je pense qu'il y a un malentendu.
A priori je ne sais pas où sont les données et je dois les trouver à partir du TCD.
J'essaie de faire une macro qui Exporte (puis importe par le mécanisme inverse) un TCD absolument quelconque dont je ne connais rien sauf qu'il est sur la feuille active.

ThisWorkbook.Sheets("ton onglet").Copy pour tester !
J'essaierai mais je ne vois pas ce que ça peut faire d'autre qu'un Copy.
Peut-être y a-t-il un effet associé que je ne connais pas.
 

Discussions similaires

Statistiques des forums

Discussions
314 490
Messages
2 110 139
Membres
110 684
dernier inscrit
kihel