Microsoft 365 Création d'un graph en fonction d'un tableau de taille variable

premion

XLDnaute Junior
Bonsoir à tous,

J'avance sur mon projet... Mais je coince et il est tard... J'ai beau cherché, je ne sais pas comment m'y prendre.

Bref, j'ai résumé dans le fichier joint ce que je souhaite faire. A savoir réaliser un graph dont les séries s'adaptent au tableaux, les noms sont repris automatiquement.

Le nombre de colonnes du tableau peut varier jusqu'à 15 environ, et le nombre de ligne aussi, mais normalement pas plus de 2O.

J'arrive à sélectionner le tableau et ai définit un nom de plage qui suit les variations de ce tableau. Mais c'est après que je coince. Je pense qu'il n'y a qu'en VBA que je pourrai obtenir un résultat, mais je n'y connais encore rien en programmation...

Si quelqu'un peut m'aider, me mettre sur la piste, me conseiller, ce serait vraiment top! (comme toujours!)

Merci par avance et bonne nuit!

Philippe
 

Pièces jointes

  • Création d'un graph en fonction d'un tableau de taille variable.xlsx
    20.7 KB · Affichages: 13

danielco

XLDnaute Accro
Bonjour,

Tu demandes un gros travail. Fournis au moins tous les renseignements à fin d'épargner un gros travail de collecte. Donne tous les éléments de format de tous les éléments du graphique. Vérifie bien que ton classeur est identique en tout point à l'original (aux données près).

Cordialement.

Daniel
 

premion

XLDnaute Junior
Bonjour Daniel,

Merci beaucoup pour ta réponse, sincèrement désolé si cela représente beaucoup de travail :oops:

Je joins mon fichier sur lequel j'ai ajouté des commentaires. il faut se concentrer uniquement sur la partie graph. Le graph récupère les données du tableau en ligne. Ces données varient en fonction de filtres que j'ajoute en amont et que je ne réintègre pas ici pour ne pas compliquer plus ma demande.
Je pense avoir expliqué au maximum dans mon fichier les tableaux et le graph tel qu'il sont actuellement (le graph extrait déjà les données du tableau en ligne mais lorsque de nouvelles séries sont ajoutées, il faut que je modifie manuellement le graph. J'élimine aussi les valeurs zéro qui n'existent pas dans mes prix)

N'hésite pas, bien entendu, si tu as d'autres questions.

Et encore un grand merci au forum pour votre aide à tous!

Philippe
 

Pièces jointes

  • Création d'un graph en fonction d'un tableau de taille variable.xlsx
    22.7 KB · Affichages: 9

danielco

XLDnaute Accro
Juste un dernier point. Pour ne pas faire apparaître les valeurs nulles, la méthode habituelle est de les remplacer par "#NA!". Les formules deviendraient donc :
=SI((SOMME.SI($B$6:$B$12;I6;$C$6:C12))=0;NA();SOMME.SI($B$6:$B$12;I6;$C$6:$C$12))
en J6.
Est-ce que tu es d'accord ?

Daniel
 

danielco

XLDnaute Accro
Voila. J'ai créé la macro"CreeSeries" qui supprime et recrée les séries. Je n'ai trouvé qu'un défaut : les marques de la première série restent entourées d'un trait bleu alors que ce n'est pas le cas pour les autres. Je vais poser la question au forum :

VB:
Sub CreerSeries()
  Dim Graph As Chart, I As Long, PlageX As Range, PlageY As Range, Col As Integer
  Dim Etiq As String
  Set Graph = Sheets("feuil1").ChartObjects(1).Chart
  With Sheets("Feuil1")
    Set PlageX = .Range("H6").Resize(Application.CountIf(.[H:H], "><") - 1)
    Col = .Rows(5).Find("Prix", , xlValues, , xlByColumns, xlPrevious).Column
    Set PlageY = PlageX.Offset(, 2)
  End With
  With Graph
    For I = .SeriesCollection.Count To 1 Step -1
      .SeriesCollection(I).Delete
    Next I
    'creation des series
    For I = 0 To Col - 10 Step 2
      Set PlageY = PlageY.Offset(, I)
      .SeriesCollection.NewSeries
      With .SeriesCollection(.SeriesCollection.Count)
        .Values = "=Feuil1!" & PlageY.Address
        .XValues = "=Feuil1!" & PlageX.Address
        'mise en forme de la série
        .Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent2
        .Format.Line.Visible = msoFalse
        .MarkerStyle = 8
        .MarkerSize = 5
        .MarkerStyle = 1
        .MarkerSize = 8
        'étiquettes de données
        .ApplyDataLabels
        With .DataLabels
          Etiq = "=Feuil1!" & PlageY.Offset(, -1).Address
          .Format.TextFrame2.TextRange.InsertChartField msoChartFieldRange, Etiq, 0
        End With
      End With
    Next I
  End With
End Sub

En attendant, peux tester le classeur ?

Daniel
 

Pièces jointes

  • Micka52 Projet Magasin 2.0.xlsm
    58.9 KB · Affichages: 6
  • Micka52 Projet Magasin 2.0.xlsm
    58.9 KB · Affichages: 7

premion

XLDnaute Junior
Voila. J'ai créé la macro"CreeSeries" qui supprime et recrée les séries. Je n'ai trouvé qu'un défaut : les marques de la première série restent entourées d'un trait bleu alors que ce n'est pas le cas pour les autres. Je vais poser la question au forum :

VB:
Sub CreerSeries()
  Dim Graph As Chart, I As Long, PlageX As Range, PlageY As Range, Col As Integer
  Dim Etiq As String
  Set Graph = Sheets("feuil1").ChartObjects(1).Chart
  With Sheets("Feuil1")
    Set PlageX = .Range("H6").Resize(Application.CountIf(.[H:H], "><") - 1)
    Col = .Rows(5).Find("Prix", , xlValues, , xlByColumns, xlPrevious).Column
    Set PlageY = PlageX.Offset(, 2)
  End With
  With Graph
    For I = .SeriesCollection.Count To 1 Step -1
      .SeriesCollection(I).Delete
    Next I
    'creation des series
    For I = 0 To Col - 10 Step 2
      Set PlageY = PlageY.Offset(, I)
      .SeriesCollection.NewSeries
      With .SeriesCollection(.SeriesCollection.Count)
        .Values = "=Feuil1!" & PlageY.Address
        .XValues = "=Feuil1!" & PlageX.Address
        'mise en forme de la série
        .Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent2
        .Format.Line.Visible = msoFalse
        .MarkerStyle = 8
        .MarkerSize = 5
        .MarkerStyle = 1
        .MarkerSize = 8
        'étiquettes de données
        .ApplyDataLabels
        With .DataLabels
          Etiq = "=Feuil1!" & PlageY.Offset(, -1).Address
          .Format.TextFrame2.TextRange.InsertChartField msoChartFieldRange, Etiq, 0
        End With
      End With
    Next I
  End With
End Sub

En attendant, peux tester le classeur ?

Daniel

Bonsoir Daniel,

Mille mercis pour ton travail. J'étais en déplacement toute la journée et n'ai pas eu la possibilité de tester ta réponse plus tôt.

J'ai chargé tes 2 classeurs, mais je pense qu'ils ne me sont pas destinés!

Je vais quand même essayer ta macro dans mon fichier!

Très bonne soirée à toi et merci encore pour ton temps!

Philippe
 

premion

XLDnaute Junior
Voila. J'ai créé la macro"CreeSeries" qui supprime et recrée les séries. Je n'ai trouvé qu'un défaut : les marques de la première série restent entourées d'un trait bleu alors que ce n'est pas le cas pour les autres. Je vais poser la question au forum :

VB:
Sub CreerSeries()
  Dim Graph As Chart, I As Long, PlageX As Range, PlageY As Range, Col As Integer
  Dim Etiq As String
  Set Graph = Sheets("feuil1").ChartObjects(1).Chart
  With Sheets("Feuil1")
    Set PlageX = .Range("H6").Resize(Application.CountIf(.[H:H], "><") - 1)
    Col = .Rows(5).Find("Prix", , xlValues, , xlByColumns, xlPrevious).Column
    Set PlageY = PlageX.Offset(, 2)
  End With
  With Graph
    For I = .SeriesCollection.Count To 1 Step -1
      .SeriesCollection(I).Delete
    Next I
    'creation des series
    For I = 0 To Col - 10 Step 2
      Set PlageY = PlageY.Offset(, I)
      .SeriesCollection.NewSeries
      With .SeriesCollection(.SeriesCollection.Count)
        .Values = "=Feuil1!" & PlageY.Address
        .XValues = "=Feuil1!" & PlageX.Address
        'mise en forme de la série
        .Format.Fill.ForeColor.ObjectThemeColor = msoThemeColorAccent2
        .Format.Line.Visible = msoFalse
        .MarkerStyle = 8
        .MarkerSize = 5
        .MarkerStyle = 1
        .MarkerSize = 8
        'étiquettes de données
        .ApplyDataLabels
        With .DataLabels
          Etiq = "=Feuil1!" & PlageY.Offset(, -1).Address
          .Format.TextFrame2.TextRange.InsertChartField msoChartFieldRange, Etiq, 0
        End With
      End With
    Next I
  End With
End Sub

En attendant, peux tester le classeur ?

Daniel

Bonsoir Daniel,

Mille mercis pour ton travail. J'étais en déplacement toute la journée et n'ai pas eu la possibilité de tester ta réponse plus tôt.

J'ai chargé tes 2 classeurs, mais je pense qu'ils ne me sont pas destinés!


J'ai bien adapté la macro à mon fichier original, ça marche très bien pour la création des séries. Je suis super content!
Tu me confirmes que je peux mettre autant de séries que je souhaite et de marques? Ou y'a-t'il une limitation. C'est juste pour savoir.

Par ailleurs, comme tu me parlais de modifications sur mes tableaux originels, je suppose que cela solutionne les problèmes de valeurs 0. J'attends de voir tes fichiers pour pouvoir les tester.

En tous cas, c'est top, merci beaucoup!

Philippe
 

danielco

XLDnaute Accro
Bonjour Philippe,

Tu me confirmes que je peux mettre autant de séries que je souhaite et de marques? Ou y'a-t'il une limitation. C'est juste pour savoir.
Oui. Attention, cependant, pour dimensionner le tableau, je me base sur la dernière cellule de la ligne 5 contenant "Prix" (actuellement N5). Il est peut-être plus judicieux de mettre :
VB:
Col = .Rows(5).Find("*", , xlValues, , xlByColumns, xlPrevious).Column
au lieu de
VB:
Col = .Rows(5).Find("Prix", , xlValues, , xlByColumns, xlPrevious).Column
Par ailleurs, comme tu me parlais de modifications sur mes tableaux originels, je suppose que cela solutionne les problèmes de valeurs 0. J'attends de voir tes fichiers pour pouvoir les tester.
C'est réglé par la modification des formules :
En J6 :
=SI((SOMME.SI($B$6:$B$12;I6;$C$6:C12))=0;NA();SOMME.SI($B$6:$B$12;I6;$C$6:$C$12))

Daniel
 

premion

XLDnaute Junior
Bonsoir Daniel,

C'est génial! Merci beaucoup, le code fonctionne très bien et répond complètement à mon besoin.
Merci beaucoup pour ton temps qui m'en a fait gagné beaucoup!

J'ai juste un dernier point je vois bien qu'avec les lignes de code:

.ApplyDataLabels
With .DataLabels
Etiq = "=Feuil1!" & PlageY.Offset(, -1).Address
.Format.TextFrame2.TextRange.InsertChartField msoChartFieldRange, Etiq, 0

Tu essaies de faire apparaître les noms des produits en étiquette de valeur. Malheureusement, ça ne fonctionne pas chez moi.
Si je comprends bien, la plage Etiq recherche l'adresse de la cellule à gauche de la plage Y?

Bref, ça ne fonctionne pas...

Je vais chercher de mon côté aussi!

Mille mercis encore pour ton temps!

Philippe
 

danielco

XLDnaute Accro
Bonjour,

Oui, c'est exactement cela. Est-ce que tu as une erreur ? Si oui, quel est le message et le numéro ?
Je vais mettre au point, si possible, un contournement. "InsertChartField" est une nouveauté apparue avec Excel 2010 ou Excel 2013. Ca ne devrait pas poser de problème puisque tu as un abonnement 365.

Daniel
 

premion

XLDnaute Junior
Bonjour,

Oui, c'est exactement cela. Est-ce que tu as une erreur ? Si oui, quel est le message et le numéro ?
Je vais mettre au point, si possible, un contournement. "InsertChartField" est une nouveauté apparue avec Excel 2010 ou Excel 2013. Ca ne devrait pas poser de problème puisque tu as un abonnement 365.

Daniel

Bonjour Daniel,

Non aucun message d'erreur, le graph affiche juste les valeurs chiffrées et non les références.

Je ne sais pas déboguer une macro... J'ai essayé de changer l'offset pour voir s'il allait chercher dans la bonne colonne... Aucun changement. Je me demande s'il le code tient compte de la ligne de code, car quel que soit le changement, il ne se passe rien...

Merci encore pour ton temps!

Philippe
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG