[VBA] Problème redimensionnement et positionnement de graphique

Problème redimensionnement et positionnement de graphique [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 23-07-2009 à 11:58:29    

Bonjour à tous.  
 
Je rencontre actuellement un problème avec l'intégration d'un graphique dans une de mes feuilles Excel. Le graphique s'insère bien dans ma feuille et représente les bonnes valeurs ; mais les choses se corsent lorsque je commence à dimensionner et positionner le graphique en question. :(  
 
En effet, dès que je fais appel à ActiveChart.ChartArea.Width/Top/Left/Height, un sublime message d'erreur apprait :  
Erreur d'exécution '1004'  
Impossible de définir la propriété Left de la classe ChartArea
(ou Top, ou Height, ou Width)  
 
Je ne sais si vous y verrez plus clair mais je me permet de joindre mon bout de code qui permet l'intégration du graphique :
 

Code :
  1. Sub AjoutBarreAvancement()
  2. Sheets("CFR" ).Activate
  3. Num = Range("B65536" ).End(xlUp).Row
  4. Charts.Add
  5. With ActiveChart
  6.     .ChartType = xlBarStacked
  7.     .SetSourceData Sheets("CFR" ).Range("B6:B" & Num & ",V6:W" & Num), xlColumn
  8.     .SeriesCollection(1).XValues = "=CFR!R6C2:R" & Num & "C2"
  9.     .SeriesCollection(1).Values = "=CFR!R6C22:R" & Num & "C22"
  10.     .SeriesCollection(2).XValues = "=CFR!R6C2:R" & Num & "C2"
  11.     .SeriesCollection(2).Values = "=CFR!R6C23:R" & Num & "C23"
  12.     .Location xlLocationAsObject, "CFR"
  13. End With
  14. With ActiveChart.Axes(xlValue)
  15.         .MinimumScaleIsAuto = True
  16.         .MaximumScale = 1
  17.         .MinorUnitIsAuto = True
  18.         .MajorUnitIsAuto = True
  19.         .Crosses = xlAutomatic
  20.         .ReversePlotOrder = False
  21.         .ScaleType = xlLinear
  22.         .DisplayUnit = xlNone
  23. End With
  24. ActiveChart.Axes(xlCategory).ReversePlotOrder = True
  25. ActiveChart.Axes(xlValue).MaximumScale = 1
  26. ActiveChart.HasAxis(xlCategory, xlPrimary) = False
  27. ActiveChart.HasAxis(xlValue, xlPrimary) = False
  28. ActiveChart.Axes(xlCategory, xlPrimary).CategoryType = xlAutomatic
  29. ActiveChart.Axes(xlCategory).HasMajorGridlines = False
  30. ActiveChart.Axes(xlCategory).HasMinorGridlines = False
  31. ActiveChart.HasLegend = False
  32. ActiveChart.HasDataTable = False
  33. ActiveChart.ChartArea.Select
  34. With ActiveChart.ChartArea
  35.     .Left = Range("V6" ).Left
  36.     .Top = Range("V6" ).Top
  37.     .Height = Range("V6" ).Height
  38.     .Width = 200
  39. End With
  40. With ActiveChart.PlotArea
  41.         .Left = 1
  42.         .Top = 1
  43.         .Width = 198
  44.         .Height = ChartArea.Height - 2
  45.         .Border.LineStyle = xlNone
  46.         .Interior.ColorIndex = xlNone
  47. End With
  48. End Sub


 
Je ne sais pas si quelqu'un aura un semblant de solution. Merci en tous cas pour votre attention et votre patience.  
 
Cordialement.  
 
MA


Message édité par micaub le 23-07-2009 à 11:59:29
Reply

Marsh Posté le 23-07-2009 à 11:58:29   

Reply

Marsh Posté le 23-07-2009 à 12:22:06    

Bonjour
 
Je ne comprends pas cette partie :

Code :
  1. With ActiveChart.ChartArea
  2.     .Left = Range("V6" ).Left
  3.     .Top = Range("V6" ).Top
  4.     .Height = Range("V6" ).Height
  5.     .Width = 200
  6. End With

Tu ne modifies pas le Graphique a proprement parlé, mais la zone graphique a l'interieur de l'objet graphique. Donc tu veux que la zone graphique soit a la ligne 6 alors que ton objet graphique n'a pas encore bougé. D'ou ton message d'erreur.
Ton objet graphique c'est l'image finale en fait. Et c'est ca que tu dois bouger a la ligne 6 avant de modifier la zone graphique, qui elle, est a l'interieur.
 
Pour jouer sur les .Top .Left etc. il vaut mieux passer par Shapes, pour atteindre l'objet graphique.
 
Ex :

Code :
  1. 'Récuperation du nom du graphique Actif (il est composé du nom de la feuille ou il est plus son nom a lui, il faut donc enlever le nom de la feuille pour l'atteindre.
  2. NomGraph = Right(ActiveChart.Name, Len(ActiveChart.Name) - Len(ActiveSheet.Name) - 1)
  3. ActiveSheet.Shapes(NomGraph).Left = Range("V6" ).Left
  4. ActiveSheet.Shapes(NomGraph).Top = Range("V6" ).Top

Et la tu positionnes ton graphique sur ta feuille comme tu l'entends.
 
 
 
Edit : Attention tout de meme, ActiveChart.Name est a récupérer seulement une fois que le graph est dans la feuille. Donc apres ton

Code :
  1. .Location xlLocationAsObject, "CFR"


En effet, Excel créé d'abord une feuille/onglet avec le nom du graphique sous la forme "GraphX", donc le ActiveChart.Name renverrait "GraphX"  
Ensuite si tu dis de le mettre dans une feuille, Excel copie la feuille/onglet graphique en tant qu'objet graphique sur ta feuille. (Un Shape)
Il supprime enfin la feuille graphique
Et donc le nom du Shape devient "NomDeLaFeuille Graphique X"


Message édité par SuppotDeSaTante le 23-07-2009 à 12:37:07

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

Marsh Posté le 27-07-2009 à 11:37:42    

Merci infiniment dje69r.
 
Ca correspond exactement à ce que je recherchais : je n'avais pas assimilé la nuance entre Chart (donc l'objet graphique) et ChartArea (donc la zone graphique à l'intérieur de l'objet si j'ai bien compris). J'y vois un peu plus claire maintenant (même si je trouve cela assez compliqué, notamment le nom des graphique).
 

Citation :

Excel créé d'abord une feuille/onglet avec le nom du graphique sous la forme "GraphX", donc le ActiveChart.Name renverrait "GraphX"


 
En revanche, j'aurai eu une petite question concernant justement le nom du graphique. Je constate en effet qu'à chaque création d'un graphique, Excelle nomme "Graphique XXX" ou XXX est un index qui s'incrémente. Or, si je supprime ces même graphiques, XXX continue à s'incrémenter à partir du nombre avant la suppression des graphiques. Donc, en exagérant un peu, si je fais plusieurs fois la même action, je peux me retrouver avec un "Graphique 16984" dans un classeur où il n'y a que quelques graphiques. :pt1cable:  
 
Je me demandais donc d'une part si ça ne prenait pas de la place inutilement, vu qu'Excel semble conserver dans le fichier les noms de tous les graphiques déjà créés même si ceux-ci ont été supprimés. Ensuite, je me demandais s'il n'étais pas possible de procéder à une réinitialisation de l'index afin qu'on se retrouve avec des numéros d'index identiques au nombre de graphiques dans le classeur.
 
J'espère que j'ai réussi à me faire comprendre... :sweat:  
Encore merci pour tes conseils en tout cas et bonne semaine.
 
Cordialement.
 
MA

Reply

Marsh Posté le 28-07-2009 à 00:26:14    

Oui j'ai compris.
Pour la place, a mon avis des numéros incrementés ca doit pas aller chercher bien loin....
Ca sera plus le graphique en lui meme qui prendra de la place, et qui meme supprimé peut ne pas faire baisser la taille de ton fichier.
 
Ensuite, je vois pas l'interet de le reinitialiser, etant donné que tu peux retrouver son numéro/nom aisément, vu que c'est toi qui le créé.
 

micaub a écrit :

Encore merci pour tes conseils en tout cas et bonne semaine.

:jap:  


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