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 :

Exploitation graphique d'un tableau (Gouvernements 1965-2015)


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Data-Journalisme
    Inscrit en
    Mars 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Data-Journalisme

    Informations forums :
    Inscription : Mars 2015
    Messages : 10
    Par défaut Exploitation graphique d'un tableau (Gouvernements 1965-2015)
    Bonjour à tous,

    J'ai pour projet de lancer un site de data-journalisme (suite à une formation traditionnelle en journalisme presse écrite web). Je débute dans le développement informatique, un peu tardivement mais bourré de motivation .

    J'ai produit un tableau représentant les différents gouvernements au pouvoir depuis 1965. Chaque colonne représente un pays, chaque ligne une année, et chaque case représente une sensibilité politique, exprimée en couleur de fond (onglet Feuille1). La saisie n'est pas terminée (50% environ), ceci dit j'explore les différentes possibilités d'exploiter le tableau.
    J'ai demandé à mon frère qui touche un peu à Visual Basic de fournir un code pour que, sur chaque ligne, les couleurs soient regroupées. Il y est parvenu assez rapidement grâce au code ci-dessous, le résultat est dans l'onglet Test.

    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
    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
    Sub CodeCouleur()
     
    'Ca sélectionne la feuille ou la macro marche, histoire de ne pas faire de bétise
    Application.Worksheets("Copie de Feuille 1").Activate
     
    'For = pour faire une boucle
    For i = 57 To 66
     
    Dim a As Long
    Dim b As Long
     
      'prends les codes couleurs
        a = Cells(i, 3).Interior.Color
        Cells(i, 2).Value = a
        b = Cells(i, 9).Interior.Color
        Cells(i, 7).Value = b
     
        'recopie les couleurs dans des cases en dessous, histoire de vérifier
        Cells(i + 13, 2).Interior.Color = a
        Cells(i + 13, 7).Interior.Color = b
    Next i
     
    End Sub
     
     
    Sub tri()
     
    'Ca sélectionne la feuille ou la macro marche, histoire de ne pas faire de bétise
    Application.Worksheets("Copie de Feuille 1").Activate
     
    'Boucle For sur les lignes
    For i = 3 To 53
        'Valeur pour la colonne qui va augmenter en fonction des couleurs trouvées
        a = 3
        'Boucle For sur les codes couleurs 1ere colonne
        For k = 57 To 66
     
            'Boucle For sur les colonnes
            For j = 3 To 144
     
                'test = est-ce que c'est la bonne couleur ?
                If Cells(i, j).Interior.Color = Cells(k, 3).Interior.Color Then
     
                    'si oui = on rentre la donnée dans la nouvelle feuille
                    Worksheets("test").Cells(i, a).Value = Cells(2, j).Value
                    Worksheets("test").Cells(i, a).Interior.Color = Cells(i, j).Interior.Color
                     a = a + 1
     
                End If
            Next j
        Next k
     
     'Boucle For sur les codes couleurs 2eme colonne
        For k = 57 To 66
     
            'Boucle For sur les colonnes
            For j = 3 To 144
     
                'test = est-ce que c'est la bonne couleur ?
                If Cells(i, j).Interior.Color = Cells(k, 9).Interior.Color Then
     
                    'si oui = on rentre la donnée dans la nouvelle feuille
                    Worksheets("test").Cells(i, a).Value = Cells(2, j).Value
                    Worksheets("test").Cells(i, a).Interior.Color = Cells(i, j).Interior.Color
                     a = a + 1
     
                End If
            Next j
        Next k
     
    Next i
     
     
    End Sub
    Enfin, j'ai copié le résultat et collé en inversant abscisse et ordonnée, afin d'obtenir une esquisse de graphique (aires empilées) allant de gauche (1965) à droite (2015), visible à l'onglet Feuil2 (en zoom à 25%, l'ensemble tient sur un écran ; ça fait un peu penser aux stats de pop dans Age of Empire, mais là c'est en vrai ). Le tout contient des erreurs, essentiellement issues de la saisie initiale, mais c'est plutôt prometteur.

    C'est là que je me tourne vers votre expérience . De son propre aveu, mon frère m'a fait un code un peu alambiqué qu'on pourrait rendre plus simple. Avez-vous une piste pour passer du tableau initial au résultat en Feuil2 par un autre chemin ?

    Plus largement, je compte exploiter les données pour les présenter de différentes manières. Je pense à produire des graphiques (camembert par année, aires empilées...) mais je suis sûr que certaines macros peuvent faire un joli boulot pour un résultat auquel je ne pense pas encore. Un conseil sur ce qui serait intéressant d'appliquer ici ?

    Enfin, l'objectif à terme est de le publier sur un site dédié et ouvert à tous, pour un rendu esthétique, voire interactif. On me conseille de passer par un logiciel de gestion de base de données, qui fournirait plus de possibilités qu'Excel - BVA. Bonne idée, ou Excel peut faire le job ?


    D'avance merci et à bientôt

    JJ
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Utiliser les couleurs de cellule en tant que données est rarement une bonne idée car c'est très compliqué à gérer, entre autre parce qu'aucune fonction Excel ne permet de déterminer la couleur de fond d'une cellule.
    Des données saisies en tant que couleur de fond sont quasiment inexploitable sans une utilisation de VBA qui les transforme en une autre forme.

    Si j'ai un conseil à te donner, c'est de faire plutôt un tableaux de base avec des valeurs (numériques ou lettres) et de l'utiliser ensuite pour en faire un équivalent couleur. Plusieurs méthodes (entre autre les Mises en Forme Conditionnelles) permettent de modifier la couleur de fond en fonction d'une valeur sans utiliser de VBA.

  3. #3
    Membre habitué
    Homme Profil pro
    Data-Journalisme
    Inscrit en
    Mars 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Data-Journalisme

    Informations forums :
    Inscription : Mars 2015
    Messages : 10
    Par défaut
    Effectivement c'est la difficulté principale qu'a rencontrée mon frère quand il a produit son code, mais il a su sans difficulté traduire la couleur de fond en donnée chiffrée. C'est la première boucle de la macro postée dans mon précédent message.

    L'objectif étant la publication sur internet, je pense transposer tout ça dans une base de données MySQL, mais je souhaitais d'abord faire le tour des possibilités offertes par Excel.

    Avis et conseils sont toujours les bienvenus, merci pour ta réponse


    JJ

  4. #4
    Membre habitué
    Homme Profil pro
    Data-Journalisme
    Inscrit en
    Mars 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Data-Journalisme

    Informations forums :
    Inscription : Mars 2015
    Messages : 10
    Par défaut
    Pour les curieux qui n'ont pas le temps / l'envie de télécharger le ZIP, voici en images ce que je présentais dans mon premier post.


    J'ai d'abord saisi un tableau représentant tous les gouvernements au pouvoir depuis 1965 :

    Nom : ScreenTableau.png
Affichages : 387
Taille : 70,0 Ko

    La macro maison a ensuite donné le tableau suivant (sur chaque ligne prise indépendamment, les couleurs sont regroupées) :

    Nom : ScreenTableau2.png
Affichages : 761
Taille : 96,3 Ko

    Enfin, j'ai inversé abscisse et ordonnée pour une esquisse de graphique allant de gauche (1965) à droite (2015) :

    Nom : ScreenTableau3.png
Affichages : 603
Taille : 59,1 Ko

    Enfin, comme on me l'a conseillé, j'ai traduit les couleurs en valeurs nominales, pour faciliter l'exploitation du tableau et son transfert prochain vers Base / MySQL :

    Nom : ScreenTableau4.png
Affichages : 582
Taille : 65,1 Ko


    Tout est dans le ZIP, y compris la légende pour ceux qui veulent voir de plus près.

    Tous les conseils techniques et idées d'exploitation graphique sont les bienvenus !


    A bientôt,

    JJ

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Je me suis intéresse sur ton fichier, néanmoins j'ai modifié quelque peu la disposition de tes données initiales (Feuil1)

    J'ai enlevé les colonnes redondantes des années (N, T, ....)
    La plage ainsi restée de C3 à DQ53 est nommée BD
    La plage des pays en ligne 2 est nommée PAYS
    La plage des années en colonne B est nommée ANNEES
    La légende est placée en une seule colonne C57:C76 est nommée CODES

    PS. Les couleurs utilisées et celles de la légende doivent être identiques.

    La feuille du résultat est nommée RESULTATS

    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
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    Option Explicit
     
    Private Type VALEURS
        Etat As String
        Annee As String
        Couleur As Long
        Code As Integer
        Gouv As String
    End Type
     
    Sub Traitement()
    Dim i As Integer, j As Integer, N As Integer, M As Integer
    Dim BD As Range, PAYS As Range, ANNEES As Range
    Dim Tb() As VALEURS
    Dim Tbk
     
    With Worksheets("Feuille 1")
        Set BD = .Range("BD")
        Set PAYS = .Range("PAYS")
        Set ANNEES = .Range("ANNEES")
        Tbk = ColorCode(.Range("CODES"))
    End With
     
    N = BD.Rows.Count
    M = BD.Columns.Count
    ReDim Tb(1 To M, 1 To N)
     
    For j = 1 To M
        For i = 1 To N
            With Tb(j, i)
                .Etat = PAYS(, j)
                .Annee = ANNEES(i)
                .Couleur = BD(i, j).MergeArea(1, 1).Interior.Color
                .Code = Codage(Tbk, .Couleur)
                .Gouv = BD(i, j).MergeArea(1, 1).Value
            End With
        Next i
    Next j
    Set BD = Nothing
    Set PAYS = Nothing
    Set ANNEES = Nothing
     
    For i = 1 To N
        TriRapide Tb, 1, M, i
    Next i
     
    With Worksheets("RESULTATS")
        .UsedRange.Clear
        For j = 1 To M
            For i = 1 To N
                With .Cells(j, i)
                    .Value = Tb(j, i).Etat & " (" & Tb(j, i).Gouv & "-" & Tb(j, i).Annee & ")"
                    .Interior.Color = Tb(j, i).Couleur
                End With
            Next i
        Next j
    End With
    End Sub
     
    Private Function ColorCode(ByVal Rng As Range)
    Dim Tmp() As Long
    Dim c As Range
    Dim p As Integer
     
    ReDim Tmp(1 To Rng.Count)
    For Each c In Rng
        p = p + 1
        Tmp(p) = c.Interior.Color
    Next c
    ColorCode = Tmp
    End Function
     
     
    Private Function Codage(ByVal Tmp, ByVal Coul As Long) As Integer
    Dim i As Integer
     
    For i = 1 To UBound(Tmp)
        If Tmp(i) = Coul Then
            Codage = i
            Exit For
        End If
    Next i
    End Function
     
     
    Private Sub TriRapide(Tbl() As VALEURS, G As Integer, D As Integer, k As Integer)
    Dim T As Long
    Dim Tmp As VALEURS
    Dim L As Integer
    Dim H As Integer
     
    L = G
    H = D
    T = Tbl((G + D) \ 2, k).Code
    Do While L <= H
        Do While Tbl(L, k).Code < T And L < D
            L = L + 1
        Loop
        Do While T < Tbl(H, k).Code And H > G
            H = H - 1
        Loop
        If L <= H Then
            Tmp = Tbl(L, k)
            Tbl(L, k) = Tbl(H, k)
            Tbl(H, k) = Tmp
            L = L + 1
            H = H - 1
        End If
    Loop
    If G < H Then TriRapide Tbl, G, H, k
    If L < D Then TriRapide Tbl, L, D, k
    End Sub

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par JokerJet Voir le message
    Effectivement c'est la difficulté principale qu'a rencontrée mon frère quand il a produit son code, mais il a su sans difficulté traduire la couleur de fond en donnée chiffrée.
    Effectivement, par VBA, ça ne pose pas de problème.
    Mais je parlais d'une exploitation de cette information via des fonctions Excel. C'est quasiment impossible.
    Ce qui implique qu"on ne peut pas faire de traitements simples et dynamiques dans des feuilles de calculs mais qu'on est obligé de recourir systématiquement à du VBA.

  7. #7
    Membre habitué
    Homme Profil pro
    Data-Journalisme
    Inscrit en
    Mars 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Data-Journalisme

    Informations forums :
    Inscription : Mars 2015
    Messages : 10
    Par défaut
    Effectivement, par VBA, ça ne pose pas de problème.
    Mais je parlais d'une exploitation de cette information via des fonctions Excel. C'est quasiment impossible.
    Ce qui implique qu"on ne peut pas faire de traitements simples et dynamiques dans des feuilles de calculs mais qu'on est obligé de recourir systématiquement à du VBA.
    Oui, je ne doute pas que les fonctions Excel offrent une foule de possibilités, mais vu mon projet, c'est la programmation qui m'intéresse

    Je me suis intéresse sur ton fichier, néanmoins j'ai modifié quelque peu la disposition de tes données initiales (Feuil1)
    Super, merci d'y avoir jeté un coup d'oeil ! Mais je n'arrive pas à exécuter ta macro... Quand j'essaye de la lancer, j'ai une boîte "Erreur de compilation : Type défini par l'utilisateur non défini", avec cette ligne sélectionnée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub TriRapide(Tbl() As VALEURS, G As Integer, D As Integer, k As Integer
    C'est sans doute une grossière erreur de débutant J'ai quand même bien replacé et nommé les plages comme tu m'indiques.

    Merci de ton aide,


    JJ

  8. #8
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Une erreur de débutant ou bien un laisser aller apparent, car avant de proposer quelque chose clé en main, je teste et re-teste sur ton fichier en prenant en compte les changements de dispositions cités en préambule.

    PS. le code fonctionne chez moi sur ton fichier, fini donc mon boulot

    Désolé pour mon sarcasme inhabituel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JpGraph] Positionner un graphique dans un tableau
    Par olivier94 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 24/03/2007, 15h38
  2. [VBA-E] Graphique suite à un tableau d'amortissement
    Par iupien78 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/02/2007, 16h03
  3. [VBA-EXCEL] Graphique à partir de Tableau
    Par mimic50 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 06/02/2007, 19h12
  4. visualisation graphique d un tableau
    Par gilles_bzh dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 06/12/2006, 21h50
  5. représentation graphique d' un tableau en c
    Par Le Lion dans le forum C
    Réponses: 5
    Dernier message: 05/07/2006, 23h46

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