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

Résolu/Fermé
Blurrry - Modifié par jordane45 le 6/01/2015 à 17:29
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 - 7 janv. 2015 à 11:39
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

ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
6 janv. 2015 à 18:54
Bonjour

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

Cdlmnt
1
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
7 janv. 2015 à 09:22
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
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
7 janv. 2015 à 11:39
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
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