Création d'un tableau croisé dynamique
Bonjour,
J'ai un problème lors de la création d'un TCD via VBA.
Le but étant de créer mon TCD en cellule "AI1" de la feuille 1, où se situe mon tableau parcourant les colonnes "A:AE".
Je dispose des en têtes de colonne suivantes postées en PJ.
Voici ma macro
Sub créer_tdc()
'Dimension des variables
Dim wshTCD As Worksheet
Dim PvtTCD As PivotTable
'Affectation du TCD à la feuille "Feuil1"
Set wshTCD = Worksheets("Feuil1")
'Suppression de tous les TCD existants dans la feuille
For Each PvtTCD In wshTCD.PivotTables
PvtTCD.TableRange2.Clear
Next PvtTCD
'Ajout d'un TCD sur la feuille "TCD automatique"
Set PvtTCD = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=[Feuil1!A1].CurrentRegion.Address(, , xlR1C1, True)) _
.CreatePivotTable(TableDestination:=wshTCD.Range("AN1"), TableName:="TCD_ADPP")[/color][/color][/b][/b]
'Ajout des champs au TCD
With PvtTCD
'Ajout d'une Ligne
With .PivotFields("Customer for final sales")
.Orientation = xlRowField
.Position = 1
End With
'Ajout d'une Colonne
With .PivotFields("Nombre de Commercial Variety ")
.Function = xlCountNums
.Orientation = xlColumnNums
.Position = 1
End With
End With
End SubUn message d'erreur est indiqué au niveau de la ligne surlignée, et je n'ai pu tester le reste de la macro!
En pièce jointe, je vous ai un extrait du résultat que je souhaiterai obtenir
Merci de votre aide !
Bonjour,
Essaie ainsi mais n'oublie pas d'indiquer le nom de la feuille du TCD (voir partie surlignée).
Sinon, tu joins un fichier à ta demande.
Cdlt.
Option Explicit
Sub créer_tdc()
Dim wb As Workbook
Dim wsData As Worksheet, wsPT As Worksheet
Dim rngData As Range
Dim PTCache As PivotCache
Dim pt As PivotTable
Application.ScreenUpdating = False
Set wb = ActiveWorkbook
Set wsData = wb.Worksheets("Feuil1")
Set rngData = wsData.Cells(1).CurrentRegion
Set wsPT = wb.Worksheets("xxx")
For Each pt In wsPT.PivotTables
pt.TableRange2.Clear
Next pt
Set PTCache = wb.PivotCaches.Create _
(SourceType:=xlDatabase, _
SourceData:=rngData)
Set pt = PTCache.CreatePivotTable _
(TableDestination:=wsPT.Range("AN1"), _
TableName:="TCD_ADPP")
With pt
.AddFields RowFields:="Customer for final sales"
With .PivotFields("Nombre de Commercial Variety ")
.Orientation = xlDataField
.Function = xlCount
End With
End With
Set rngData = Nothing
Set pt = Nothing
Set PTCache = Nothing
Set wsPT = Nothing: Set wsData = Nothing
Set wb = Nothing
End SubMerci Jean-Eric de ta réponse.
J'ai un message d'erreur sur cette ligne (voir partie surlignée) : " Impossible de lire la propriété PivotFields de la classe PivotTable."
Dim pt As PivotTable
Application.ScreenUpdating = False
Set wb = ActiveWorkbook
Set wsData = wb.Worksheets("Feuil1")
Set rngData = wsData.Cells(1).CurrentRegion
Set wsPT = wb.Worksheets("Feuil1")
For Each pt In wsPT.PivotTables
pt.TableRange2.Clear
Next pt
Set PTCache = wb.PivotCaches.Create _
(SourceType:=xlDatabase, _
SourceData:=rngData)
Set pt = PTCache.CreatePivotTable _
(TableDestination:=wsPT.Range("AN1"), _
TableName:="TCD_ADPP")
With pt
.AddFields RowFields:="Customer for final sales"
With .PivotFields("Nombre de Commercial Variety ")
.Orientation = xlDataField
.Function = xlCount
End With
End With
Set rngData = Nothing
Set pt = Nothing
Set PTCache = Nothing
Set wsPT = Nothing: Set wsData = Nothing
Set wb = Nothing
End SubJe n'ai pas les compétences pour résoudre ce genre de problème sachant que je débute en VBA...
J'ai aussi indiquer le nom de la feuille du TCD, comme tu m'avais conseillé, par Feuil1 car je veux que mon TCD se trouve sur cette feuille. Est-ce juste ?
Merci
Bonjour,
Vérifie le nom du champ "Nombre de Commercial Variety". Le texte entre guillemets doit être identique au texte dans la feuille de calcul (retire l'espace en fin de texte ?).
Sinon, pour le nom de la feuille pour le TCD, si je comprends bien ton TCD est sur la même feuille que tes données.
Ce qui signifie que wsData = wsPT.
Si c'est le cas la procédure doit être modifiée comme ci-dessous.
Mais n'hésite pas à joindre un fichier à ta demande. Ce sera plus simple.
Option Explicit
Sub créer_tdc()
Dim wb As Workbook
Dim wsData As Worksheet
Dim rngData As Range
Dim PTCache As PivotCache
Dim pt As PivotTable
Application.ScreenUpdating = False
Set wb = ActiveWorkbook
Set wsData = wb.Worksheets("Feuil1")
Set rngData = wsData.Cells(1).CurrentRegion
For Each pt In wsPT.PivotTables
pt.TableRange2.Clear
Next pt
Set PTCache = wb.PivotCaches.Create _
(SourceType:=xlDatabase, _
SourceData:=rngData)
Set pt = PTCache.CreatePivotTable _
(TableDestination:=wsData.Range("AN1"),_
TableName:="TCD_ADPP")
With pt
.AddFields RowFields:="Customer for final sales"
With .PivotFields("Nombre de Commercial Variety")
.Orientation = xlDataField
.Function = xlCount
End With
End With
Set rngData = Nothing
Set pt = Nothing
Set PTCache = Nothing
Set wsPT = Nothing: Set wsData = Nothing
Set wb = Nothing
End SubJe te joins le fichier en PJ.
Dans les macro il y a les deux codes que tu m'as conseillé de faire.
Dans le fichier, les en-têtes de colonne avec les nombres (44,45, etc...) représentent les semaines.
Je souhaite obtenir le tableau en PJ.
Je voudrai que :
- le TCD soit sur la même feuille que les données, soit en feuille 1
- le nom de mon TCD soit "TCD_ADPP"
- le nombre de "commercial variety"
Merci de ton aide en tout cas !
Pour info, ta deuxième macro fonctionne mais ne m'affiche que les étiquettes de lignes, soit les Customer for final sales
Pardon je me suis trompé, ta première macro fonctionne mais n'affiche que les customers for final sales
RE,
Tu as 2 fichiers :
v1 - tel que tu l'as demandé
v2 - tel qu'il devrait être avec des données normalisées en tableau.
Je te laisse découvrir.
Les explications viendront après.
A te relire.
Cdlt.
Merci de ton travail.
J'ai cependant réussi à trouver la solution avec ton début de macro, et cela fonctionne !
Sub créer_tdc1()
Dim wb As Workbook
Dim wsData As Worksheet, wsPT As Worksheet
Dim rngData As Range
Dim PTCache As PivotCache
Dim pt As PivotTable
Application.ScreenUpdating = False
Set wb = ActiveWorkbook
Set wsData = wb.Worksheets("Feuil1")
Set rngData = wsData.Cells(1).CurrentRegion
Set wsPT = wb.Worksheets("Feuil1")
For Each pt In wsPT.PivotTables
pt.TableRange2.Clear
Next pt
Set PTCache = wb.PivotCaches.Create(SourceType:=xlDatabase, SourceData:=rngData)
Set pt = PTCache.CreatePivotTable(TableDestination:=wsPT.Range("AN1"), TableName:="TCD_ADPP")
'1. placer la colonne "Customer for final sales" dans la case "étiquettes de lignes"
With pt.PivotFields( _
"Customer for final sales")
.Orientation = xlRowField
.Position = 1
End With
'2. placer la colonne "Commercial variety" dans la case "Valeurs", et choisir "Nombre" comme fonction de calcul
nom_colonne = Sheets("Feuil1").Range("B1").Value
Titre_colonne_resultat = "Nombre " & nom_colonne
pt.AddDataField pt.PivotFields(nom_colonne), Titre_colonne_resultat, xlCount
Set rngData = Nothing
Set pt = Nothing
Set PTCache = Nothing
Set wsPT = Nothing: Set wsData = Nothing
Set wb = Nothing
End SubJ'en suis venu enfin venu à bout
Bonne fêtes de fin d'année et merci