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 :

Macro Formatting Graphiques


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 17
    Par défaut Macro Formatting Graphiques
    Bonjour à tous!

    J'ai rédigé un petit code tout simple qui me permet d'harmoniser le format de mes graphiques sur Excel.

    Le code se présente tel que suit :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    Sub chart_format()
     
    Dim WSh As Worksheet
    Dim i, NbChart As Integer
     
    For Each WSh In ThisWorkbook.Worksheets
     
    WSh.Activate
    NbChart = ActiveSheet.ChartObjects.Count
     
    For i = 1 To NbChart
        With ActiveSheet.ChartObjects(i).Chart
     
             If .SeriesCollection.Count = 1 Then
            .SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(132, 199, 37)
            ElseIf .SeriesCollection.Count = 2 Then
            .SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(132, 199, 37)
            .SeriesCollection(2).Format.Fill.ForeColor.RGB = RGB(191, 191, 191)
            ElseIf .SeriesCollection.Count = 3 Then
            .SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(132, 199, 37)
            .SeriesCollection(2).Format.Fill.ForeColor.RGB = RGB(191, 191, 191)
            .SeriesCollection(3).Format.Fill.ForeColor.RGB = RGB(127, 127, 127)
            End If 
     
            .Axes(xlValue).TickLabels.NumberFormat = "0"
            .ChartGroups(1).GapWidth = 70
            .ChartGroups(1).Overlap = 0
            .ChartTitle.Format.TextFrame2.TextRange.Font.Size = 14
            .ChartTitle.Format.TextFrame2.TextRange.Font.Name = "Calibri(Body)"
            .ChartTitle.Format.TextFrame2.TextRange.Font.Bold = msoTrue
            .ChartArea.Border.LineStyle = xlNone
            .ChartArea.Format.Fill.Visible = msoFalse
            .PlotArea.Format.Fill.Visible = msoFalse
            .ChartTitle.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 71)
        End With
    Next i
     
    Next WSh
     
    End Sub
    Mon souci se situe au niveau de la boucle If ... Then ... End If (en rouge ci-dessus).

    Pour l'instant, je procède de la sorte : si mon graph n'a qu'une seule série, alors cette série est colorée en vert (132, 199, 37) ; s'il en a deux, alors la première est colorée en vert et la seconde en gris clair (191, 191, 191) ; et enfin s'il en a trois, alors la première est en vert, la deuxième en gris clair et la dernière en gris foncé (127, 127, 127).

    Je pense que ce n'est probablement pas la meilleure facon de procéder, d'une part, mais mon vrai problème vient du fait que ce code ne répond pas à mon besoin. En effet, je cherche à colorer en vert la serie ayant le total le plus élevé et en gris foncé celle ayant le total le moins élevé. Savez-vous si cela est possible ? Et si c'est le cas, auriez-vous quelques pistes pour me mettre sur la voie ?

    Merci beaucoup par avance !

  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
    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
    Sub chart_format()
     
    Dim WSh As Worksheet
    Dim i As Integer
    Dim SNum As Long
    Dim Couleur(3) As Long
     
    Couleur(1) = RGB(132, 199, 37)
    Couleur(2) = RGB(191, 191, 191)
    Couleur(3) = RGB(127, 127, 127)
     
    For Each WSh In ThisWorkbook.Worksheets
        WSh.Activate
     
        For i = 1 To ActiveSheet.ChartObjects.Count
            With ActiveSheet.ChartObjects(i).Chart
     
                For SNum = 1 To .SeriesCollection.Count
                    .SeriesCollection(SNum).Format.Fill.ForeColor.RGB = Couleur(SNum)
                Next SNum
    Il aurait sans doute été plus élégant de se passer de SNum en faisant un For Each à la place d'un For To mais c'est sans doute plus clair ainsi.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 17
    Par défaut
    Merci beaucoup, c'est en effet bien mieux maintenant!

    Cependant, et à moins d'avoir mal compris ce nouveau code, je ne pense pas qu'il réponde à mon besoin. Pour rappel, je cherche en effet à assigner la couleur verte (1) à la série dont le total est le plus élevé et la couleur gris foncé (3) à la série dont le total est le plus faible.

    Est-ce possible selon vous ?

    Merci!

  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
    Tu utilises une variable d'indice 3 qui te permettra de conserver la somme de chaque série.

    Tu fais une première boucle pour déterminer quelle somme est la plus grande.

    Pour chaque Serie, avec la propriété Formula, tu récupères la plage de données.
    Tu fais un Split en utilisant "," comme séparateur pour récupérer la plage des valeurs.
    Tu évalues la somme avec un Evaluate et tu places le résultat dans l'indice correspondant de la variable créée au début.

    Il ne te reste plus ensuite qu'à déterminer laquelle des 3 est la max et laquelle est la min pour lui affecter la bonne couleur.

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 17
    Par défaut
    Génial merci!

    Voici mon code jusqu'à maintenant.

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Option Explicit
    Option Base 1
     
    Sub chart_format()
     
     
    Dim WSh As Worksheet
    Dim i As Integer
    Dim SNum As Long
    Dim Couleur(3) As Long
    Dim Series() As Double
    Dim LArray() As String
    Dim data_range As String
    Dim b, Max, Min As Double
     
     
    Couleur(1) = RGB(132, 199, 37)
    Couleur(2) = RGB(191, 191, 191)
    Couleur(3) = RGB(127, 127, 127)
     
    For Each WSh In ThisWorkbook.Worksheets
     
    WSh.Activate
     
     For i = 1 To ActiveSheet.ChartObjects.Count
            With ActiveSheet.ChartObjects(i).Chart
     
                For SNum = 1 To .SeriesCollection.Count
                   data_range = .SeriesCollection(SNum).Formula
                   LArray = Split(data_range, ",")
     
                ReDim Series(.SeriesCollection.Count)
                   Series(SNum) = Evaluate("Sum(" & LArray(2) & ")")
                Next SNum
     
     
            .Axes(xlValue).TickLabels.NumberFormat = "0"
            .ChartGroups(1).GapWidth = 70
            .ChartGroups(1).Overlap = 0
            .ChartTitle.Format.TextFrame2.TextRange.Font.Size = 14
            .ChartTitle.Format.TextFrame2.TextRange.Font.Name = "Calibri(Body)"
            .ChartTitle.Format.TextFrame2.TextRange.Font.Bold = msoTrue
            .ChartArea.Border.LineStyle = xlNone
            .ChartArea.Format.Fill.Visible = msoFalse
            .PlotArea.Format.Fill.Visible = msoFalse
            .ChartTitle.Format.TextFrame2.TextRange.Font.Fill.ForeColor.RGB = RGB(0, 0, 71)
        End With
    Next i
     
    Next WSh
     
    End Sub
    Je bloque cependant sur la partie max/min. J'ai essayé d'appliquer la fonction Application.WorkSheetFunction.Max/Min à ma variable Series, mais cela me renvoie 0 en minimum pour un graphique à 2 series de total 10 et 14 respectivement.

    Un conseil ?

    Un immense merci pour cette aide précieuse!!!

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut
    L'un de mes projets de macro est justement une interface qui propose de modifier automatiquement les graphes et de voir le résultat sous la forme de la copie du graphe. Depuis j'ai eu l'occasion de découvrir les UserForms et cela pourrait en être une amélioration.

    Si cela peut t'intéresser, je posterai (ici ou ailleurs) ma macro quand j'aurai terminé ^^

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 17
    Par défaut
    Volontiers!

  8. #8
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    Septembre 2017
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

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

    Informations forums :
    Inscription : Septembre 2017
    Messages : 132
    Par défaut Preview mise en forme automatique des graphes
    Nom : Capture.JPG
Affichages : 577
Taille : 216,7 Ko

    Voilà à quoi ça ressemble : tu renseignes toutes les mises en forme puis tu lances la macro. L'utilisation d'un UserForm permettra de le faire dynamiquement.

    Cela te conviendrait ?

    Pour finaliser le truc j'en ai pour un moment par contre et je ne vais pas pouvoir m'y remettre tout de suite :/

  9. #9
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 17
    Par défaut
    Super !
    Aucun probleme pour le delai !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/12/2007, 21h24
  2. macro et graphique
    Par afssaLERH dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 21/11/2007, 16h30
  3. [Conception] format graphique db
    Par guigo dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 24/09/2007, 18h53
  4. Excel - macro (format conditionnel - run-time error 1004)
    Par Chewi dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/09/2006, 19h18
  5. [C++/Windows] format graphique spécial
    Par gloubi dans le forum MFC
    Réponses: 6
    Dernier message: 22/11/2004, 02h10

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