VBA: Tri de range collection pour les graphiques
Bonjour,
j'ai un problème et j'espère que mon mauvais français ne posera pas de problème supplementaire.
Je développe pour un client des graphiques (de type histogramme groupé, Clustered Chart) pour les reportings de la production.
Le tableau d'origine est de la forme suivante (où E contient les données du mois janvier, K contient les données de fevrier et Y celles de mars):
Code:
1 2 3 4 5 6 7 8 9
| A B E K Y
4 Group One Green 5 3 3
5 Yellow 3 7 4
6 Blue 7 6 2
7 Grey 9 1 8
8 Group Two High 1 5 1
9 Low 2 6 6
10 Group Three Small 5 1 2
11 Large 1 1 5 |
Je veux créé des graphiques pour chaque mois où les données sont triées par groupe, donc les données pour la graphique du mois janvier seront triées de la façon suivante:
Code:
1 2 3 4 5 6 7 8 9
| A B E
4 Group One Grey 9
5 Blue 7
6 Green 5
7 Yellow 3
8 Group Two Low 2
9 High 1
10 Group Three Small 5
11 Large 1 |
Le tableau d'origine n'est pas a changer, mais car je vais avoir beaucoup des graphiques, je ne veux pas faire le tri etc. sur les feuilles; mais dans la graphique ou un macro VBA.
Jusqu'ici j'ai essayé plusieurs techniques, jusque là sans succès.
Range Collection - Sort Method - Chart.SetSourceData
La méthode la plus directe sera de stockées les données dans une range collection, trier les données avec la méthode Sort et finalement créer la graphique avec le résultat du tri.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Sub AddChartObject()
Dim rA As Range
Set rA = Range("A4:B11")
Dim rE As Range
Set rE = Range("E4:E11")
Dim rangeAll As Range
Set rangeAll = Union(rA, rE)
rangeAll.Sort Key1:=X, Order1:=xlDescending, Key2:=Y, Order2:=xlAscending
Dim myChtObj As ChartObject
Set myChtObj = ActiveSheet.ChartObjects.Add _
(Left:=100, Width:=375, Top:=75, Height:=225)
myChtObj.Chart.SetSourceData Source:=rangeAll myChtObj.Chart.ChartType = xlColumnClustered
End Sub |
C'est évident que ça ne peut pas marché comme ça, mais ça vous donnera peut-être l'idée.
Il y a plusieurs problème avec ça:
1) Je veux que les données sont triées par groupe, donc les lignes 4 à 7, après les lignes 8 à 9 et finalement 10 à 11. L'ordre des groupes n'est pas changé.
2) Je ne sais pas comment mettre le Key pour trier dans une range collection.
3) Je ne sais même pas si ça marche, si je fourni Chart.SetSourceData avec une range collection comme source.
Si vous avez des questions ou (mieux) des solutions, n'hesitez pas de les poser ou proposer.
Merci!
Range Collection comme Source
J'ai avancé un peu dans ma demarche. :P
La première et la troisième partie de mon code fonctionne.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Sub AddChartObject()
Dim rA As Range
Set rA = Range("A4:B11")
Dim rE As Range
Set rE = Range("E4:E11")
Dim rangeAll As Range
Set rangeAll = Union(rA, rE)
rangeAll.Sort Key1:=X, Order1:=xlDescending, Key2:=Y, Order2:=xlAscending
Dim myChtObj As ChartObject
Set myChtObj = ActiveSheet.ChartObjects.Add _
(Left:=100, Width:=375, Top:=75, Height:=225)
myChtObj.Chart.SetSourceData Source:=rangeAll
myChtObj.Chart.ChartType = xlColumnClustered
End Sub |
C'est donc la deuxième partie (en rouge) que je n'arrive pas à faire marcher.