[VBA] créer des Charts à la volée

créer des Charts à la volée [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 17-09-2009 à 10:56:06    

Bonjour.
 
J'ai généré un paquet de données que je voudrais afficher dans des charts. En gros, J'ai 8 catégories (ensemble de colonnes) divisées en 4 sous-catégories. Et j'ai, sur la gauche (colonne 1) les noms de ce que je veux afficher sur l'axe des abscisses de tous les graphes (graphe type xlColumnStacked)
 
Donc, je voudrais créer 8 graphes, avec en abscisse ce que j'ai en colonne 1, et en ordonnée ce que j'ai marqué en ligne 1 (soit le nom des 8 catégories). Et les 4 sous-catégories sont empilées sur le graphe (vu que c'est un xlColumnStacked).
 
La bonne nouvelle, c'est que les données sont en colonne pile poil comme il faut (à part la première colonne qui est commune, vu que c'est les titres à afficher).
La mauvaise, c'est que j'ai pas tout capté à l'architecture des charts ...
 
Voici donc les questions que je me pose :
1) déjà, j'aimerais afficher 2/3 graphes sur la même page, ça se fait comment ? Avec un ChartObject ? (si oui, j'aimerais bien un exemple pour créer un chartobject avec un nom spécifique ...)
2) J'ai trouvé un code qui m'affiche un graphe ( [:1337] ), sauf qu'il me crée un "sheet" graphe ... (donc il me fait une erreur à chaque fois que je relance la fonction, vu que la feuille existe déjà ...). Ca marche comment pour pas qu'il m'en crée une à chaque fois ? Comme les worksheets ? (genre je la crée à la main, et après j'ai juste à l'appeler par son nom et hop, je peux modifier mon graphe ?)
3) une fois que j'ai créé mon chart, est-ce que je peux l'ajouter à un chartObject ? (s'il faut que je passe par les chartObject ...)
4) Il y a moyen de dire "Ca, c'est ce que je veux que tu affiches sur l'axe des abscisses !" ? J'ai l'impression que la méthode Axes des charts a l'air pas mal, mais ... j'arrive pas à trouver les méthodes liées ... (je suis sur la msdn, voici le super lien que j'ai trouvé >< (changer le nom du chart, je crois que j'avais déjà trouvé ...))
5) une colonne sur 5 est un total partiel de ligne (les 4 colonnes précédentes), et je voudrais faire un graphe de ces totaux. Ca marche comment ? J'avais trouvé une méthode qui avait l'air trop classe, mais j'arrive plus à la retrouver  [:tinostar] (et accessoirement, j'avais pas l'impression qu'elle était liée aux charts, mais genre au chartobjets ..., d'où mon problème)
6) En bas de mon tableau, j'ai fait les totaux par colonnes, et j'aimerais prendre les valeurs des colonnes (genre) 4, 8, 12 pour me faire un camembert. Ca marche comment ? Comme pour faire des charts en bâton avec des colonnes non voisines ?
 
Donc, là, je suis en train de chercher sur le net, mais je trouve pas grand chose (j'ai toujours eu du mal avec la msdn, on va dire), donc si vous pouvez m'aider un petit peu, ça ne serait pas de refu :o
 
Marki  :jap:


---------------
L'amour c'est comme un bilboquet, ça fini toujours par rentrer - La théorie des Ballz
Reply

Marsh Posté le 17-09-2009 à 10:56:06   

Reply

Marsh Posté le 18-09-2009 à 13:41:54    

Bonjour
 
Le plus simple c'est d'enregistrer une macro, et de voir comment il te code ca...
Parceque ce que tu demandes serait en grande partie résolu.
 
Pour mettre le graph dans une feuille :

Code :
  1. Charts.Add
  2. ...   
  3. ActiveChart.Location Where:=xlLocationAsObject, Name:="Le Nom de Ta Feuille"


 
Récupérer le nom du graph:

Code :
  1. NomGraph = Right(ActiveChart.Name, Len(ActiveChart.Name) - Len(ActiveSheet.Name) - 1)


 
Le positionner :

Code :
  1. ActiveSheet.Shapes(NomGraph).Left = Range("A1" ).Left
  2. ActiveSheet.Shapes(NomGraph).Top = Range("A1" ).Top


 
Mettre un titre :

Code :
  1. If ActiveChart.Axes(xlCategory).HasTitle = True Then ActiveChart.Axes(xlCategory).AxisTitle.Delete
  2. ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Texte"


 
Une recherche sur le forum t'aurait amené ici et ici
 
Pour finir, expliquer un tableau a mettre en graphe avec du texte, c'est tout sauf simple. Un screen est/aurait été le bienvenu.
 
Cordialement

Message cité 1 fois
Message édité par SuppotDeSaTante le 18-09-2009 à 13:44:49

---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 18-09-2009 à 14:20:44    

SuppotDeSaTante a écrit :

Bonjour

 

Le plus simple c'est d'enregistrer une macro, et de voir comment il te code ca...
Parceque ce que tu demandes serait en grande partie résolu.

 

Bonjour.

 

Le code que tu fournis crée des sheets de type charts, et je préfère avoir des worksheets.
Ensuite, ton code crée des charts à chaque fois que tu relances ton programme, ce qui arrive exactement à mon problème numéro 2 (enfin, par là  :whistle: ) qui est la recréation d'un sheet déjà existant. Ce à quoi je préfère créer un worksheet (ou un charts) une bonne fois pour toute à la main, et mettre tous les chart (sans s) dedans.
Donc, ce que tu postes, c'est effectivement ce que j'avais déjà, et qui ne me convenait pas.

 
SuppotDeSaTante a écrit :

Une recherche sur le forum t'aurait amené ici et ici

 

Pages que j'avais déjà vu, et qui malheureusement ne me convenait pas  [:mr marron derriere] (d'où mon poste pour en (s)avoir un peu plus)

 
SuppotDeSaTante a écrit :

Pour finir, expliquer un tableau a mettre en graphe avec du texte, c'est tout sauf simple. Un screen est/aurait été le bienvenu.

 

Cordialement

 

Je plussoie cet argument (un dessin vaut bien mieux qu'un long discours). Malheureusement, la politique de la boite interdit l'utilisation de sites tels que imageshack (on sait jamais, des fois qu'on veuille scanner l'intégralité des documents pour les poster là bas ...), ce qui contraint fortement la diffusion d'images (au moins d'un point de vue moral).

 

Mais bon, après plusieurs visite de sites webs (je recommande le site http://peltiertech.com/Excel/Charts/index.html qui contient pas mal de trucs sur les charts), j'en suis arrivé au code suivant :

 
Code :
  1. Function createDisplay()
  2.     Dim chtChartObject As ChartObject
  3.     Dim i As Integer
  4.     Dim j As Integer
  5.    
  6.     Worksheets(Worksheet_Contenant_Les_Charts).ChartObjects.Delete
  7.     i = 0
  8.     While i < GInt_Max And GArray(0, i) <> ""
  9.         j = 1
  10.         Set chtChartObject = Worksheets(Worksheet_Contenant_Les_Charts).ChartObjects.Add(Left:=0, Width:=GC_Int_Chart_Width, Top:=GC_Int_Chart_Length * i, Height:=GC_Int_Chart_Length)
  11.         chtChartObject.Chart.ChartType = xlColumnStacked
  12.         While j <= GInt_Number_Of_Entitées
  13.             chtChartObject.Chart.SeriesCollection.NewSeries
  14.             chtChartObject.Chart.SeriesCollection(j).Name = Worksheets(Worksheet_avec_les_données).Cells(2, i * 4 + j + 1).Value
  15.             chtChartObject.Chart.SeriesCollection(j).XValues = Worksheets(Worksheet_avec_les_données).Range("A3:A53" )
  16.             chtChartObject.Chart.SeriesCollection(j).Values = Worksheets(Worksheet_avec_les_données).Range(TranslateNumberToColumnLetter(i * 4 + j + 1) & "3:" & TranslateNumberToColumnLetter(i * 4 + j + 1) & "53" )
  17.             chtChartObject.Chart.SeriesCollection.NewSeries
  18.         Wend
  19.         chtChartObject.Chart.HasTitle = True
  20.         chtChartObject.Chart.ChartTitle.text = "Facteur : " + Worksheets(Worksheet_avec_les_données).Cells(1, i * 4 + 2).Value + " 20" + Gstr_Year
  21.         chtChartObject.Chart.Axes(xlCategory, xlPrimary).HasTitle = False
  22.         chtChartObject.Chart.Axes(xlValue, xlPrimary).HasTitle = True
  23.         chtChartObject.Chart.Axes(xlValue, xlPrimary).AxisTitle.Characters.text = "Number of données"
  24.         i = i + 1
  25.     Wend
  26. End Function
 

Cette fonction (qui est pas encore très propre) marche (je garantis pas la "compil" par contre, vu que j'ai modifié les noms à l'arrache avant de poster) : je prends les colonnes que je veux avec la fonction "chtChartObject.Chart.SeriesCollection.NewSeries" (enfin, surtout les trois suivantes), qui prennent les données colonnes par colonnes (dans le cas présent, sinon ça marche paté par paté, ou lignes par lignes)
Cette fonction crée plusieurs graphes sur un même worksheet.

 

Voila voila.

 

Note : loin de mon poste toute animosité. J'avais simplement déjà vu ce que tu me montrais, et ce n'était pas ce que je recherchais.

Message cité 1 fois
Message édité par pojev le 18-09-2009 à 14:21:29

---------------
L'amour c'est comme un bilboquet, ça fini toujours par rentrer - La théorie des Ballz
Reply

Marsh Posté le 21-09-2009 à 08:37:29    

pojev a écrit :


 
Bonjour.
 
Le code que tu fournis crée des sheets de type charts, et je préfère avoir des worksheets.
Ensuite, ton code crée des charts à chaque fois que tu relances ton programme, ce qui arrive exactement à mon problème numéro 2 (enfin, par là  :whistle: ) qui est la recréation d'un sheet déjà existant. Ce à quoi je préfère créer un worksheet (ou un charts) une bonne fois pour toute à la main, et mettre tous les chart (sans s) dedans.
Donc, ce que tu postes, c'est effectivement ce que j'avais déjà, et qui ne me convenait pas.
 


C'est que tu n'as pas tout lu ou essayer car c'est bien a ca que sert le ActiveChart.Location Where:=xlLocationAsObject, Name:="Le Nom de Ta Feuille" à placer ton graphique dans une feuille. Et non pas a avoir une feuille de type graphique.
Tu préfères passer par Worksheets().ChartObjects.Add pas de souci, mais ne dis pas que les autres solutions ne fonctionnent pas ;)
 
Et mes posts suivant servent a le positionner dans la feuille.
 
Apres oui "mon code" recréé un graph a chaque fois, mais j'ai donné des pistes, ce n'etait pas à copier/coller et directement fonctionnel.
 
Pas de souci pour l'animosité, je ne l'ai pas pris comme tel. Pis meme si ca avait été le cas, une discussion un peu houleuse est toujours mieux qu'un monologue ;)


---------------
Soyez malin, louez entre voisins !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed