Se connecter avec
S'enregistrer | Connectez-vous

PB acces aux graphiques via code vb?

Dernière réponse : dans Programmation

Bonjour tout le monde.

Je viens de découvrir ce formidable site d'entraide en VB et malheureusement je n'arrive pas à résoudre mon PB tout seul.
Pourriez-vous, je vous prie essayer de me fournir une réponse aux questions qui suivent.

Cela fait maintenant 3 jours que je cherche un moyen de régler l'échelle des X de différents graphiques Excel en automatique grâce à une macro / script VB.
Le but est d'avoir les deux bouts de l'axe exactement à la valeur des données utilisées, ni plus, ni moins.
C'est une question d'élégance...

Certains des graphiques sont dans des feuilles indépendantes, là pas de PB.
D'autres sont des graphes dans des feuilles de calculs Excel, là commence mon problème vis à vis de la macro.

Donc j'ai 2 solutions:
1) Soit, je trouve un moyen de régler "l'offset" par défaut de Excel sur les échelles des axes X. (autre post).

2) Soit, je trouve le moyen de faire tourner la bonne macro.

J’ai déjà la liste des graphiques/chart que je souhaite redéfinir.
Des graphiques ont le même nom ou le même index sur des pages qui elles sont différentes.

Les objets/classes chart ou charts n’existe qu’avec les applications ou les workbook.

Les shape/shapes pourraient servir avec des tests sur la propriété type mais ceci ne donne que des shapes ou des objets incompatibles avec les chart/charts.

J’ai besoin d’obtenir des chart/charts pour avoir accès à : « .Axes(xlCategory).MinimumScale » et« .Axes(xlCategory).MaximumScale »

Mes questions sont donc:
1- Comment à partir de ma liste de noms de pages et de noms/références de graphiques puis-je facilement « les atteindre » pour en changer l’échelle des X.

Un bout de mon code pour expliciter :
  1. 'Sélection de la plage de données concernant la liste des feuilles et des graphs dont l'axe X doit être mis en forme
  2. 'Cette plage de données est formée de 2 colonnes :
  3. ' l'une pour les noms des feuilles,
  4. ' l'autre pour les références de graphes.
  5. 'Cette plage de donnée commence à la cellule nommée "Liste_Graph_Axe_X_a_adapter".
  6. 'La fin de la plage à sélectionnée se trouve en bas de la colonne des nom de feuilles.
  7. 'Cette fin est inconnue donc nous utilisons ".End(xlDown)" pour trouver automatiquement et simplement cette fin.
  8. 'Les références des graphes se trouvent dans la colonne à droite des noms des feuilles.
  9. 'Nous utilisons donc un décalage à droite ".Offset(0, 1)" pour englober cette colonne.
  10. Sheets("Parametres").Range(Range("Liste_Graph_Axe_X_a_adapter"), Range("Liste_Graph_Axe_X_a_adapter").End(xlDown).Offset(0, 1)).Select
  11.  
  12. For Each MaPlage In Selection
  13. 'L'analyse de la plage sélectionnée se fait cellule par cellule or nous avons besoin de la faire ligne par ligne.
  14. ' "Maplage" va donc être la cellule contenant le nom de la feuille,
  15. ' et "Maplage.Offset(0,1)" va être la cellule contenant la référence du graphe dont l'échelle de l'axe des X doit être adaptée.
  16.  
  17. 'Choix de la feuille dans la "Maplage" en cours de traitement.
  18. 'Choix du graphe dans "MaPlage".Offset(0,1)" en cours de traitement.
  19. 'et choix de l'axe des "X" de ce graphe pour le mise en forme.
  20. With Sheets(MaPlage.Value).Item(MaPlage.Offset(0, 1).Value).Axes(xlCategory)
  21.  
  22. ‘ !!!!! LA CA PLANTE !!!!
  23.  
  24. 'Affectation de la date de début au minimum de l'axe des "X"
  25. 'pour la mise à la bonne échelle de l'axe des "X".
  26. .MinimumScale = Debut
  27.  
  28. 'Affectation de la date de fin au maximum de l'axe des "X"
  29. 'pour la mise à la bonne échelle de l'axe des "X".
  30. .MaximumScale = Fin


Je précise que le poste que j'utilise n'a pas la fameuse aide en ligne... mais quand même un acces internet.
Et je suis incapable de retrouver un CD pour compléter l'intall.

Voila, merci bcp pour votre aide.
J’en ai besoin avant de ne plus avoir de cheveux et de dents.

Autres pages sur : acces graphiques via code

Lassé par la pub ? Créez un compte
Expert Programmation

Mais non voyons, tu ne veux pas traiter la catégorie de l'axe mais ses valeurs !
Remplace Axes(xlCategory) par Axes(xlValue). Ca devrait mieux te convenir.
Expert Programmation

Trucs pour connaître les objets sans avoir l'aide ou même quand on l'a :
- Utilise l'explotateur d'objet !
- Utilise les espions : clique droit sur ta variable, ajouter un espion.
Si cette variable est un objet, tu découvriras toute l'arborescence des
attributs et leur valeur, qui peuvent être eux-même d'autres objets.

Désolé Zeb, ca ne fontionne pas.
J'obtient toujours le message d'erreur:
"
Erreur d’execusion ‘438’:
Propriété ou méthode non gérée par cet objet.
"

J'ai fait une pause depuis tout à l'heure.
J'ai repris depuis le début et j'ai trouvé une piste.
Ca à l'air de fonctionner.
Je continue.
Je posterais ma sol quand elle sera nickel Chorme.

J'ai essayé ta correction Axes(xlValue) => c'est l'axe des "Y" qui change pas l'axe des "X"?????
Avec Axes(xlCategory) ca marche????


J'ai une autre question qui pourra être l'objet d'un autre poste:

1- Comment effectuer 2 "next" consécutifs dans une boucle "for each" ?
2- Quel pointeur / référence ou propriété faut-il faire évoluer / changer?

Citation :
Trucs pour connaître les objets sans avoir l'aide ou même quand on l'a :
- Utilise l'explotateur d'objet !
- Utilise les espions : clique droit sur ta variable, ajouter un espion.
Si cette variable est un objet, tu découvriras toute l'arborescence des
attributs et leur valeur, qui peuvent être eux-même d'autres objets.


Merci pour l'info.
Explorateur et espion: je connais :jap:  mais avec l'aide en ligne ca v aplus vite :sol: 

D'ailleurs qui peut réellement dire que son code est parfait s'il n'utilise pas les espions et le debugage pas à pas avec "F8".
En plus des espions, il y a aussi la fenetre de "Variables locales".
menu: "Affichage" -> "Fenêtre de Variables locales".

Tchuss A+

Expert Programmation

2 nexts dans un for each ?
Je ne contprends pas ce que tu veux. Sauter un objet ?
  1. For each truc in trucs
  2. If truc ........ Then
  3. Faire quelque chose de truc
  4. Else
  5. Faire autre chose de truc, ou rien
  6. End IF
  7. Next

Dans mon code je sélectionne une zone (range) de 2 colonnes sur qq lignes.
colonne1 = noms des feuilles.
colonne2 = noms des graphes.

Je fais un "for each MaCelulle in selection".

Dans ma boucle j'utilise:
MaCelulle.value
et MaCelulle.offset(0,1).value
pour repérer mes graphiques et ensuite je peux faire le réglage de l'échelle de l'axe X.

Le pb vient à la fin de la boucle car le "next" ne se décalle que d'une cellule or j'ai besoin de deux décallage consécutif de "MaCelulle" dans "selection" pour changer de ligne...

Et là je bloque.
Car faire "Macelulle = MaCelulle.offset(0,1)" ne marche pas.
Je regarde les propriétés et fonctions de "range" et "cell" mais je n'ai pas encore trouver de solution qui me permettrait de décaler l'adresse la reference de "Macelulle" avant le next.

Citation :
TaCellule est un objet, il faut faire un Set TaCellule = TaCellule.offset(0,1).
Dis-moi que t'es content de le savoir.


Bonjour Zeb,

Merci pour ton aide et ton support.
Malheureusement cette Xieme solution ne passe pas...
J'ai également essyaé:
  1. 'MaPlage = MaPlage.Offset(0, 1)
  2. 'MaPlage = MaPlage.Next
  3. 'Set MaPlage = MaPlage.Next
  4. 'Set MaPlage = MaPlage.Offset(0, 1)

Rien ne passe.
Chaque opération effectue un décalage vers la droite sans jamais effectuer un saut de ligne.
Seul le "Next" effectue l'opération correctement.

J'ai donc opté pour une solution bcp + simple => ne pas sélectionner 2 colonnes mais 1 seule.
Et là miracle, ca marche et pas besoin de "set", "offset" spécial.

Maintenant mon code passe bien plus de PB, je poste la solution à la suite.

Encore merci pour ton aide.
L'émulation et la prise de recul (et de repos) ca aide.
A+

Voici un code permettant à partir d'une liste pré-définie d'accéder à des graphiques Excel et d'en modifier certains parametres notamment les exchelles de X.

  1. Sub Graph_echelle_X_auto()
  2. '
  3. '
  4.  
  5. Dim Debut As Double
  6. Dim Fin As Double
  7.  
  8. Dim MaPlage As Range
  9.  
  10. Dim MaFeuil As Worksheet
  11. Dim MonGraph As Chart
  12.  
  13. 'Recherche du parametre de date de début d'extraction.
  14. 'L'information se trouve dans la feuille de "Parametres", dans la plage de cellule nommée "Date_Debut" (1 cellule).
  15. Debut = Sheets("Parametres").Range("Date_Debut").Value
  16. 'Recherche du parametre de date de fin d'extraction.
  17. 'L'information se trouve dans la feuille de "Parametres", dans la plage de cellule nommée "Date_Fin" (1 cellule).
  18. Fin = Sheets("Parametres").Range("Date_Fin").Value
  19.  
  20. 'Sélection d'une feuille excel pour éviter un bug de sélection.
  21. Sheets("Parametres").Select
  22.  
  23. 'Sélection de la plage de données concernant la liste des feuilles et des graphs dont l'axe X doit être mis en forme
  24. 'Cette plage de données est formée de 2 colonnes :
  25. ' l'une pour les noms des feuilles,
  26. ' l'autre pour les références de graphs.
  27. 'Cette plage de donnée commence à la cellule nommée "Liste_Graph_Axe_X_a_adapter".
  28. 'La fin de la plage à sélectionnée se trouve en bas de la colonne des nom de feuilles.
  29. 'Cette fin est inconnue donc nous utilisons ".End(xlDown)" pour trouver automatiquement et simplement cette fin.
  30. 'Les références des graphs se trouvent dans la colonne à droite des noms des feuilles.
  31. 'Nous utilisons donc un décallage à droite ".Offset(0, 1)" pour englober cette colonne.
  32. Sheets("Parametres").Range(Range("Liste_Graph_Axe_X_a_adapter"), Range("Liste_Graph_Axe_X_a_adapter").End(xlDown)).Select
  33.  
  34. For Each MaPlage In Selection
  35. 'L'annalyse de la plage sélectionnée se fait cellule par cellule or nous avons besoin de la faire ligne par ligne.
  36. ' "Maplage" va donc être la celulle contenant le nom de la feuille,
  37. ' et "Maplage.Offset(0,1)" va être la cellule contenant la référence du graph dont l'échelle de l'axe des X doit être adaptée.
  38.  
  39.  
  40. 'Next MaPlage
  41.  
  42. If (IsEmpty(MaPlage.Offset(0, 1).Value)) Then
  43. 'S'il n'a pas de référence de graph alors nous avons un graph indépendant
  44. 'Il est placé dans une feuille de graph et non pas placer/coller dans une feuille de calcul avec d'autres graphs.
  45.  
  46. 'Choix du graph(qui est une feuille indépendante) dans "MaPlage" de la plage en cours de traitement.
  47. 'et choix de l'axe des "X" de ce graph pour le mise en forme.
  48. With Sheets(MaPlage.Value).Axes(xlCategory)
  49.  
  50. 'Affectation de la date de début au minimum de l'axe des "X"
  51. 'pour la mise à la bonne échelle de l'axe des "X".
  52. .MinimumScale = Debut
  53.  
  54. 'Affectation de la date de fin au maximum de l'axe des "X"
  55. 'pour la mise à la bonne échelle de l'axe des "X".
  56. .MaximumScale = Fin
  57.  
  58. 'Divers paramétres par défaut.
  59. .MinorUnitIsAuto = True
  60. .MajorUnitIsAuto = True
  61. .Crosses = xlAutomatic
  62. .ReversePlotOrder = False
  63. .ScaleType = xlLinear
  64. .DisplayUnit = xlNone
  65.  
  66. End With
  67.  
  68. Else
  69. 'Sinon il y a au moins 1 graph dans la feuille de calcul en cours de traitement
  70.  
  71. 'Attribution/Création d'une feuille avec le nom de feuille en cours de traitement dans "MaPlage".
  72. Set MaFeuil = Worksheets(MaPlage.Value)
  73.  
  74. 'Attribution/Création d'un graphique avec le nom de graphique en cours de traitement dans "MaPlage.Offset(0, 1)"
  75. 'dans la page attribuée/crée.
  76. Set MonGraph = MaFeuil.ChartObjects(MaPlage.Offset(0, 1).Value).Chart
  77.  
  78. 'Choix de l'axe des "X" de ce graph pour le mise en forme.
  79. With MonGraph.Axes(xlCategory)
  80.  
  81. 'Affectation de la date de début au minimum de l'axe des "X"
  82. 'pour la mise à la bonne échelle de l'axe des "X".
  83. .MinimumScale = Debut
  84.  
  85. 'Affectation de la date de fin au maximum de l'axe des "X"
  86. 'pour la mise à la bonne échelle de l'axe des "X".
  87. .MaximumScale = Fin
  88.  
  89. 'Divers paramétres par défaut.
  90. .MinorUnitIsAuto = True
  91. .MajorUnitIsAuto = True
  92. .Crosses = xlAutomatic
  93. .ReversePlotOrder = False
  94. .ScaleType = xlLinear
  95. .DisplayUnit = xlNone
  96.  
  97. End With
  98.  
  99. Set MonGraph = Nothing
  100. Set MaFeuil = Nothing
  101.  
  102. End If
  103.  
  104. Next MaPlage
  105.  
  106. End Sub

hello azertysim dans le code ci-dessus tu selectionne une plage de données. Étant débutant j'ai un ti pb qui je pense doit avoir sa solution!!

j'ai une colonne B qui est une suite d'horaire (ex: B2=8:50, B3=8:55, B4=9:00, ...).

j'ai une autre colonne CA qui est une suite de chiffres correspondant 0 ces horaires (ex: pour 8:50 -> CA2=0, pour 8:55 -> CA3=48, pour 9:00 -> CA4=144,...)

Moi j'aimerais en fait sélectionner une plage horaire de la colonne B.

Le début de cette plage serait une valeur selectionnée ds une 1ère listbox et la fin de la plage serait une autre valeur selectionnée ds une deuxième listbox.

j'aimerais ensuite faire un graphique ayant pour abscisse la plage horaire précédemment défini par les listbox et ayant pour ordonnée la plage des valeur associée au horaire (dc de la colonne CA).

Y a-t-il une solution ???
Merci
Lassé par la pub ? Créez un compte