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 !
Partager