Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Modifier l'ordre de présentation des données dans un graphique Secteur

iriviere@mediation-nantes

XLDnaute Nouveau
Bonjour,
Je n'arrive pas à bouger à ma guise l'ordre de présentation des données dans mes graphiques. Ils sont en pièce jointe.
1) Je veux qu'apparaissent à gauche les données avec le pourcentage le plus fort et à droite en bas les pourcentages les plus faibles. J'ai fait plusieurs essais en modifiant l'ordre des données dans le tableau source mais ça marche pas ...
2) Je voudrais aussi avoir la main sur les couleurs : typiquement je veux que la donnée la plus importante soit en vert.
Merci pour votre aide précieuse !
Isa
 

Pièces jointes

  • Secteurs_stats_2024.xlsx
    22.1 KB · Affichages: 7

Efgé

XLDnaute Barbatruc
Bonjour @iriviere@mediation-nantes , bonjour @sylvanu , le fil, le forum

L'utilisation de camemberts n'est vraiment pas conseillée après deux valeurs.
Les camemberts en 3D c'est pire. Mais, bon; pourquoi pas....

J'ai fait plusieurs essais en modifiant l'ordre des données dans le tableau source mais ça marche pas ...

Justement, le tableau de données est dans un autre classeur. As tu modifié l'autre classeur ?
Pour ce qui est de choisir l'orientation du graph, il y a :
Mise en forme de la zone traçage :


Pour les couleurs, il faudra les faire à la main ou créer une usine à gaz VBA.
Cordialement
 

crocrocro

XLDnaute Occasionnel
Bonjour le fil,
je crois que tout a été dit et / ou fait par @sylvanu et @Efgé .
@iriviere@mediation-nantes, une précision concernant le choix des couleurs (comme l'a mis en place @sylvanu dans son fichier) et où il semblerait que vous ayez des difficultés pour modifier la couleur secteur par secteur :
- le 1er clic sur le camembert sélectionne tous les secteurs, et donc les modifications affecteront tous les secteurs)
- le 2ème clic, sélectionne le secteur du clic, les modifications n'affecteront alors que ce secteur.
Si les données sont dynamiques, donc avec un ordre de pourcentage qui peut varier,
cela se complique, car alors il faudra repeindre le camembert
ou comme le dit @Efgé, en exagérant un peu
créer une usine à gaz VBA
voici le code qui permet de le faire
VB:
Sub RepeindreMonCamembert()
    ActiveSheet.ChartObjects("Graphique 2").Activate
    ActiveChart.FullSeriesCollection(1).Points(1).Format.Fill.ForeColor.RGB = RGB(0, 255, 255)
    ActiveChart.FullSeriesCollection(1).Points(2).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)
    ActiveChart.FullSeriesCollection(1).Points(3).Format.Fill.ForeColor.RGB = RGB(0, 255, 0)
    ActiveChart.FullSeriesCollection(1).Points(4).Format.Fill.ForeColor.RGB = RGB(0, 0, 255)
    ActiveChart.FullSeriesCollection(1).Points(5).Format.Fill.ForeColor.RGB = RGB(255, 0, 255)
End Sub
Il ne reste alors pour vous qu'à choisir les couleurs
EDIT : j'ai écrit une bêtise, en fait pas besoin de VBA, le fichier de @sylvanu conserve les couleurs même si l'ordre varie.

EDIT 2 :
A partir du fichier de @sylvanu qui, par ses formules en colonnes J, K et L a résolu la question de l'ordre et donc aussi des couleurs, le paramétrage de l'angle du 1er secteur à 180° (voir ci-dessous) permet de répondre à la question
1) Je veux qu'apparaissent à gauche les données avec le pourcentage le plus fort et à droite en bas les pourcentages les plus faibles.



Et pour la petite usine à gaz évoquée par @Efgé , le code ci-dessous permet, sans utiliser de formules en j,k,l d'affecter les couleurs souhaitées pour la valeur la plus grande et les suivantes. Il ne permet cependant pas d'orienter les secteurs (le plus grand à droite ...
VB:
Sub RepeindreMonCamembert()
Dim Fin As Boolean
Dim i As Integer, j As Integer
Dim TabValeurs() As Variant, TabValeursTri() As Variant
    ActiveSheet.ChartObjects("Graphique 3").Activate
    TabValeurs = ActiveChart.FullSeriesCollection(1).Values
    ReDim TabValeursTri(1 To 2, LBound(TabValeurs) To UBound(TabValeurs))
    For i = LBound(TabValeurs) To UBound(TabValeurs)
        TabValeursTri(1, i) = i
        TabValeursTri(2, i) = TabValeurs(i)
    Next i
    Tri2D TabValeursTri
    For i = LBound(TabValeursTri, 2) To UBound(TabValeursTri, 2)
        ' le tableau est trié par ordre décroissant
        j = TabValeursTri(1, i)
        Select Case i
            Case 1 ' Vert
                ActiveChart.FullSeriesCollection(1).Points(j).Format.Fill.ForeColor.RGB = RGB(0, 255, 0)
            Case 2 ' Bleu
                ActiveChart.FullSeriesCollection(1).Points(j).Format.Fill.ForeColor.RGB = RGB(0, 0, 255)
            Case 3 ' Jaune
                ActiveChart.FullSeriesCollection(1).Points(j).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)
            Case 4 ' Cyan
                ActiveChart.FullSeriesCollection(1).Points(j).Format.Fill.ForeColor.RGB = RGB(0, 255, 255)
            Case 5 ' Magenta
                ActiveChart.FullSeriesCollection(1).Points(j).Format.Fill.ForeColor.RGB = RGB(255, 0, 255)
            Case 6 ' Rouge
                ActiveChart.FullSeriesCollection(1).Points(j).Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
            Case Else
                MsgBox "Couleur non prévue pour la " & i & " ème valeur !"
        End Select
    Next i

End Sub
Sub Tri2D(pTableau2D())

Dim i As Integer
Dim j As Integer
Dim Temp() As Variant

    ReDim Temp(1 To 2)
    'Tri par ordre décroissant de la 2ème dimension (la valeur des séries)
    For i = LBound(pTableau2D, 2) To UBound(pTableau2D, 2)
        For j = i + 1 To UBound(pTableau2D, 2)
            If CDbl(pTableau2D(2, i)) < CDbl(pTableau2D(2, j)) Then
                Temp(1) = pTableau2D(1, j)
                Temp(2) = pTableau2D(2, j)
                pTableau2D(1, j) = pTableau2D(1, i)
                pTableau2D(2, j) = pTableau2D(2, i)
                pTableau2D(1, i) = Temp(1)
                pTableau2D(2, i) = Temp(2)
            End If
        Next j
    Next i
End Sub
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
J'ai un module de classe Couleur permettant d'établir facilement un code de couleur dépendant de niveaux numériques variables. Ce classeur joint en est équipé.
 

Pièces jointes

  • CouleurClsCarlos.xlsm
    58.3 KB · Affichages: 4

crocrocro

XLDnaute Occasionnel
Bonjour le fil,
en pj une proposition (usine à gaz 2) avec du Code VBA, sans utiliser de formules en j,k,l d'affecter les couleurs souhaitées pour la valeur la plus grande et les suivantes et d'orienter les secteurs (le plus grand à droite ...)
Situation initiale

Après Exécution de la macro LancerRepeindreEtOrdonnerMonCamembert par le Bouton Couleurs Ordonnées. Le Bouton Réinitialiser permet de revenir à la situation initiale.


Le code VBA

VB:
Sub Tri2D(pTableau2D(), pAsc As Boolean)
Dim i As Integer
Dim j As Integer
Dim Temp() As Variant

    ReDim Temp(1 To 2)
    'Tri par ordre Asc ou Desc de la 2ème dimension (la valeur des séries)
    For i = LBound(pTableau2D, 2) To UBound(pTableau2D, 2)
        For j = i + 1 To UBound(pTableau2D, 2)
            If (CDbl(pTableau2D(2, i)) < CDbl(pTableau2D(2, j)) And Not (pAsc)) _
            Or (CDbl(pTableau2D(2, i)) > CDbl(pTableau2D(2, j)) And (pAsc)) Then
                Temp(1) = pTableau2D(1, j)
                Temp(2) = pTableau2D(2, j)
                pTableau2D(1, j) = pTableau2D(1, i)
                pTableau2D(2, j) = pTableau2D(2, i)
                pTableau2D(1, i) = Temp(1)
                pTableau2D(2, i) = Temp(2)
            End If
        Next j
    Next i
End Sub
Sub LancerReinitMonCamembert()
Dim iSerie As Integer
    ActiveSheet.ChartObjects("Graphique 3").Activate
    'ici la dernière
    iSerie = ActiveChart.SeriesCollection.Count
    ReinitSerie ActiveChart.FullSeriesCollection(iSerie), ActiveSheet.Range("$L$3:$L$8"), ActiveSheet.Range("$K$3:$K$8")
End Sub
Sub LancerRepeindreEtOrdonnerMonCamembert()
Dim iSerie As Integer
    ActiveSheet.ChartObjects("Graphique 3").Activate
    'ici la dernière
    iSerie = ActiveChart.SeriesCollection.Count
    ReinitSerie ActiveChart.FullSeriesCollection(iSerie), ActiveSheet.Range("$L$3:$L$8"), ActiveSheet.Range("$K$3:$K$8")
    RepeindreEtOrdonnerMonCamembert ActiveChart.FullSeriesCollection(iSerie)
End Sub
Sub RepeindreEtOrdonnerMonCamembert(pSerie As Object)
Dim i As Integer, j As Integer, k As Variant
Dim TabValeurs() As Variant, TabValeursTri() As Variant
Dim Valeurs As String, XValeurs As String

    TabValeurs = pSerie.Values
    ReDim TabValeursTri(1 To 2, LBound(TabValeurs) To UBound(TabValeurs))
    For i = LBound(TabValeurs) To UBound(TabValeurs)
        TabValeursTri(1, i) = i
        TabValeursTri(2, i) = TabValeurs(i)
    Next i
    ' le tableau est trié par ordre décroissant des valeurs de la série
    Tri2D TabValeursTri, False
    Valeurs = ""
    XValeurs = ""
    For i = LBound(TabValeursTri, 2) To UBound(TabValeursTri, 2)
        j = TabValeursTri(1, i)
        If Valeurs = "" Then Valeurs = "=" Else Valeurs = Valeurs & ","
        If XValeurs = "" Then XValeurs = "=" Else XValeurs = XValeurs & ","
        ' On redéfinit la plage de l'adresse de la plus grande valeur à la plus petite
        Valeurs = Valeurs & ActiveSheet.Name & "!" & Range("$L$3").Offset(j - 1, 0).Address
        XValeurs = XValeurs & ActiveSheet.Name & "!" & Range("$K$3").Offset(j - 1, 0).Address
        ' on colorise le secteur en fonction de son ordre (décroissant)
        Select Case i
            Case 1 ' Vert
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(0, 255, 0)
            Case 2 ' Bleu
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(0, 0, 255)
            Case 3 ' Jaune
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)
            Case 4 ' Cyan
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(0, 255, 255)
            Case 5 ' Magenta
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(255, 0, 255)
            Case 6 ' Rouge
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
            Case Else
                MsgBox "Couleur non prévue pour la " & i & " ème valeur !"
        End Select
    Next i
    ' On redéfinit les plages de valeurs de la série (ordre décroissant)
    pSerie.Values = Valeurs
    pSerie.XValues = XValeurs
End Sub
Sub ReinitSerie(pSerie As Object, pPlageValues As Range, pPlageXValues As Range)
Dim Valeurs As String, XValeurs As String
    ' On redéfinit les plages de valeurs de la série
    Valeurs = "=" & ActiveSheet.Name & "!" & pPlageValues.Address
    XValeurs = "=" & ActiveSheet.Name & "!" & pPlageXValues.Address
    pSerie.Values = Valeurs
    pSerie.XValues = XValeurs
End Sub
 

Pièces jointes

  • Secteurs_stats_2024crocrocro.xlsm
    37.5 KB · Affichages: 2

crocrocro

XLDnaute Occasionnel
Bonjour le fil,
En pj, une nouvelle version de ma proposition précédente.

L'onglet Graphique correspond à l'onglet de la demande d'origine où la plage utilisée pour le graphique a pour nom PLAGE_GRAPHIQUE (ce qui permet de déclencher le rafraichissement du graphique quand elle est modifiée).
Le bouton Réinitialiser est juste là pour rejouer les modifications (Couleurs, ordre ...)



L'onglet Couleurs peut servir de modèle pour choisir les couleurs des secteurs du graphique :
La macro AfficherInfosCouleur (Bouton Calculer les couleurs) affiche dans le tableau les propriétés Color ColorIndex, RGB des couleurs de fond en colonne A. Il suffit alors, pour chaque ligne Couleur de reporter les valeurs des colonnes R,V,B pour le secteur correspondant dans la macro RepeindreEtOrdonnerMonCamembert.
La macro CouleurDepuisModele (Bouton Couleur Depuis Modele) colorise la couleur de fond de la colonne A coloriser à partir de celle de la colonne Modèle. Au prix d'une petite adaptation du code, on pourra adapter la couleur des secteurs dynamiquement (çà s'est si on veur se faire plaisir!).

Le code VBA :
VB:
Private Sub BoutonReinit_Click()
    LancerReinitMonCamembert
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not (Intersect(Target, Range("PLAGE_GRAPHIQUE")) Is Nothing) Then
        LancerRepeindreEtOrdonnerMonCamembert
    End If
End Sub
'=============================================
' Macros de la feuille Graphique
'=============================================
Sub LancerReinitMonCamembert()
Dim iSerie As Integer
    ActiveSheet.ChartObjects("Graphique 3").Activate
    'ici la dernière
    iSerie = ActiveChart.SeriesCollection.Count
    ReinitSerie ActiveChart.FullSeriesCollection(iSerie), ActiveSheet.Range("$L$3:$L$8"), ActiveSheet.Range("$K$3:$K$8")
End Sub
Sub LancerRepeindreEtOrdonnerMonCamembert()
Dim iSerie As Integer
    ActiveSheet.ChartObjects("Graphique 3").Activate
    'ici la dernière
    iSerie = ActiveChart.SeriesCollection.Count
    ReinitSerie ActiveChart.FullSeriesCollection(iSerie), ActiveSheet.Range("$L$3:$L$8"), ActiveSheet.Range("$K$3:$K$8")
    RepeindreEtOrdonnerMonCamembert ActiveChart.FullSeriesCollection(iSerie), ActiveSheet.Range("$L$3:$L$8"), ActiveSheet.Range("$K$3:$K$8")
End Sub
Sub RepeindreEtOrdonnerMonCamembert(pSerie As Object, pPlageValues As Range, pPlageXValues As Range)
Dim i As Integer, j As Integer, k As Variant
Dim TabValeurs() As Variant, TabValeursTri() As Variant
Dim Valeurs As String, XValeurs As String

    TabValeurs = pSerie.Values
    ' Tableau à 2 dim :
    '  dim 1 = n° d'item dans la série
    '  dim 2 = valeur de l'item dans la série
    ReDim TabValeursTri(1 To 2, LBound(TabValeurs) To UBound(TabValeurs))
    For i = LBound(TabValeurs) To UBound(TabValeurs)
        TabValeursTri(1, i) = i
        TabValeursTri(2, i) = TabValeurs(i)
    Next i
    ' Tri du tableau par ordre décroissant des valeurs de la série
    Tri2D TabValeursTri, False
    Valeurs = ""
    XValeurs = ""
    For i = LBound(TabValeursTri, 2) To UBound(TabValeursTri, 2)
    ' on aurait pu écrire For i = 1 To pSerie.Points.Count
        j = TabValeursTri(1, i)
        If Valeurs = "" Then Valeurs = "=" Else Valeurs = Valeurs & ","
        If XValeurs = "" Then XValeurs = "=" Else XValeurs = XValeurs & ","
        ' On redéfinit la plage de l'adresse de la plus grande valeur à la plus petite
        k = pPlageValues(1, 1)
        Valeurs = Valeurs & ActiveSheet.Name & "!" & pPlageValues(1, 1).Offset(j - 1, 0).Address
        XValeurs = XValeurs & ActiveSheet.Name & "!" & pPlageXValues(1, 1).Offset(j - 1, 0).Address
        ' on colorise le secteur en fonction de son ordre (décroissant)
        Select Case i
            Case 1 ' Vert
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(0, 255, 0)
            Case 2 ' Bleu
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(0, 0, 255)
            Case 3 ' Jaune
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(255, 255, 0)
            Case 4 ' Cyan
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(0, 255, 255)
            Case 5 ' Magenta
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(255, 0, 255)
            Case 6 ' Rouge
                pSerie.Points(j).Format.Fill.ForeColor.RGB = RGB(255, 0, 0)
            Case Else
                ' ne doit pas arriver
                MsgBox "Couleur non prévue pour la " & i & " ème valeur !"
        End Select
    Next i
    ' On actualise les plages de valeurs de la série (ordre décroissant)
    pSerie.Values = Valeurs
    pSerie.XValues = XValeurs
End Sub
Sub ReinitSerie(pSerie As Object, pPlageValues As Range, pPlageXValues As Range)
Dim i As Integer, j As Integer
Dim Valeurs As String, XValeurs As String
    ' On redéfinit les plages de valeurs de la série
    Valeurs = "=" & ActiveSheet.Name & "!" & pPlageValues.Address
    XValeurs = "=" & ActiveSheet.Name & "!" & pPlageXValues.Address
    pSerie.Values = Valeurs
    pSerie.XValues = XValeurs
    ' couleurs en dégradé de bleu
    For i = 1 To pSerie.Points.Count
        j = Application.Max(0, (255 - (i - 1) * 20))
        pSerie.Points(i).Format.Fill.ForeColor.RGB = RGB(0, j, j)
    Next i
End Sub
Sub Tri2D(pTableau2D(), pAsc As Boolean)
Dim i As Integer
Dim j As Integer
Dim Temp() As Variant

    ReDim Temp(1 To 2)
    'Tri par ordre Asc ou Desc de la 2ème dimension (la valeur des séries)
    For i = LBound(pTableau2D, 2) To UBound(pTableau2D, 2)
        For j = i + 1 To UBound(pTableau2D, 2)
            If (CDbl(pTableau2D(2, i)) < CDbl(pTableau2D(2, j)) And Not (pAsc)) _
            Or (CDbl(pTableau2D(2, i)) > CDbl(pTableau2D(2, j)) And (pAsc)) Then
                Temp(1) = pTableau2D(1, j)
                Temp(2) = pTableau2D(2, j)
                pTableau2D(1, j) = pTableau2D(1, i)
                pTableau2D(2, j) = pTableau2D(2, i)
                pTableau2D(1, i) = Temp(1)
                pTableau2D(2, i) = Temp(2)
            End If
        Next j
    Next i
End Sub
'=============================================
' Macros de la feuille Couleurs
'=============================================
Sub AfficherInfosCouleur()
Dim Cellule As Range
Const R = 5, V = 6, B = 7
    If ActiveSheet.Name <> "Couleurs" Then
        MsgBox "pas sur la bonne feuille"
        Exit Sub
    End If

    For Each Cellule In Range("COULEURS")
        With Cellule
            .Offset(0, 2) = .Interior.Color
            .Offset(0, 3) = .Interior.ColorIndex
            'extraire RVB
            .Offset(0, R) = Int(.Interior.Color Mod 256)
            .Offset(0, V) = Int((.Interior.Color Mod 65536) / 256)
            .Offset(0, B) = Int(.Interior.Color / 65536)
            ' inverse RGB -> Color
            .Offset(0, 9) = (.Offset(0, R) * 1) + (.Offset(0, V) * 256) + (.Offset(0, B) * 65536)
        End With
    Next
    Set Cellule = Nothing
End Sub
Sub CouleurDepuisModele()
Dim Cellule As Range
Dim NomCelluleModele As String
    On Error Resume Next
    For Each Cellule In Range("A_COLORISER")
        ' Couleur par défaut
        Cellule.Interior.Color = vbBlack
        ' Couleur du modèle
        NomCelluleModele = "COULEUR_" & Cellule.Row
        Cellule.Interior.Color = Range(NomCelluleModele).Interior.Color
    Next Cellule
    On Error GoTo 0
End Sub
Le principe :
On ne modifie pas directement l'ordre des cellules de la plage K3:L8 comme l'a fait @sylvanu mais uniquement la formule plage des données du graphique où, la macro remplace (voir propriété Formula de la série)
=Feuil1!$K$3:$L$8 par
"=Feuil1!$L$4,Feuil1!$L$8,Feuil1!$L$6,Feuil1!$L$3,Feuil1!$L$5,Feuil1!$L$7" (propriété Values de la série) et
"=Feuil1!$K$4,Feuil1!$K$8,Feuil1!$K$6,Feuil1!$K$3,Feuil1!$K$5,Feuil1!$K$7" (propriété XValues de la série)
en accord avec l'ordre décroissant des valeurs.
Bien sûr, pour ce qui est de la présentation du graphique, a proposition de Sylvanu, fait à peu-près la même chose ... avec simplement 2 formules !
 

Pièces jointes

  • Secteurs_stats_2024crocrocro.xlsm
    51.5 KB · Affichages: 2
Dernière édition:

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…