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 :

Manipulation de données de graphique en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 385
    Par défaut Manipulation de données de graphique en VBA
    Bonjour à tous,

    Si des experts passent par là, j'ai une question à propos d'un comportement étrange d'Excel (je suppose, à moins que ça ne vienne de mois )

    Pour faire simple, j'ai beaucoup de graphs sur une feuille (genre une cinquantaine).
    Je boucle sur chaque graph, puis sur chaque point d'une série pour récupérer la valeur minimum de la série.
    L'objectif étant de mettre à jour la valeur minimum de l'échelle du graph en fonction de cette valeur minimum pour rendre le graph plus lisible (via la propriété : ActiveChart.Axes(xlValue).MinimumScale)

    Ce que je trouve étonnant, c'est que le code fonctionne parfaitement en mode pas à pas mais quand je l’exécute "normalement", cela ne fait rien.
    Comment est-ce possible ?

    Edit : Je vous mets le code que j'ai fait si ça peut aider à percer le mystère
    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
    24
    25
    Sub MajEchelleGraphs()
     
    Dim Feuille As Worksheet
    Dim Graphique As ChartObject
    Dim PointGraph As Point
    Dim TextePoint As String
    Dim ValeurPoint As Integer
    Dim ValeurMin As Integer
     
        Set Feuille = Sheets("Feuil1")
     
        For Each Graphique In Feuille.ChartObjects
            Graphique.Activate
            ValeurMin = 60
            ActiveChart.FullSeriesCollection(1).ApplyDataLabels
            For Each PointGraph In Feuille.ChartObjects(Graphique.Name).Chart.SeriesCollection(1).Points
                TextePoint = PointGraph.DataLabel.Characters.Text
                ValeurPoint = CInt(Left(TextePoint, Len(TextePoint) - 1))
                If ValeurPoint < ValeurMin Then ValeurMin = ValeurPoint
            Next PointGraph
            ActiveChart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.MRound(ValeurMin - 5, 10) / 100
            ActiveChart.FullSeriesCollection(1).DataLabels.Delete
        Next Graphique
     
    End Sub
    Merci d'avance !

    PS : Si vous avez une meilleure façon de modifier l'échelle, je suis preneur. Mais je précise que je suis passer par cette façon car je ne peux pas utiliser les données.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,
    Ce que je trouve étonnant, c'est que le code fonctionne parfaitement en mode pas à pas mais quand je l’exécute "normalement", cela ne fait rien.
    J'ai ajouté des debug.print à ton code, peux-tu me dire ce que tu obtient dans la fenêtre d'exécution quand tu lances le code "normalement"

    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
    24
    25
    26
    27
    Sub MajEchelleGraphs()
     
    Dim Feuille As Worksheet
    Dim Graphique As ChartObject
    Dim PointGraph As Point
    Dim TextePoint As String
    Dim ValeurPoint As Integer
    Dim ValeurMin As Integer
     
        Set Feuille = Sheets("Feuil1")
     
        For Each Graphique In Feuille.ChartObjects
            debug.print graphique.name
            Graphique.Activate
            ValeurMin = 60
            ActiveChart.FullSeriesCollection(1).ApplyDataLabels
            For Each PointGraph In Feuille.ChartObjects(Graphique.Name).Chart.SeriesCollection(1).Points
                TextePoint = PointGraph.DataLabel.Characters.Text
                ValeurPoint = CInt(Left(TextePoint, Len(TextePoint) - 1))
                If ValeurPoint < ValeurMin Then ValeurMin = ValeurPoint
            Next PointGraph
            debug.print valeurmin
            ActiveChart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.MRound(ValeurMin - 5, 10) / 100
            ActiveChart.FullSeriesCollection(1).DataLabels.Delete
        Next Graphique
     
    End Sub

  3. #3
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 385
    Par défaut
    Bonjour halaster08,

    Bien vu le coup des debug.print, je n'y pense pas assez pour faire des vérifs.
    Alors j'ai fait trois tests :

    1/ Lancement de la macro en mode normal (comme si je cliquais sur un bouton) et là j'obtiens que des 60 (cf ci-dessous)

    2/ Lancement en mode pas à pas mais en restant appuyer sur F8 => Même résultat

    3/ Lancement en mode pas à pas mais en appuyant successivement sur F8 jusqu'à la fin de la macro (j'ai mal au doigt) => Là seulement j'obtiens bien les bonnes valeurs !

    Je n'y comprends rien, comme si Excel ne traitait pas certaines instructions quand les macros tournent rapidement.

    Résultat test 1 et 2 :
    Chart 1
    60
    Chart 2
    60
    Chart 3
    60
    Chart 4
    60
    Chart 5
    60
    Chart 6
    60
    Chart 7
    60
    Chart 8
    60
    Chart 9
    60
    Chart 10
    60
    Chart 11
    60
    Chart 12
    60
    Chart 13
    60
    Chart 14
    60
    Chart 15
    60
    Chart 16
    60
    Chart 17
    60
    Chart 18
    60
    Chart 19
    60
    Chart 20
    60
    Chart 21
    60
    Chart 22
    60
    Chart 23
    60
    Chart 24
    60
    Chart 25
    60
    Chart 27
    60
    Chart 29
    60
    Chart 30
    60
    Chart 31
    60
    Chart 32
    60
    Chart 33
    60
    Chart 35
    60
    Chart 36
    60
    Chart 37
    60
    Chart 38
    60
    Chart 39
    60
    Chart 40
    60
    Chart 41
    60
    Résultat test 3 (seulement jusqu'au graph 4)
    Chart 1
    60
    Chart 2
    60
    Chart 3
    38

    Chart 4
    60
    ...

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    J'ai viré les activations de graphique de ton code, activer c'est très souvent inutile et parfois source d'erreur
    Par contre moi j'ai un problème au niveau de textepoints qui est toujours vide chez moi (même avec ton 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    Sub MajEchelleGraphs()
     
    Dim Feuille As Worksheet
    Dim Graphique As ChartObject
    Dim PointGraph As Point
    Dim TextePoint As String
    Dim ValeurPoint As Integer
    Dim ValeurMin As Integer
     
        Set Feuille = Sheets("Feuil1")
     
        For Each Graphique In Feuille.ChartObjects
            Debug.Print Graphique.Name
            'Graphique.Activate
            ValeurMin = 60
            Graphique.Chart.FullSeriesCollection(1).ApplyDataLabels
            For Each PointGraph In Feuille.ChartObjects(Graphique.Name).Chart.SeriesCollection(1).Points
                TextePoint = PointGraph.DataLabel.Characters.Text 'est vide chez moi
                ValeurPoint = CInt(Left(TextePoint, Len(TextePoint) - 1)) 'du coup génère une erreur ici
                If ValeurPoint < ValeurMin Then ValeurMin = ValeurPoint
            Next PointGraph
            Debug.Print ValeurMin
            Graphique.Chart.Axes(xlValue).MinimumScale = ValeurMin 'Application.WorksheetFunction.MRound(ValeurMin - 5, 10) / 100 'et ici quand valeurmin=0
            Graphique.Chart.FullSeriesCollection(1).DataLabels.Delete
        Next Graphique
     
    End Sub
    As-tu essayer ton code sur un autre classeur ?

    Sinon ton code avec un autre debug.print au niveau de textepoint et valeurpoint, pour vérifier si il trouve bien une valeur <60
    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
    24
    25
    26
    27
    28
    Sub MajEchelleGraphs()
     
    Dim Feuille As Worksheet
    Dim Graphique As ChartObject
    Dim PointGraph As Point
    Dim TextePoint As String
    Dim ValeurPoint As Integer
    Dim ValeurMin As Integer
     
        Set Feuille = Sheets("Feuil1")
     
        For Each Graphique In Feuille.ChartObjects
            debug.print graphique.name
            Graphique.Activate
            ValeurMin = 60
            ActiveChart.FullSeriesCollection(1).ApplyDataLabels
            For Each PointGraph In Feuille.ChartObjects(Graphique.Name).Chart.SeriesCollection(1).Points
                TextePoint = PointGraph.DataLabel.Characters.Text
                ValeurPoint = CInt(Left(TextePoint, Len(TextePoint) - 1))
                debug.print TextePoint & "   " & ValeurPoint 
                If ValeurPoint < ValeurMin Then ValeurMin = ValeurPoint
            Next PointGraph
            debug.print valeurmin
            ActiveChart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.MRound(ValeurMin - 5, 10) / 100
            ActiveChart.FullSeriesCollection(1).DataLabels.Delete
        Next Graphique
     
    End Sub

Discussions similaires

  1. Pour une zone donnée afficher graphique vba excel
    Par rihab92 dans le forum Excel
    Réponses: 7
    Dernier message: 07/04/2015, 12h35
  2. [XL-2007] Couper les liaisons entre les sources de données et leurs graphique en VBA
    Par mah.ngaz dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/04/2013, 19h05
  3. Réponses: 2
    Dernier message: 02/08/2012, 17h28
  4. Affectation de source de données à un graphique en VBA
    Par Guillaume_1 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/09/2010, 14h57
  5. [VBA]SQL dans Excel manipulation de données
    Par Deejoh dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 08/02/2006, 16h56

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