Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/10/2011, 13h28   #1
Invité de passage
 
Homme Holger Burghardt
Développeur informatique
Inscription : octobre 2009
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Holger Burghardt
Âge : 39
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2009
Messages : 3
Points : 0
Points : 0
Par défaut 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!
Holger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 13h56   #2
Invité de passage
 
Homme Holger Burghardt
Développeur informatique
Inscription : octobre 2009
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Holger Burghardt
Âge : 39
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2009
Messages : 3
Points : 0
Points : 0
Par défaut Range Collection comme Source

J'ai avancé un peu dans ma demarche.

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.
Holger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 09h35   #3
Invité de passage
 
Homme Holger Burghardt
Développeur informatique
Inscription : octobre 2009
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Holger Burghardt
Âge : 39
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : octobre 2009
Messages : 3
Points : 0
Points : 0
Je cherche toujours votre aide

Donc, les parties pour transmettre les données de range à la graphique fonctionne, mais je cherche toujours une façon pour trier les données.

L'idée est de stockés les données dans une matrice bi-dimensionnelle de type numérique et de les trier avec une fonction, et de les remettre après dans un range pour les attribuer comme source pour la graphique.

Donc, d'abord j'ai mis les données numériques (E4:E11) dans une simple matrice (voir la source du code):
Code :
1
2
Dim myRangeToSort As Variant
	myRangeToSort = rE.Value
Après j'ai transformé les données texte (B4:B11) en format numérique, et je les mis ensemble dans une matrice bi-dimensionnelle:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
REM J'ai utilisé LBound et UBound parce-que le nombre des lignes peut être variable.
Dim boundL As Integer
	boundL = LBound(myRangeToSort)
Dim boundU As Integer
	boundU = UBound(myRangeToSort)
Dim arrSize&
	arrSize& = boundU - boundL + 1
Dim myColToSort As Variant
	ReDim myColToSort(1 To arrSize&, 1 To 2) As Long
Dim cRange As Integer
Dim cCol As Integer
	cCol = 1
 
For cRange = boundL To boundU
    myColToSort(cCol, 1) = myRangeToSort(cRange, 1)
    myColToSort(cCol, 2) = cCol
    cCol = cCol + 1
Next cRange
Et là je voulais les trier:
Code :
TriTableau (myColToSort)
Ma fonction étant:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Public Function TriTableau(MyVar())
    Dim i As Integer
    Dim j As Integer
    Dim tempA
    Dim tempB
    For i = 1 To 26
        For j = 2 To 27
            If MyVar(i, 2) < MyVar(j, 2) Then
                tempA = MyVar(i, 1)
                tempB = MyVar(i, 2)
                MyVar(i, 1) = MyVar(j, 1)
                MyVar(i, 2) = MyVar(j, 2)
                MyVar(j, 1) = tempA
                MyVar(j, 2) = tempB
            End If
        Next j
    Next i
    TriTableau = MyVar
End Function
(J'ai adapté et corrigé la fonction du page 250 dans le livre "Excel & VBA XP" de Mikaël Bidault.)

Mais ça me lance le message d'erreur:
Citation:
Erreur de compilation:

Incompatibilité de type: tableau ou type défini par l'utilisateur attendu
Quelqu'un a une idée pour-le-quoi? Ou même une meilleure solution!?
Holger est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h38.


 
 
 
 
Partenaires

Hébergement Web