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 Sub

Le 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 Sub

Sinon 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 Sub

Le 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

70fichier-exemple.xls (13.50 Ko)

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 Sub

Bonne 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 Sub

Amicalement et bonne nuit à Cousinhub !

Rechercher des sujets similaires à "probleme tableau croise dynamique vba"