Office 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
 

Fichiers joints

danielco

XLDnaute Occasionnel
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
 

Fichiers joints

danielco

XLDnaute Occasionnel
J'ai à peu près fait le tour de la question, du moins, je le pense. Il faudra ajouter ou supprimer des séries. Je ferme pour le weedkend. Je te tiens au courant.

Daniel
 

danielco

XLDnaute Occasionnel
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
 

premion

XLDnaute Junior
Ça ne me pose aucun souci bien entendu !
Du moment que la formule au-dessus (J5) fonctionne

Est-ce que mes explications étaient claires ?

Merci beaucoup

Philippe
 

danielco

XLDnaute Occasionnel
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
 

Fichiers joints

danielco

XLDnaute Occasionnel
PS. Il y a deux fichiers joints qui apparaissent. Je ne peux pas modifier le post. Prends le plus récent.

Daniel
 

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 Occasionnel
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 Occasionnel
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
 

danielco

XLDnaute Occasionnel
Effectivement, mauvaise recopie !

Mets :

VB:
        With .DataLabels
          Etiq = "=Feuil1!" & PlageY.Offset(, -1).Address
          .Format.TextFrame2.TextRange.InsertChartField msoChartFieldRange, Etiq, 0
          .ShowRange = True
          .ShowValue = False
        End With
Daniel
 

premion

XLDnaute Junior
Merci Daniel!!!!

C'est génial!

Mille mercis pour ton temps ainsi qu'à Job75!
Tout fonctiopnne exactement comme je le souhaitais!

Bonne soirée à toi et à tout le forum!

Philippe
 

premion

XLDnaute Junior
Daniel,

Désolé, mais j'ai un souci...

Pour une raison, que je ne comprends évidemment pas... Le graph ne me récupère pas toutes les données du tableau. Si par exemple en marque AA tui mets 3 références, il n'en affiche que 2 dans le graph.... En fait, au maximum le graph n'affiche que 2 valeurs sur 3...

As-tu remarqué le même souci? Aurais-tu une idée?

Merci par avance à nouveau....

Philippe
 

Discussions similaires


Haut Bas