Problème avec un tableau croisé dynamique en VBA
Bonjour, je viens de commencer à coder sous vba et j'ai un petit problème avec mon code qui me renvoit (argument non facultatif) en surlignant le.AddDataField. Voici mon code
Sub creation_TCD()
Dim Ma_feuille As Worksheet
Dim Mon_cache As PivotCache
Dim Mon_TCD As PivotTable
Dim mois As Variant
Set Ma_feuille = Worksheets.Add
Set Mon_cache = ActiveWorkbook.PivotCaches.Create(xlDatabase, "Synt_charge")
Set Mon_TCD = Mon_cache.CreatePivotTable(Ma_feuille.Range("A3"))
Mon_TCD.PivotFields("PQA Engineer").Orientation = xlRowField
Mon_TCD.PivotFields("Project Type").Orientation = xlColumnField
For i = 3 To 21
mois = Worksheets("Synt_charge").Cells(1, i).Value
With Mon_TCD
.AddDataField.PivotFields ("mois"), "charge", xlSum
.DataField("mois").NumberFormat = "0"
End With
End SubLe problème viendrait il du for? En fet la jai mis jusqu'a 21 pour tester, mais comme ce chiffre pourra changer en fonction de la volonté de l'utilisateur,c'est pour cela que j'avais besoin d'effectuer une boucle avec un for. Et ne connaissant pas bien la synthaxe à utiliser ni si cela est possible, pourriez vous m'aider?
Bonjour,
Il est de bonne habitude de ne pas poster la même question sur un autre forum ou alors d'avoir au moins la correction de prévenir. Cela évite de faire perdre du temps à celui qui te lit et de laisser d'autres fils en suspend.
Il te manque NEXT juste avant END SUB. Pour le reste il faut voir le fichier.
A bientôt
Désolé, je ne savais, c'était pour etre sur d'avoir une réponse rapide.
J'ai rajouté le next, mais jai toujours le meme problème
Pour ce qui est du fichier, je ne peux pas le donner car je fais un stage confidentiel
Mais en tout cas, merci quand même.
@+
re,
Ne peux-tu mettre des données bidons ou enlever les données confidentielles ??
Si non, utilise l'enregistreur automatique d'excel pour faire le code puis colle le ici.
Mon fichier est super gros, donc c'est un peu dur de remplacer les donnés confidentielles, mais en regardant avec l'enregistreur de macro, j'ai essayé d'inclure ma boucle for.
Voila ce que j'obtiens , mais j'ai une erreur de type 1004 a la derniere ligne
Sub TCD()
Dim mois As Variant
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Synt_charge!R1C1:R63C20").CreatePivotTable TableDestination:="", TableName _
:="Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"PQA Engineer")
.Orientation = xlRowField
.Position = 1
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"Project Type")
.Orientation = xlColumnField
.Position = 1
End With
For i = 3 To 20
mois = Worksheets("Synt_charge").Cells(1, i).Value
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields(mois), _
"charge", xlSum
Next i
End SubSinon le code de l'enregistreur de macro etait celui ci
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Synt_charge!R1C1:R63C20").CreatePivotTable TableDestination:="", TableName _
:="Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"PQA Engineer")
.Orientation = xlRowField
.Position = 1
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"Project Type")
.Orientation = xlColumnField
.Position = 1
End With
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields("août-10"), _
"Somme de août-10", xlSum
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields("septembre-10"), _
"Somme de septembre-10", xlSum
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields("octobre-10"), _
"Somme de octobre-10", xlSum
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields("novembre-10"), _
"Somme de novembre-10", xlSum
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields("décembre-10"), _
"Somme de décembre-10", xlSum
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields("janvier-11"), _
"Somme de janvier-11", xlSum
End SubLe probleme que j'ai , c'est que mes entete de mois ne seront pas toujour les memes, car pour construire mon tableau initial, j'ai utilisé la fonction "TODAY" que j'ai incrémenté de 1 pour avoir les 18 prochains mois et je ne sais pas comment remplir ce champ .PivotFields("janvier-11"), _
re,
Peux-tu m'envoyer un fichier avec juste la première ligne contenant les titres de ta base de données "Synt charges"
voila le fichier mais si tu veux, la feuille Synt_mois est créer par une marcro qui actualise les mois en fonction de la date d'aujourdhui, c'est a dire que des que l'on sera le 1er Septembre, la colonne Aout sera remplacé par septembre, celle septembre pas octobre et ainsi de suite, d'ou mon problème pour construire mon tableau croisé dynamique
re,
C'est bien ce que je pensais....
Tu ne vas jamais en sortir comme cela car tu dois savoir que le TCD conserve les vieux "items". Donc tout ce que tu élimineras reste en liste dans les filtres du TCD.
Juste une question, c'est une planification de projet que tu réalises ??
oui c'est bien une planification de projet
Mais ce que tu me dit ne s'appliquera pas a ma macro( en tout cas je pense), parcequ'elle sera lancée à chaque extraction d'une base de donnée et recommencera tout les calcul
Penses tu qu'il ya une solution a mon probléme( la construction du tcd?)
re,
Si le TCD sert à faire des sommes de dépenses ou autres, on peut résoudre le souci. si c'est pour visualiser un "planning" journalier genre plan de charge de travail il faut passer à autre chose.
Dans ton fichier, j'aimerais que tu mettes quelques données sur 3 lignes et ce, pour chaque colonne. Ensuite poste le fichier ici, j'essayerai de voir ce que l'on peut faire.
A te relire
Escuse moi pour la réponse tardive,j'étais partie du travail avant de voir ta réponse.
en fait je dois pouvoir visualiser la charge de travail par mois par personne
Jte remplis le fichier demin matin
Et jte remercie
re,
Ok. En attendant vois ce lien --> https://forum.excel-pratique.com/excel/creer-et-gerer-un-planning-avec-graphique-t18404-10.html dans lequel j'étais en train de réaliser un fichier pour Artnog.
Cela pourrait te donner des idées.
A te relire
Alors je t'envoies le fichier avec quelques lignes remplies, jme suis arrété au mois de décembre.
Et je vais regarder ton lien
-- 10 Aoû 2010, 10:00 --
Je viens de regarder le lien, cette solution ne me convient pas vraiment, parcequ'en fait j'aimerais arriver à pouvoir visualiser un graph tels que celui que je vais te mettre en fichier, et pour cela, j'aurais besoin de passer par un tableau croisé dynamique.
Bonsoir,
Salut Dan
Essaie avec ce code :
Sub TCD()
Dim mois As String
Dim DerLig As Long
Dim DerCol As Integer, I As Integer
Application.ScreenUpdating = False
With Sheets("Synt_charge")
DerLig = .[A65000].End(xlUp).Row 'dernière ligne de la feuille Synt_charge
DerCol = .[IV2].End(xlToLeft).Column 'dernière colonne de la ligne 2 de la feuille Synt_charge
.Range(.Cells(1, 1), .Cells(DerLig, DerCol)).Name = "base" 'zone nommée
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"base").CreatePivotTable TableDestination:="", TableName _
:="Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
End With
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
With ActiveSheet.PivotTables("Tableau croisé dynamique1")
With .PivotFields("PQA Engineer")
.Orientation = xlRowField
.Position = 1
End With
With .PivotFields("Project Type")
.Orientation = xlColumnField
.Position = 1
End With
For I = 3 To DerCol
mois = Format(Worksheets("Synt_charge").Cells(1, I).Value, "mmmm-yy") 'regarde le format
.AddDataField .PivotFields(mois), "Somme de " & mois, xlSum
Next I
End With
End SubBonne soirée
oh c'est exactement ce que je voulais. En fait mon problème venait du fait qu'il fallait indiquer le format de ma variable mois?
Je te remercie ainsi que dan pour votre aide
Re-,
En fait mon problème venait du fait qu'il fallait indiquer le format de ma variable mois?
Oui, Un TCD prend comme champ le format que tu indiques dans tes cellules. (donc le format visible)
Si tu avais mis un format "09/09/10", il aurait fallu lui indiquer ce format.
Bonne soirée
re,
Avec les fichiers c'est mieux.
Je reviens sur ce que j'ai dit concernant ta recherche par TCD.
Puis que ok avec la solution de Cousinhub, n'oublie pas de cocher la V vert à coté du bouton Editer pour cloturer le fil.
A bientôt
Edit : Quelques soucis avec le code de Cousinhub suivant la version d'excel. Code adapté si besoin
Sub TCD()
Dim mois As String
Dim DerLig As Long
Dim DerCol As Integer, I As Integer
Application.ScreenUpdating = False
With Sheets("Synt_charge")
DerLig = .[A65000].End(xlUp).Row
DerCol = .[IV2].End(xlToLeft).Column
.Range(.Cells(1, 1), .Cells(DerLig, DerCol)).Name = "base"
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"base").CreatePivotTable TableDestination:="", TableName _
:="Tableau croisé dynamique1"
End With
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
With ActiveSheet.PivotTables("Tableau croisé dynamique1")
With .PivotFields("PQA Engineer")
.Orientation = xlRowField
End With
With .PivotFields("Project Type")
.Orientation = xlColumnField
End With
For I = 3 To DerCol
mois = Format(Worksheets("Synt_charge").Cells(1, I).Value, "mmmm-yy")
.PivotFields(I).Orientation = xlDataField
Next I
End With
End SubAmicalement et bonne nuit à Cousinhub !