Bonjour.

Too long; Did'nt read : Existe-til un équivalent simple de la méthode SetSourceData d'une Serie de graph qui serais GetSourceData et qui renverais le Range corespondant aux data ?


Mes fichiers excel sont très bordéliques, et j'en ai beaucoup. Mon but est de créer une macro hyper généraliste, pour pouvoir la transmetre d'un fichier à un autre.

Mes fichiers ont trois sortes de choses : Des data brutes, des data calculées, et des graphiques qui s'appuient sur ces data. Je souhaite colorer les premières en orange, les deuxièmes en bleu, et les data qui servent aux graphiques et uniquement celle ci en vert

C'est ce troisième coloriage qui me pose problème : Je n'arrive pas a obtenir l'ensemble des data utilisées par l'ensemble des graphes.

Pourriez-vous me filler un coup de main ? Voici mon code :

Code VBA : 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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Public Sub coloration()
Application.ScreenUpdating = False
 
        ' Cette macro a pour but de colorer les cell du graphe seln le code couleur suivant :
 
            ' Orange pour les data brutes
            ' Bleu pour les calculs
            ' Et verts pour les data utilisées par les graphs.
 
    ' Délaration des variables 
 
    Dim Feuille As Worksheet
    Dim Graphique As ChartObject
    Dim Courbe As series
    Dim Cell As Range
 
    ' Coloration :
 
        For Each Feuille In Worksheets
            Set Rng = Feuille.UsedRange
            For Each Cell In Rng
                If Not IsEmpty(Cell) Then
 
                    'Testons si la cellule a une formule :
                    If Cell.HasFormula Then
                            ' Alors on la colore en bleu : ( c'est une data calculée )
                            With Cell.Interior
                                .Pattern = xlSolid
                                .PatternColorIndex = xlAutomatic
                                .ThemeColor = xlThemeColorAccent1
                                .TintAndShade = 0.599993896298105
                                .PatternTintAndShade = 0
                            End With
 
                        Else
                            ' Alors on la colore en orange : ( c'est une source )
                            With Cell.Interior
                                .Pattern = xlSolid
                                .PatternColorIndex = xlAutomatic
                                .ThemeColor = xlThemeColorAccent6
                                .TintAndShade = 0.599993896298105
                                .PatternTintAndShade = 0
                            End With
                        End If
                End If
            Next Cell
        Next Feuille
 
 
        ' Passons a la coloration en vert, pour les plages utilisées par les graphs :
 
        For Each Feuille In Worksheets
            For Each Graphique In Feuille.ChartObjects
                For Each Courbe In Graphique.Chart.SeriesCollection
                    ' On récupère les formules :
 
                    FormuleX = Split(Courbe.Formula, ",")(2)
                    FormuleY = Split(Courbe.Formula, ",")(3)
 
                    ' Et on colore les cellules en vert :
 
                    For Each Cell In Range(FormuleX & ";" & FormuleY)
                        With Cell.Interior
                            .Pattern = xlSolid
                            .PatternColorIndex = xlAutomatic
                            .ThemeColor = xlThemeColorAccent3
                            .TintAndShade = 0.599993896298105
                            .PatternTintAndShade = 0
                        End With
                    Next Cell
 
                Next Courbe
            Next Graphique
        Next Feuille
 
Application.ScreenUpdating = True
End Sub


Le problème vient de la mauvaise gestion que j'ai des Series qui sont dans SeriesCollection, et de leur Formula.

l'idée etais de Split ces Formula pour en sortir uniquement ce dont j'ai besoin : Les plages de cellules servant au graphique. Cependant, d'une feuille a l'autre, les Formula ne sont pas toutes construites pareil, et je n'arrive pas a obtenir le niveau d'abstrasction de la macro que je veut.

Autre soucis : Si jamais le nom d'une feuille contient un espace, la Formula contiendra ce nom entre simple côtes ( i.e 'Nom de ma feuille' ) et dans le cas contraire, sans côtes ( i.e Nom_de_ma_feuille ). j'ai du mal a géré ces deux cas.

Dans le code ci-dessus, j'ai essayer de séparer les plages des feuilles, car je me suis apprcut qu'ensuite, j'avais du mal a utiliser Range(ma_plage) quand ma_plage contenait 'Nom de ma feuille'!A1:B10 par ex, ou encore Nom_de_ma_feuille!A1:B10

Merci d'avence si vous avez un éclair de génis, ou si vous avez une méthode GetSourceData ( et non pas SetSourceData ) qui traine !