IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Modification des axes d'un graphique par Macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 87
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut Modification des axes d'un graphique par Macro
    Bonjour,
    Je veux modifier les valeurs mim et max d'un axe d'un graphique "Nuage de points" existant.
    Je créé une macro grâce à l'enregistreur de macros.
    Lorsque je lance la macro, j'obtiens dès la première ligne (ligne 6) l'erreur 1004 Erreur définie par l'application ou par l'objet.
    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Option Explicit
     
    Sub changer_echelle()
    ' changer_echelle Macro
        ActiveSheet.ChartObjects("Graphique 4").Activate
        ActiveChart.ChartArea.Select
        ActiveSheet.ChartObjects("Graphique 4").Activate
        ActiveChart.Axes(xlCategory).Select
        ActiveChart.Axes(xlCategory).MinimumScale = 0
        ActiveChart.Axes(xlCategory).MinimumScale = 1
        ActiveChart.Axes(xlCategory).MaximumScale = 0
        ActiveChart.Axes(xlCategory).MaximumScale = 5
    End Sub
    Je ne comprends pas où est l'erreur car, lors de la l'enregistrement de la macro, les nouvelles valeurs d'axes ont été respectées sans problème.
    Il y a plusieurs jours que je butte sur ce problème de manipulation par macro des axes d'un graphique.
    Je suis quasi certain que la cause de cet dysfonctionnement doit être élémentaire pour un habitué du VBA ... ce qui n'est pas mon cas.
    Quelqu'un entendra-t-il mon SOS ? ;o)
    Merci de m'avoir lu.
    cordialement,
    Jean Le Brun

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Il est probable que tu essayes de lancer cette macro dans une feuille qui n'est pas celle où tu as enregistré la macro, non ?
    Je pense donc que le graphique de la page en question ne s'appelle pas "Graphique 4".

    Le plus simple est que tu sélectionne "à la main" le graphique sur lequel tu veux lancer ta macro et que tu limites celle-ci à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub changer_echelle()
        ActiveChart.Axes(xlCategory).MinimumScale = 0
        ActiveChart.Axes(xlCategory).MinimumScale = 1
        ActiveChart.Axes(xlCategory).MaximumScale = 0
        ActiveChart.Axes(xlCategory).MaximumScale = 5
    End Sub
    Mais, à mon avis, il doit y avoir une erreur : il semble illogique de définir deux fois le maximum et le minimum pour le même Axe (celui des abscisse).
    A mon avis, il y a deux xlCategory qui sont à remplacer par des xlValue.

  3. #3
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 87
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    Bonjour Menhir,

    Là, à peu près sûr de mon coup : tu es breton ! ... non ?
    Pour mon compte : mi-breton, mi-gascon :o)


    Citation Envoyé par Menhir Voir le message
    Il est probable que tu essayes de lancer cette macro dans une feuille qui n'est pas celle où tu as enregistré la macro, non ?
    Je ne suis pas très sûr de moi en répondant à ta question vu que j'en suis au b a ba :
    Dans la fenêtre "projet", j'ai ceci :
    Nom : projet_triangle_qq.png
Affichages : 5305
Taille : 9,9 Ko
    La feuille contenant le graphique "Graphique4" est "Feuil1 (Accueil)" et la macro "changer_echelle" se trouve dans Module 3.

    Citation Envoyé par Menhir Voir le message
    Je pense donc que le graphique de la page en question ne s'appelle pas "Graphique 4".
    Si, c'est bien son nom, je l'ai vérifié avec la macro ci-dessous (elle aussi dans "module 3") qui fournit bien la valeur "Graphique 4" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub ListeChart()
    Dim c As ChartObject
    For Each c In ActiveSheet.ChartObjects
        MsgBox c.Name
    Next
    End Sub
    Citation Envoyé par Menhir Voir le message
    Le plus simple est que tu sélectionne "à la main" le graphique sur lequel tu veux lancer ta macro et que tu limites celle-ci à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub changer_echelle()
        ActiveChart.Axes(xlCategory).MinimumScale = 0
        ActiveChart.Axes(xlCategory).MinimumScale = 1
        ActiveChart.Axes(xlCategory).MaximumScale = 0
        ActiveChart.Axes(xlCategory).MaximumScale = 5
    End Sub
    Bien que je souhaite que cette sélection soit assurée par la macro et à titre de test, j'ai suivi ton conseil :
    J'ai réduit ma macro à (CtrlC + Ctrl V) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Option Explicit
     
    Sub changer_echelle()
        ActiveChart.Axes(xlCategory).MinimumScale = 0
        ActiveChart.Axes(xlCategory).MinimumScale = 1
        ActiveChart.Axes(xlCategory).MaximumScale = 0
        ActiveChart.Axes(xlCategory).MaximumScale = 5
    End Sub
    Suite des opérations :
    Rappel de la feuille "Accueil" (où est "Graphique 4"), sélection de "Graphique 4" part un clic, lancement de la macro "changer_echelle", résultat décevant :
    Nom : erreur.png
Affichages : 5211
Taille : 8,7 Ko

    Mais, à mon avis, il doit y avoir une erreur : il semble illogique de définir deux fois le maximum et le minimum pour le même Axe (celui des abscisse).
    C'est pourtant l'enregistreur qui a "fabriqué" la macro !!!
    J'ai l'impression de buter toujours sur le même problème : il semble que je ne suis pas autorisé à toucher à l'objet Chart ???

    A mon avis, il y a deux xlCategory qui sont à remplacer par des xlValue.
    Vu que çà plante avant, je n'ai pas testé cette modification :o(

    Au lieu d'avancer en connaissances du VBA, j'ai l'impression d'en comprendre de moins en moins de "règles".
    Merci beaucoup à toi de tenter de me sortir de mon "moyen âge" ;o)
    Très cordialement,
    Jean Le Brun
    Images attachées Images attachées  

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par CyranOrion Voir le message
    Mais, à mon avis, il doit y avoir une erreur : il semble illogique de définir deux fois le maximum et le minimum pour le même Axe (celui des abscisse).
    C'est pourtant l'enregistreur qui a "fabriqué" la macro !!!
    Il est quand même étrange de demander que me minimum d'un axe soit 0 et, la ligne suivante, demande que le même minimum du même axe soit 1, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub ListeChart()
    Dim c As ChartObject
    For Each c In ActiveSheet.ChartObjects
        MsgBox c.Name
    Next
    End Sub
    Quand tu fais ce type de vérification, je te conseille de passer par Debug.Print plutôt que par MsgBox qui implique l'ouverture d'une fenêtre et une validation.
    Le résultat de Debug.Print s'affiche dans la fenêtre d'exécution (il faut l'avoir ouverte avant avec Ctrl+G si elle ne l'était pas).

    Pour ce qui est de ton problème, essaye de sélectionner ton graphique et de lancer la macro suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub changer_echelle()
        Debug.Print "$" & ActiveChart.Name & "$"
        Debug.Print ActiveChart.Axes(xlCategory).Type
     
        ActiveChart.Axes(xlCategory).MinimumScale = 1
        ActiveChart.Axes(xlCategory).MaximumScale = 5
    End Sub
    Regarde ce qu'il écrit dans la fenêtre d'exécution.

  5. #5
    Membre averti
    Homme Profil pro
    retraité
    Inscrit en
    Avril 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 87
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : retraité
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Avril 2009
    Messages : 13
    Par défaut
    Re Bonjour Menhir,

    Merci pour ta prompte réponse;

    Citation Envoyé par Menhir Voir le message
    Il est quand même étrange de demander que me minimum d'un axe soit 0 et, la ligne suivante, demande que le même minimum du même axe soit 1, non ?
    Eh bien non ;o
    Je viens juste d'en découvrir l'explication :
    Lorsque l'on fait appel à la boîte qui permet d'imposer de nouvelles valeurs min et max d'un axe, il faut :
    - cocher le bouton radio "Fixe" (s'il était sur "Automatique"). C'est cela qui génère la première ligne.
    - entrer la valeur à imposer (pour remplacer la présente). c'est cela qui génère la seconde ligne.
    A titre de démonstration, les deux macros qui suivent :
    - la première traite un graphique dans lequel les boutons radio sont sur "Automatique", on les passe sur "Fixe" et on impose les valeurs,
    - la seconde traite un graphique dont les boutons radio sont sur "Fixe" (avec valeurs imposées) et on les passe sur "Automatique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Option Explicit
    Sub Fixer_minmax_axe_1()
    ' Fixer les valeurs min et max de l'axe 1'
        Sheets("Accueil").Select
        ActiveSheet.ChartObjects("Graphique 4").Activate
        ActiveChart.Axes(xlCategory).Select
        ActiveChart.Axes(xlCategory).MinimumScale = -2
    'La ligne ci-dessus a été créée par le cochage de "Fixe" (au lieu de "Automatique" pour la ligne "Minimum"
        ActiveChart.Axes(xlCategory).MinimumScale = -1
    'La ligne ci-dessus a été créée par l'introduction du nombre "-1" comme valeur du "Minimum" (cela a remplacé le "-2" initialement présent).
        ActiveChart.Axes(xlCategory).MaximumScale = 4
    'La ligne ci-dessus a été créée par le cochage de "Fixe" (au lieu de "Automatique" pour la ligne "Maximum"
        ActiveChart.Axes(xlCategory).MaximumScale = 5
    'La ligne ci-dessus a été créée par l'introduction du nombre "5" comme valeur du "Minimum" (cela a remplacé le "4" initialement présent).
    End Sub
    Sub Mis_Maxe_Automatique()
    'Cochage des boutons min et Max Axe 1
        Sheets("Accueil").Select
        ActiveSheet.ChartObjects("Graphique 4").Activate
        ActiveChart.Axes(xlCategory).Select
        ActiveChart.Axes(xlCategory).MinimumScaleIsAuto = True
        ActiveChart.Axes(xlCategory).MaximumScaleIsAuto = True
    End Sub
    Le drame c'est que ces macros refusent toutes les deux de fonctionner en se mettant en "Erreur 1004 - Erreur définie par l'application ou par l'objet" et le débogueur accuse la ligne "ActiveSheet.ChartObjects("Graphique 4").Activate" (lignes 5 et 19).
    Le problème reste donc le même :o(

    Citation Envoyé par Menhir Voir le message
    Quand tu fais ce type de vérification, je te conseille de passer par Debug.Print plutôt que par MsgBox qui implique l'ouverture d'une fenêtre et une validation.
    Le résultat de Debug.Print s'affiche dans la fenêtre d'exécution (il faut l'avoir ouverte avant avec Ctrl+G si elle ne l'était pas).

    OK. Je vais dorénavant adopter cette méthode. Merci pour le tuyau.




    Citation Envoyé par Menhir Voir le message
    Pour ce qui est de ton problème, essaye de sélectionner ton graphique et de lancer la macro suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub changer_echelle()
        Debug.Print "$" & ActiveChart.Name & "$"
        Debug.Print ActiveChart.Axes(xlCategory).Type
     
        ActiveChart.Axes(xlCategory).MinimumScale = 1
        ActiveChart.Axes(xlCategory).MaximumScale = 5
    End Sub
    Regarde ce qu'il écrit dans la fenêtre d'exécution.
    Helas, toujours pas le résultat escompté :
    - Erreur d'exécution '-2147467259 (8000400591' : La méthode 'MinimumScale' de l'objet'Axis' a échoué et ce sur la première lignhe :
    ActiveChart.Axes(xlCategory).MinimumScale = 1
    - pourtant, dans la boîte d'exécution on lit :
    $Accueil Graphique 4$
    1

    Détail ... significatif ou non, le résultat précédent, je l'ai obtenu en sélectionnant le graphique avant de lancer la macro;
    Je viens de la relancer mais après avoir (manuellement) dé-sélectionné le graphique.
    Dans ce cas, l'erreur devient Erreur '91' : Variable objet ou variable de bloc With non définie et le débogueur s'arrête sur la première ligne, le premier Debug.Print.
    Conclusion : comment activer l'objet "ActiveChart" par macro ?

    Toujours dans la panade mais je sens que grâce à toi je suis moins perdu qu'hier. Encore merci.
    très cordialement,
    Jean Le Brun
    --

    ?-

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par CyranOrion Voir le message
    Lorsque l'on fait appel à la boîte qui permet d'imposer de nouvelles valeurs min et max d'un axe, il faut :
    - cocher le bouton radio "Fixe" (s'il était sur "Automatique"). C'est cela qui génère la première ligne.
    - entrer la valeur à imposer (pour remplacer la présente). c'est cela qui génère la seconde ligne.
    Donc, comme je le pensais, il y a deux lignes de code inutiles et à supprimer.

    Helas, toujours pas le résultat escompté :
    - Erreur d'exécution '-2147467259 (8000400591' : La méthode 'MinimumScale' de l'objet'Axis' a échoué et ce sur la première lignhe :
    ActiveChart.Axes(xlCategory).MinimumScale = 1
    - pourtant, dans la boîte d'exécution on lit :
    $Accueil Graphique 4$
    1
    C'est déjà une information intéressante.
    La macro trouve bien le graphique. Au passage, il permet de voir qu'il ne s'appelle pas "Graphique 4" mais "Accueil Graphique 4".
    La macro accède aussi à l'axe puisqu'elle en donne le type (1=Abscisse) donc on peut éliminer cette partie des sources d'erreur.

    Essaye ça pour voir si la macro peut accéder aux valeurs des bornes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub changer_echelle()
        Debug.Print "$" & ActiveChart.Name & "$"
        Debug.Print ActiveChart.Axes(xlCategory).MinimumScaleIsAuto,ActiveChart.Axes(xlCategory).MaximumScaleIsAuto
        Debug.Print ActiveChart.Axes(xlCategory).MinimumScale,ActiveChart.Axes(xlCategory).MaximumScale
    End Sub
    Ca répond quoi dans la fenêtre d'exécution ?

    Détail ... significatif ou non, le résultat précédent, je l'ai obtenu en sélectionnant le graphique avant de lancer la macro;
    C'est ce que je demandais dans mon message 2.

    Je viens de la relancer mais après avoir (manuellement) dé-sélectionné le graphique.
    Mauvaise idée.
    La macro fait référence à ActiveChart qui, assez logiquement, représente le graphe actif.
    S'il n'y a pas de graphe actif au moment où tu la lances, ça ne risque pas de marcher.

    Conclusion : comment activer l'objet "ActiveChart" par macro ?
    Il y a deux solution pour débuguer un code.
    Soit on a la science infuse ou l'inspiration divine et on trouve directement le problème.
    Soit on procède par petits pas en éliminant une à une les cause possible et en resserrant petit à petit la zone pour finalement mettre le doigt sur le détail à modifier.

    Pour l'instant, essayons de comprendre pourquoi sur l'axe de ton graphique, la macro n'accepte pas de fixer des bornes.
    Ensuite on passera à la sélection du graphique.

Discussions similaires

  1. Réponses: 10
    Dernier message: 01/07/2014, 16h12
  2. [XL-2010] Macro modification des plages de données graphiques
    Par FP789 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/08/2013, 10h42
  3. [débutant] gestion des axes d'un graphique
    Par 20100. dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/01/2008, 23h35
  4. [MySQL] Modification des données d'une base par les membres
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 22/03/2006, 17h25
  5. [VB6] Modification des axes d'un composant Chart
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/05/2003, 08h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo