Se connecter avec
S'enregistrer | Connectez-vous

[VBA] Problème redimensionnement et positionnement graphique

Dernière réponse : dans Programmation

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 :

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

Beurk, quel code horrible !
(T'inquiète je dis ça à chaque fois que je lis ActiveMachin, SelectTruc dans un code.)

Si tu n'es pas inquiet, en revanche, tu vas me faire le plaisir de revoir ça !
Bon, comme c'est les vacances, je m'y colle... (...T'as de la chance)

  1. Sheets("CFR" ).Activate
  2. Num = Range("B65536" ).End(xlUp).Row
-->
  1. Num = Sheets("CFR" ).Range("B65536" ).End(xlUp).Row

C'est quand même plus classe (Oui, il y a un jeu de mots :D )

  1. Charts.Add
  2. With ActiveChart
  3. ...
-->
  1. Dim ch As Chart
  2. Set ch = Charts.Add
  3. With ch
  4. ...

etc.

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


Tu jongles avec des feuilles de calcul (Worksheet), des feuilles graphiques (Chart), qui sont des feuilles (Sheet) et des graphiques (ChartObject) qui sont des formes (shape). Donc pour ne pas s'emmêler les pinceaux, on va tout bien préciser : lignes 3 et 4, on définit nos variables. Ligne 6, CFR est une feuille de calcul, c'est plus qu'une Sheet, c'est une Worksheet.

Ligne 7, on crée une feuille graphique. On se sert d'une variable pour la référencer, on ne compte pas sur le fait qu'elle est active ou pas. Ligne 15, la méthode Location va détruire la feuille graphique (Chart) et créer un graphique (ChartObject) à la place, sur la feuille donnée. Donc on ne se sert pas du fait que l'objet est peut être actif, mais on se sert d'une variable. Attention, à partir de cette ligne, l'objet co dans mon code, ou ActiveChart dans le tien, n'est plus le même et n'est plus de même classe.

Ligne 38. Ah bah, ça ne marche toujours pas. Et bien au lieu de bouger le contenu de la forme, on va bouger la forme :
  1. With co.ChartArea
  2. .Left = Range("V6" ).Left
  3. .Top = Range("V6" ).Top
  4. .Height = Range("V6" ).Height
  5. .Width = 200
  6. End With
-->
  1. co.Left = Range("V6" ).Left
  2. co.Top = Range("V6" ).Top
  3. co.Height = Range("V6" ).Height
  4. co.Width = 200


Tadaaaaaaaaaa !
Lassé par la pub ? Créez un compte