Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 Comment contrôler la taille des axes d'un graphique?

VincentBC

XLDnaute Nouveau
Bonjour,
Voilà mon besoin: je voudrai pouvoir contrôler parfaitement la taille de mes axes afin de créer ensuite plusieurs graphiques les uns en dessous des autres ou à côté, avec des axes identiques (en taille) et parfaitement alignés.
Les instructions PlotArea.Height / width existent, mais cela ne fait pas exactement ce que j'attends d'elles....

Par exemple, la procédure suivante créé bien une zone d'objet graphique (ChartArea) suffisamment large (400 pts) pour accueillir la zone graphique (PlotArea) telle que je la définie ensuite (200pts). La procédure vient bien modifier la taille des axes mais au final mon graphique ne présente pas des axes X et Y qui ont la même taille... et c'est ce que je cherche à faire avec cet exemple.
Si jamais vous avez une idée pour répondre à mon besoin je suis preneur....

Merci!


VB:
Sub test()
    ActiveSheet.ChartObjects("mongraphique").Activate
    ActiveChart.ChartArea.Select
    Selection.Height = 400
    Selection.Width = Selection.Height
    
    ActiveChart.PlotArea.Select
    Selection.Left = 20
    Selection.Top = 20
    Selection.Height = 200
    Selection.Width = Selection.Height
  
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Je ne sais pas si ça correspond à ce que vous voulez faire, mais j'ai cette commande GraphIsoEchelle affectée à un bouton de ma barre menu pour corriger les dimensions de graphiques montrant des projections, avec échelle identique des deux axes.
VB:
Option Explicit
Sub GphIsoEchelles(Optional ByVal Graph As Chart = Nothing, _
   Optional ByVal XGMin As Double = 0, Optional ByVal XDMin As Double = 0, _
   Optional ByVal YHMin As Double = 0, Optional ByVal YBMin As Double = 0)
   Dim dX As Double, dY As Double, Largeur As Double, Hauteur As Double, Ech As Double, _
      ZTrac As PlotArea, ObjG As ChartObject, _
      XMil As Double, YMil As Double, _
      XMrg As Double, YMrg As Double, N As Long
   If Graph Is Nothing Then Set Graph = ActiveChart
   On Error Resume Next
   With Graph
      Set ZTrac = .PlotArea: Set ObjG = .Parent: If Err Then Set ObjG = Nothing
      End With
   On Error GoTo 0
   With Graph.Axes(xlCategory): dX = .MaximumScale - .MinimumScale: End With
   With Graph.Axes(xlValue): dY = .MaximumScale - .MinimumScale: End With
   If ObjG Is Nothing Then
      Graph.SizeWithWindow = True
      ZTrac.Left = XGMin: ZTrac.Width = Graph.ChartArea.Width - XDMin - XGMin
      ZTrac.Top = YHMin: ZTrac.Height = Graph.ChartArea.Height - YHMin - YBMin
      End If
   For N = 1 To 4
      Largeur = ZTrac.InsideWidth
      Hauteur = ZTrac.InsideHeight
      If ObjG Is Nothing Then
         Ech = ArrondiGamme(WorksheetFunction.Min(Largeur / dX, Hauteur / dY))
         ZTrac.Width = ZTrac.Width - Largeur + dX * Ech
         ZTrac.Height = ZTrac.Height - Hauteur + dY * Ech
      Else
         Ech = ArrondiGamme(Sqr((Largeur * Hauteur) / (dX * dY)))
         ObjG.Width = ObjG.Width - Largeur + dX * Ech
         ObjG.Height = ObjG.Height - Hauteur + dY * Ech
         End If
      Next N
   End Sub
Function ArrondiGamme(ByVal X As Double) As Double
   ArrondiGamme = 2 ^ (Int(Log(X) * 212857425 / 12295127 + 0.5) / 12)
   End Function
 

VincentBC

XLDnaute Nouveau
Merci pour cette réponse si rapide!
J'ai l'impression que votre code permet de faire un graphique orthonormé, c'est intéressant mais ce n'est pas vraiment ce que je recherche. Je voudrai simplement pouvoir contrôler la position et la longueur des axes, sans me soucier de l'échelle des axes. Mais il y a peut-être des éléments à reprendre dans ce code pour répondre à mon besoin.
Une solution simple est de faire les graphiques avant à la taille voulue, puis d'utiliser le code VBA pour afficher les bonnes données... mais j'aurai aimé tester une méthode en vba de A à Z.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
À voir donc s'il ne s'agit pas simplement d'imposer les ZTrac.InsideWidth et InsideHeight. Mais ce sont des propriétés en lecture seule, alors il faut y agir par modification des ObjG.Width et Height. Exécutez le 4 fois, comme moi, pour tendre suffisamment vers leurs valeurs souhaitées
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…