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)