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

Contribuez Discussion :

Piloter les couleurs d'un graphique en VBA


Sujet :

Contribuez

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut Piloter les couleurs d'un graphique en VBA
    Ceci est une contribution de débutant, soyez indulgent SVP.

    Le but ici est de pouvoir générer un graphique un grand nombre de fois sans avoir à redéfinir manuellement les couleurs. Il peut en effet être utile d'attribuer des couleurs fixes en fonctions d'un champ.

    Avant toute choses nous avons besoin de faire appel à une bibliothèque Microsoft pour pouvoir piloter notre graphique.
    •Microsoft Graph 12.0 Object Library
    Il faut la référencer dans la fenêtre Visual Basic/outils/référence.


    Le script présenté ici permet de fixer les couleurs d'un graphique de type camembert en fonction d'un des champs qui l'alimente: le script ci-dessous s'applique à des exploitations agricoles pour lesquels nous avons un champs "type de culture" (maïs, Blé, orge, etc.); chaque portion du camembert est composé d'un type de culture auquel on attribue une couleur. Bien évidemment chaque exploitation agricole est unique donc chacune ne comporte pas les mêmes cultures (d'où la boucle "for next"). Autre précision sur le script; l'incrémentation de la boucle "for-next" se fait sur les lignes du tableau (DataShet) qui alimente le graphique, mais en restant sur la première colonne index "0" dans le "range": cela permet de balayer les éléments que l'on retrouve dans la légende.

    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
    Dim wChart As Graph.Chart 'déclaration variable objet contenant le dessin du graphique
        Set wChart = Me.MonGraphique.Object.Application.Chart
    Dim wLegend As Legend 'declaration variable objet contenant la legende du dessin du graphique
       Set wLegend = wChart.Legend
       wChart.HasLegend = True
    Dim wPoints As Graph.Points 'declaration variable objet contenant la position (sous-ensemble) d'une serie du graphique
        Set wPoints = wChart.SeriesCollection(1).Points 'pour un graphique de type camembert, il n'y a qu'une seule série, donc l'index est 1 pour "seriescollection"
    Dim wDataSheet As Graph.DataSheet 'declaration du tableau de donnée du graphique
        Set wDataSheet = Me.MonGraphique.Object.Application.DataSheet
    Dim i As Byte
    Dim Culture As String
        i = 1
        Culture = ""
     
        For i = 1 To wLegend.LegendEntries.Count 'boucle sur le nombre d'élément composant le graphique, équivalent à la légende ici
            Culture = wDataSheet.Range("0" & i).Value 'récupération de l'intitulé de chaque ligne
            Select Case Culture 'attribution des couleurs à chaque position (sous-ensemble) en fonction de l'intitulé récupérer précedemment
                Case "Avoine printemps"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 9
                Case "Betterave"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 13
                Case "Blé tendre hiver"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 45
                Case "Céréales"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 44
                Case "Colza"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 32
                Case "Féverole"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 34
                Case "Haricot"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 31
                Case "Jachère"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 1
                Case "Orge hiver"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 21
                Case "Orge printemps"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 22
                Case "Seigle"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 29
                Case "Soja"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 19
                Case "Tournesol"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 56
                Case "Vigne"
                    wPoints.Item(i).Fill.ForeColor.SchemeColor = 30
            End Select
        Next i
    remarque: ma boucle "for-next" se fait sur le compte des éléments de ma légende ("LegendEntries.count") alors que l'incrémentation est dirigée sur le tableau (DataSheet) qui alimente le graphique; ça c'est pas très académique mais ça marche et de toute façon je ne sais pas comment faire autrement.

    D'autre part j'aurais aimer fixer des couleurs en RGB car il est possible d'accéder à beaucoup plus de Nuances mais je n'y suis pas parvenu; voici la syntaxe que j'ai utlisé mais sans succès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .....Fill.ForeColor.RGB = RGB(255,192,26)

  2. #2
    Membre averti Avatar de Oliv'83
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Mars 2008
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2008
    Messages : 421
    Points : 309
    Points
    309
    Par défaut
    Citation Envoyé par MatAllwhite Voir le message
    D'autre part j'aurais aimer fixer des couleurs en RGB car il est possible d'accéder à beaucoup plus de Nuances mais je n'y suis pas parvenu; voici la syntaxe que j'ai utlisé mais sans succès:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .....Fill.ForeColor.RGB = RGB(255,192,26)
    Regardes si tu ne trouves pas ton bonheur dans cette discussion
    http://www.developpez.net/forums/d85...il-formulaire/

    Bonne soirée

    Oliv'

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Merci Oliv'83, j'ai lu la discussion de ton lien mais je ny ai pas trouvé de réponse concernant mon cas.

  4. #4
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Bonjour,
    J'ai rédigé ceci pour un rapport de stage récemment, j'espère que cela pourra t'aider :

    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
    ' On déclare nos variables avec Graph. pour signaler que l’on déclare depuis la bibliothèque graphique
    Dim vlDataSheet As Graph.Datasheet ' Pour contrôler les données sous format Excel
    Dim vlChart As Graph.Chart ' Pour générer le graphique
    Dim vlCtrl As Control ' Pour contrôler l’interface du formulaire
    Dim vlArea As Graph.ChartArea ' Pour contrôler la zone graphique
    ' On applique une première fonction pour créer l’interface du formulaire
    Private Sub Création()
    Set vlCtrl = Me.GraphiqueX ' Permet de prendre le contrôle du graphique
    Set vlChart = vlCtrl.Object.Application.Chart
    Set vlArea = vlChart.ChartArea ' Permet de prendre le contrôle de la zone
    ' Pour changer le côté visuel du graphique, il existe diverses fonctions :
    vlArea.Font.Name = "Calibiri" ' Change le style de police des légendes
    vlArea.Font.Bold = True ' Mets en Gras les légendes
    vlArea.Font.Italic = True ' Mets en Italique les légendes
    vlArea.Font.Underline = True ' Souligne les légendes
    vlArea.Font.Size = 12 ' Change la taille de la police des légendes
    vlArea.Font.Color = RGB(rouge, vert, bleu) ' Change la couleur des légendes (les de rouge, vert et bleu sont comprises entre 0 et 255)
     vlChart.ChartTitle permet de modifier le titre du graphique
    vlChart.ChartTitle.Text = "Nom du Graphique"
    Call Création_des_Champs ' Fait appel à la fonction pour créer les données
    Call AfficherDataSheet ' Fait appel à la fonction pour afficher les données
    ' Pour obtenir une vue en 3D sur le graphique, ces fonction sont utiles
    vlChart.RightAngleAxes = False ' Obligatoire pour activer la perspective
    vlChart.Perspective = 50 ' Vue en perspective (valeur entre 0 et 100)
    vlChart.Elevation = 45 ' Vue de haut (valeur entre 0 et 90)
    vlChart.Rotation = 180 ' Permet de faire une rotation (valeur entre 0 et 360)
     
    ' Permet de fixer la place des légendes sur le graphique sinon la légende et le graphe se superposeront
    vlChart.Legend.Position = xlLegendPositionRight
    End Sub
    Private Sub Création_des_champs()
    ' Création des noms des champs (X étant un entier ayant pour minimum 1)
    vlDataSheet.Cells(1,X).Value = "Nom de la catégorie"
    vlDataSheet.Cells(X,1).Value = "Nom de la légende"
    ' Remplissage des valeurs (Y étant un entier ayant pour minimum 2)
    vlDataSheet.Cells(Y,2) = entier
    End Sub
     
    Private Sub AfficherDataSheet()
    ' Déclaration de la variable permettant de gérer les affichages des données
    Dim gSeries As Graph.SeriesCollection
    Set gSeries = vlChart.SeriesCollection
    gSeries(Y).Fill.ForeColor.SchemeColor = "entier"
    End Sub
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Merci Gado2600 pour ton partage, je vois que tu utilise à la fois des couleurs windows de type entier numérique (SchemeColor) et les couleurs RGB.

    J'ai refais des tests, je ne vois pas où je me trompe au niveau syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ......Fill.ForeColor.RGB = RGB(255, 192, 26)
    J'ai tenté en Backcolor également:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ......Fill.BackColor.RGB = RGB(255, 192, 26)
    en enlevant le RGB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ......Fill.ForeColor= RGB(255, 192, 26)
    Voici le message d'erreur:
    Erreur de compilation:
    Nombre d'arguments incorrect ou affectation de propriété incorrecte

  6. #6
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Bonsoir,
    Il me semble que le forecolor est définit par un entier seulement compris entre 1 et 52 si mes souvenirs sont exacts.
    De plus, il me semble encore, que c'est pour l'affichage des données sur le graphique lui-même que c'est utilisé.

    Pour les textes (légendes, titres...), il faut utiliser Font.Color = RGB(R, G, B)

    Je dis sa, mais c'est ce que j'ai compris sur un tutoriel de ce forum, il y a 2 mois.
    Je partais aussi de rien pour la conception d'un graphique en VBA
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  7. #7
    Membre du Club
    Homme Profil pro
    Technicien SIG
    Inscrit en
    Mars 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien SIG

    Informations forums :
    Inscription : Mars 2013
    Messages : 62
    Points : 44
    Points
    44
    Par défaut
    Ce qui me parait étrange, c'est que l'assistant Access (l'affichage automatique et intuitive du code) me propose bien "RGB" parmi les possibilités après le "Forecolor".

    Le "Font.Color" ne m'intéresse pas puisque ce que je veux colorer n'est pas du texte.

    C'est quand même bien dommage d'être limité à 52 couleurs, m'enfin je ne vais pas m'obstiner pour ça; je lache l'affaire.

  8. #8
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Bonjour,

    Je n'ai pas de PC pour vérifier (mode [bronzette sur la plage]), mais juste quelques remarques liées à tes erreurs de compilation, pour réorienter tes recherches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ......Fill.ForeColor= RGB(255, 192, 26)
    ne peut pas marcher du fait que tu utilises
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wPoints.Item(i).Fill.ForeColor.SchemeColor = 9
    ce qui implique que Forecolor est un objet et donc
    >>> tu ne peux pas lui attribuer une valeur directement,
    >>> tu dois chercher (s'il y en a une ?) quelle(s) propriété(s) peu(ven)t prendre une couleur.
    Hint : Gado2600 utilise un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vlArea.Font.Color = RGB(rouge, vert, bleu)
    qui marche bien
    Peut être y a t-il un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ......Fill.ForeColor.Color = RGB(rouge, vert, bleu)
    qui marcherait aussi ?
    Pour le savoir, l'explorateur d'objets d'Access, que tu ouvres en cliquant sur le mot 'ForeColor' et en appuyant sur F2, va afficher toutes les propriétés et méthodes de cet objet.

    Si tu n'y trouves pas ton bonheur , tu peux creuser du côté des schemes, puisque la propriété SchemeColor marche bien.
    Cela voudrait dire que Graph utilise un modèle semblable à ceux d'Excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cell(Row, Column).Interior.IndexColor = 1 'ou autre IntegerValue
    et Powerpoint.
    Ils utilisent des palettes (==schemes) de X couleurs, attribuables par un n° de couleur de 1 à X. Mais tu peux changer chaque couleur de la palette, en lui attribuant une valeur RGB()

    Bien sûr, ça te rajouterait une étape, mais tu pourrais, par exemple,
    - une fois pour toutes , attribuer systématiquement les couleurs de 1 à X à chaque culture, sans te préoccuper de ce qu'elle représente,
    - pour chaque exploitant, changer la palette en attribuant à la couleur n°1 le RGB de sa culture n°1.
    ou autre système que tu mettras au point en connaissance du métier... ça, c'est ton boulot.

    Bon courage, et tiens nous au courant de tes recherches,

    Etienne
    Développement Office, support technique, assistance, sur place (Loire atlantique, Vendée, Maine et Loire) ou à distance.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Je suis désolé de remonter un sujet aussi lointain, mais je suis intéressé !

    Je cherche moi aussi à piloter les couleurs de mes graphiques.

    Mes 3 graphiques sont sur la même feuilles, par chance ce sont des graphiques de types camembert donc la solution de l'auteur me va pour l'instant.

    La seule chose c'est que je dois piloter 3 graphiques de ce type sur la même feuille.

    Ce que je voulais savoir concerne donc cette partie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim wChart As Graph.Chart 'déclaration variable objet contenant le dessin du graphique
        Set wChart = Me.MonGraphique.Object.Application.Chart
    Dim wLegend As Legend 'declaration variable objet contenant la legende du dessin du graphique
       Set wLegend = wChart.Legend
       wChart.HasLegend = True
    Dim wPoints As Graph.Points 'declaration variable objet contenant la position (sous-ensemble) d'une serie du graphique
        Set wPoints = wChart.SeriesCollection(1).Points 'pour un graphique de type camembert, il n'y a qu'une seule série, donc l'index est 1 pour "seriescollection"
    Dim wDataSheet As Graph.DataSheet 'declaration du tableau de donnée du graphique
        Set wDataSheet = Me.MonGraphique.Object.Application.DataSheet
    J'ai fais un bon vieux copier coller de la solution de l'auteur en 3 exemplaires, pour ce qui suit (concernant le "Select case" etc) je me suis débrouillé et j'ai ré-adapté selon le graphique concerné.

    Mais c'est cette première partie qui me pose problème: Comment je peux différencier et identifier mes différents graphiques par le code ?

    je précise que je débute sur VB Excel et que je m'attaque certainement à quelque chose qui me dépasse, mais je fais ceci par pur curiosité et pour engranger 2-3 compétences. (Si en plus ça peut enlever une épine du pied à un collègue, ce serait le jackpot)


    Merci d'avance !

  10. #10
    Membre expérimenté Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 903
    Points : 1 364
    Points
    1 364
    Par défaut
    Bonjour,

    Je n'ai pas vraiment saisie ta question...
    Tu cherches à identifier tes différents graphiques dans le code ? Ou à pouvoir les identifier dans ton outil via le code ?

    Pour le premier cas, tu définis des variables (les mêmes types de variables) avec des noms différents.
    Pour le second cas, je dirais qu'il faut que tu boucles sur tous tes objets présents dans ton outil.

    Cordialement,
    Le sabre est une arme. Le kendo est un art de tuer. Quelles que soient les belles paroles pour l'expliquer, telle est sa vérité.

  11. #11
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 004
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 004
    Points : 24 592
    Points
    24 592
    Par défaut
    Il y a un tuto sur le sujet.

    http://loufab.developpez.com/tutoriels/access/msgraph2/

    Si tu as plusieurs objets graphiques à traiter, au lieu de dupliquer le code, crée une classe.
    Détecter les modifications formulaire Cloud storage et ACCESS
    Classe MELA(CRUD) Opérateur IN et zone de liste Opérateur LIKE
    Visitez mon Blog
    Les questions techniques par MP ne sont pas lues et je ne pratique pas la bactériomancie

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/08/2012, 17h28
  2. Modifier les couleurs d'un graphique après filtre
    Par Vivi127 dans le forum VBA Access
    Réponses: 8
    Dernier message: 01/08/2012, 12h30
  3. Comment changer les couleurs d'un graphique.
    Par rob1son76 dans le forum IHM
    Réponses: 10
    Dernier message: 13/09/2010, 16h57
  4. Réponses: 5
    Dernier message: 06/02/2009, 11h24
  5. [Graphique] Comment compter les couleurs d'une image ?
    Par yoghisan dans le forum API, COM et SDKs
    Réponses: 27
    Dernier message: 16/02/2005, 18h17

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