IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA: Tri de range collection pour les graphiques


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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!

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    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 : 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
    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.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    TriTableau (myColToSort)
    Ma fonction étant:
    Code : 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
    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:
    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!?

Discussions similaires

  1. Problème avec ChartFX pour les graphiques
    Par Saten dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/10/2008, 16h41
  2. Réponses: 2
    Dernier message: 08/09/2006, 21h32
  3. [VBA-E] range discontinue pour un graphique
    Par gruget dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 02/05/2006, 01h56
  4. [VBA-E] Creer une collection contenant les workbook ouverts
    Par jarod_bx dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/04/2006, 22h46
  5. [VBA-E]range discontinue pour un graphique
    Par gruget dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/03/2006, 12h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo