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

Résolu
Blurrry -  
ccm81 Messages postés 11033 Statut Membre -
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

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
  3. Blurrry
     
    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 !
    0