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. Merci pour cette proposition, le

     gr2.Chart.SetSourceData Source:=s2


    génère un message d'erreur,


    je ne comprend pas pourquoi !?
    1. Contributeur
      as-tu testé le code complet que j'ai envoyé?
  2. 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
    
    1. Oui le message est le suivant :

      Erreur d'exécution 438

      Propriété ou méthode non gérée par cet objet
      1. 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
        1. Contributeur
          bloque-t'il avec un message d'erreur?
      2. 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.
        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
      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 ?
        1. Contributeur
          as-tu essayé avec l'enregistreur de macros?
      4. 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
        1. Contributeur
          je ne vois rien dans ton code qui s'occupe de configurer les graphes.
          peux-tu partager ton fichier?
      5. Contributeur
        bonjour,
        c'est quasi impossible, à moins que tu nous donnes plus d'information.
        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!
        2. Contributeur
          @Mikepar quel hasard le second graphique hérite-t'il des infos du premier?
          ton code VBA est-il secret?