Mise en forme de plusieurs graphiques (boucle For Each ?)

[Résolu/Fermé]
Signaler
-
Messages postés
10161
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
23 octobre 2021
-
Bonjour le forum,


Sous VBA (Excel 2007), j'ai une macro de mise en forme de graphique (couleur de trait, type de marqueur, etc.) que je souhaite appliquer à tous les graphiques d'une même feuille (et dans plusieurs documents, mais ça ce ne sera normalement pas un problème).
Le corps de la macro (la mise en forme) fonctionne correctement, mais je n'arrive pas à générer la boucle de sorte à prendre en compte « tous les graphiques » de ma feuille. Je suis parti sur une structure en FOR EACH...NEXT pouvoir traiter tous les graphiques, peu importe leur nombre, mais cela ne fonctionne pas. Je suppose que le problème vient de « ActiveChart.SeriesCollection(...).Select », mais je ne sais comment sélectionner les courbes d'un graphique sans passer par la sélection du graphique via un ACTIVECHART.

Quelqu'un aurait-il une solution ? Ci-dessous mon code actuel :

Sub updategraph()
    Dim graph As ChartObject
    For Each graph In Sheets("Feuille1").ChartObjects

'***contenu de la boucle :
    
'Courbe 1 (ex : 2013)
    ActiveChart.SeriesCollection(1).Select
    
    Selection.MarkerStyle = 3
    Selection.MarkerSize = 5
    
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.[/contents/1214-le-codage-rgb-rvb RGB] = RGB(0, 112, 192)
        '.Transparency = 0
        '.Solid
    End With
    
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 112, 192)
        '.Transparency = 0
        .Weight = 1.5
    End With
    

'Courbe 2 (ex : 2014)
    ActiveChart.SeriesCollection(2).Select
    
    Selection.MarkerStyle = 2
    Selection.MarkerSize = 5
    
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(146, 208, 80)
        '.Transparency = 0
        '.Solid
    End With
    
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(146, 208, 80)
        '.Transparency = 0
        .Weight = 1.5
    End With

    
'Courbe 3 (ex : 2015)
    ActiveChart.SeriesCollection(3).Select
    
    Selection.MarkerStyle = 1
    Selection.MarkerSize = 6
    
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 0, 0)
        '.Transparency = 0
        '.Solid
    End With
    
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 0, 0)
        '.ForeColor.ObjectThemeColor = msoThemeColorText1
        '.ForeColor.TintAndShade = 0
        '.ForeColor.Brightness = 0
        '.Transparency = 0
        .Weight = 2.5
    End With

    Next graph
End Sub


Merci d'avance pour votre aide :)

4 réponses

Messages postés
10161
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
23 octobre 2021
2 232
Bonjour

un petit exemple de manipulation des graphiques d'une feuille
https://www.cjoint.com/?3AgtcJfwT47

Cdlmnt
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Messages postés
10161
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
23 octobre 2021
2 232
OU avec For each graph

Sub ManipGraphique()
Dim gr As Object, nbgr As Long, nugr As Long, nbser As Long, nuser As Long
nbgr = ActiveSheet.ChartObjects.Count
For Each gr In ActiveSheet.ChartObjects
gr.Activate
nugr = gr.Index
MsgBox "graphique " & nugr & " activé"
nbser = gr.Chart.SeriesCollection.Count
For nuser = 1 To nbser
gr.Chart.SeriesCollection(nuser).Select
MsgBox "graphique " & nugr & " serie " & nuser & " selectionnée"
Next nuser
Next gr
End Sub

Cdlmnt
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Messages postés
10161
Date d'inscription
lundi 18 octobre 2010
Statut
Membre
Dernière intervention
23 octobre 2021
2 232
Je ne pense pas qu'il y ait une grande différenceau niveau temps d'exécution, si ce n'est qu'avec for ... each, tu n'as pas besoin de définir la borne sup de la boucle (nbgr = ActiveSheet.ChartObjects.Count), mais bon, vba doit peut être se rattraper ailleurs !

Bonne journée à toi
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41989 internautes nous ont dit merci ce mois-ci

Re-bonjour,

Tout d'abord merci pour la rapidité de vos réponses !
Et ensuite un encore plus grand merci car les deux méthodes fonctionnent parfaitement, c'est exactement ce que je cherchais :)

Du coup, petite question par curiosité : y a-t-il une différence entre une structure en FOR EACH et une en FOR + COUNT ?

En tout cas cela me permet de gagner un temps précieux, je vous en suis très reconnaissant.

Bonne journée !