Graphique depuis TCD

Bonjour,

Je mets à jour avec vba sur une même feuille Excel 3 TCD qui font références à 3 feuilles de données.
J'aimerais pouvoir mettre à jour les graphiques correspondants.
Seulement le code que j'utilise me reprend systématiquement pour les 3 graphiques le même TCD source. (Le 1er)
Pouvez vous me dire comment procéder pour que chaque graphique fasse référence au TCD nommé ?

Merci par avance

8 réponses

  1. Contributeur
    bonjour,
    c'est quasi impossible, à moins que tu nous donnes plus d'information.
    0
    1. Bonjour,

      Sur une feuille TCD, je crée un 1er TCD en cellule A1qui se nome "tcd1". Il fait référence à un tableau, lui même nommé "tdb1".
      Le graphique est correctement créé.

      En A15, je crée un autre TCD nommé "tcd2" qui fait référence à un tableau (différent du 1er), lui même nommé "tdb2"
      Le graphique est créé mais reprend les mêmes infos que le "tcd1", ils sont identiques.. la source est la même.

      En A30 je crée un autre TCD qui vient lui aussi dune autre feuille qui contient un tableau nommé "tdb3" lui aussi différent des deux 1er.
      Le graphique est créé mais la encore la source est la même que pour le 1er graph.

      Comment puis je lier les graphiques créés a chacun des TCD ?
      Est ce la bonne manière ? Et sinon comment procéder ?
      D'avance merci!
      0
    2. Contributeur
      @Mikepar quel hasard le second graphique hérite-t'il des infos du premier?
      ton code VBA est-il secret?
      0
  2. Bonjour,

    Ci dessous le code utilisé :

    Set PvtTCD = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="tableau_1").CreatePivotTable(TableDestination:=WsTCD.Range("A1"), TableName:="TCD_1")

    WsTCD.Shapes.AddChart.Name = "Graph_1"
    With ActiveSheet.PivotTables("TCD_1")
    .InGridDropZones = True
    .RowAxisLayout xlTabularRow
    End With

    ' Ajout critère
    With PvtTCD.PivotFields("Ville")
    .Orientation = xlRowField
    .Position = 1
    End With

    'Suppression des sous totaux
    For Each Champs In PvtTCD.PivotFields
    If Champs.Orientation = 1 Then Champs.Subtotals = Array(False, False, False, False, _
    False, False, False, False, False, False, False, False)
    Next Champs

    ' Ajout des valeurs
    PvtTCD.AddDataField ActiveSheet.PivotTables("TCD_1").PivotFields("Nb Habitant"), "Somme de Nb Habitant", xlSum
    PvtTCD.AddDataField ActiveSheet.PivotTables("TCD_1").PivotFields("Nb Ménages"), "Somme de Nb Ménages", xlSum

    '////////////////////////////////// Ajout TCD avec Graphique 2 //////////////////////////////////////////////////////////

    ' Ajout d'un TCD s
    Set PvtTCD = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="tableau_Ws2") .CreatePivotTable(TableDestination:=WsTCD.Range("A15"), TableName:="TCD_2")
    WsTCD.Shapes.AddChart.Name = "Graph_2"

    With ActiveSheet.PivotTables("TCD_2")
    .InGridDropZones = True
    .RowAxisLayout xlTabularRow
    End With

    ' Ajout critère
    With PvtTCD.PivotFields("Ville")
    .Orientation = xlRowField
    .Position = 1
    End With

    'Suppression des sous totaux
    For Each Champs In PvtTCD.PivotFields
    If Champs.Orientation = 1 Then Champs.Subtotals = Array(False, False, False, False, _
    False, False, False, False, False, False, False, False)
    Next Champs

    ' Ajout valeurs
    PvtTCD.AddDataField ActiveSheet.PivotTables("TCD_2").PivotFields("Numéro d'ordre"), "Somme de Numéro d'ordre", xlCount
    0
    1. Contributeur
      je ne vois rien dans ton code qui s'occupe de configurer les graphes.
      peux-tu partager ton fichier?
      0
  3. Oui c'est bien mon problème , je ne trouve pas les commandes me permettant de réaliser cela. Et de faire de lien avec le tps.
    Serais tu m'indiquer comment procéder ?
    0
    1. Contributeur
      as-tu essayé avec l'enregistreur de macros?
      0
  4. Oui j'ai essayé l'enregistreur, et j'obtiens cela :

    ActiveChart.SetSourceData Source:=Range("TCD!$A$1:$C$9")


    La source est une plage de donnée, mais si j'essaye de mettre le nom du TCD, cela ne fonctionne pas.
    0
    1. Contributeur
      peut-être ainsi (non testé, tu n'as pas partagé ton fichier):
      dim gr2 as shape, PvtTCD2 as pivottable
      Set PvtTCD2 = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="tableau_Ws2") .CreatePivotTable(TableDestination:=WsTCD.Range("A15"), TableName:="TCD_2")
      set gr2 = WsTCD.Shapes.AddChart
      gr2.Name = "Graph_2"
      gr2.SetSourceData Source:=PvtTCD2.TableRange1
      0
  5. Merci pour ton retour,

    Le code ne fonctionne pas, il bloque sur :
    gr2.SetSourceData Source:=PvtTCD2.TableRange1


    cela fonctionne si je supprime le TCD, et défini la plage de donnée avec un Range, mais je préférerais le faire directement depuis le TCD si possible.

    Est ce que tu as une solution ?

    Je joins un fichier d'exemple

    https://www.transfernow.net/files/?utm_source=RUn44I012021&utm_medium=&utm_content=en
    0
    1. Contributeur
      bloque-t'il avec un message d'erreur?
      0
  6. Oui le message est le suivant :

    Erreur d'exécution 438

    Propriété ou méthode non gérée par cet objet
    0
    1. Contributeur
      suggestion:
      Option Explicit
      
      Sub test()
      
      Dim WsTCD As Worksheet, PvtTCD As PivotTable, PvtTCD2 As PivotTable, Champs As PivotField
      Set WsTCD = ActiveWorkbook.Sheets("TCD")
      WsTCD.[A11].Select
      Set PvtTCD = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="Tableau1"). _
                      CreatePivotTable(TableDestination:=WsTCD.Range("A1"), TableName:="TCD_1")
      WsTCD.Activate
                  With ActiveSheet.PivotTables("TCD_1")
                      .InGridDropZones = True
                      .RowAxisLayout xlTabularRow
                  End With
                  
              ' Ajout  critère
                  With PvtTCD.PivotFields("Ville")
                      .Orientation = xlRowField
                      .Position = 1
                  End With
                      
          'Suppression des sous totaux
                      For Each Champs In PvtTCD.PivotFields
                          If Champs.Orientation = 1 Then Champs.Subtotals = Array(False, False, False, False, _
                          False, False, False, False, False, False, False, False)
                      Next Champs
                                  
          ' Ajout des valeurs
                  PvtTCD.AddDataField ActiveSheet.PivotTables("TCD_1").PivotFields("Nbre Habitant"), "Somme de Nbre Habitant", xlSum
                       
      '//////////////////////////////////  Ajout TCD 2 //////////////////////////////////////////////////////////
           
              ' Ajout d'un TCD s
                  Set PvtTCD2 = ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:="Tableau2") _
                  .CreatePivotTable(TableDestination:=WsTCD.Range("A15"), TableName:="TCD_2")
                  
                  With ActiveSheet.PivotTables("TCD_2")
                      .InGridDropZones = True
                      .RowAxisLayout xlTabularRow
                  End With
                  
              ' Ajout  critère
                  With PvtTCD2.PivotFields("Ville")
                      .Orientation = xlRowField
                      .Position = 1
                  End With
                      
          'Suppression des sous totaux
                      For Each Champs In PvtTCD.PivotFields
                          If Champs.Orientation = 1 Then Champs.Subtotals = Array(False, False, False, False, _
                          False, False, False, False, False, False, False, False)
                      Next Champs
                                  
          ' Ajout valeurs
                  PvtTCD2.AddDataField ActiveSheet.PivotTables("TCD_2").PivotFields("Nbre Ménages"), "Somme de Nbre Ménages", xlSum
      
      
      '///////////////////////////////////////// Création des graph ////////////////////////
                  Dim gr1 As Shape
                  Set gr1 = WsTCD.Shapes.AddChart
                  gr1.Name = "Graph_1"
                  Dim s1 As Range, s2 As Range
                  Set s1 = PvtTCD.TableRange1
                  gr1.Chart.SetSourceData Source:=s1
      
                  Dim gr2 As Shape
                  Set gr2 = WsTCD.Shapes.AddChart
                  gr2.Name = "Graph_2"
                  Set s2 = PvtTCD2.TableRange1
                  gr1.Chart.SetSourceData Source:=s1
                  gr2.Chart.SetSourceData Source:=s2
      End Sub
      
      0
      1. Merci pour cette proposition, le

         gr2.Chart.SetSourceData Source:=s2


        génère un message d'erreur,


        je ne comprend pas pourquoi !?
        0
        1. Contributeur
          as-tu testé le code complet que j'ai envoyé?
          0