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 :

Graphiques camembert Excel


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut Graphiques camembert Excel
    Bonjour,


    J'ai un code VBA qui lit une base de données Excel classée par "record" et qui utilise ces données pour afficher un graphique en camembert personnalisé pour chaque record.
    Seulement voilà ... les étiquettes liées aux portions du camembert changent constament de position en fonction du "record" lu et se superposent parfois (et les leaderlines s'entrecroisent)...

    Je ne trouve pas de commande pour faire en sorte que les étiquettes du camembert n'entrent pas en collision et s'ajustent automatiquement ...

    Existe-il une solution à ce problème ?
    Grand merci pour votre attention

    Frank26

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Tout doit dépendre de la façon dont tu construit ton graphe. Le fais-tu en une seule fois ou ajoutes-tu des éléments par soft ?

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut
    Le graphique est construit une fois pour toute et se trouve sur la deuxième sheet excel. Je ne le construis pas par des commandes VBA.

    La première sheet est pour la base de données de lecture.

    Pour que le camembert soit variable pour chaque record lu dans la DB, je mets à jour le tableau sur lequel se base le camembert (c'est-à-dire des cellules de la feuille excel).

    J'ai essayé avec les lignes de commandes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    With Worksheets(2).ChartObjects(1).Chart.SeriesCollection(1)
        .HasDataLabels = True
        .DataLabels.Position = xlLabelPositionBestFit
        .HasLeaderLines = True
        .LeaderLines.Border.ColorIndex = 5
    End With
    mais ça ne donne rien, le code échoue sur "LeaderLines.Border.ColorIndex = 5"
    ...

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    Je constate (après test) que tu à reproduit exactement la fonction de MSN aide, toutefois, je pense que les constantes tel que xlLabelPositionBestFit
    ne font que déterminer - à gauche - a droite - en bas - en haut -a gauche , et qu'elle ne conditionnent en rien la position réelle des labels.
    Et je pense aussi, que les positions sont déterminées par Excel et que le seul moyen de les déplacer est en manuel. J'ai déjà eu ce problème et avant de les imprimer je mettait les labels en bonne position. Si le fichier est sauver, ces nouvelles positions sont enrégistrées.
    A+

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Le problème est la modification des données. L'adaptation des étiquettes au graphe modifié ne se fait pas (apparemment) Ce que tenterais, une fois les données mises à jour, c'est supprimer tes étiquettes par soft avant de les remettre. Excel devrait ranger tout ça de manière automatique comme il sait bien le faire manuellement.
    A tout hasard...

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    bonsoir,
    désolé ouskel'n"or, mais pour une fois je connais bien le problème, l'ayant eu à mainte et mainte reprises, et excel met les 'labels' d'une certaine façons et pas moyen de les changer si ce n'est en manuel. Je n'ai pas trouvé de possibilité de les alignés, et en plus sur quel critères ?
    A+

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut
    Merci à tous les deux pour les suggestions !

    La solution de modifier manuellement, je ne peux pas l'apliquer vu que j'ai +/-3000 personnes différentes dans ma DB ayant chacun un Chart personnalisé. Ca signifierait que je devrais consulter 3000 camemberts différents pour voir s'ils ont un aspect correct ...

    Je sais qu'un résultat automatique existe puisque j'ai vu le résultat fini sur document imprimés à la chaine ...

    J'ai essayé de créer les camemberts (3D pie) directement par code VBA, apparemment j'arrive proche du but... mais je n'arrive pas à jouer sur la taille ou longueur des leaderlines (càd les lignes qui lient les étiquettes au camembert)

    une idée ... ?

    Grand merci

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bonjour,
    Qu'entend tu par créer le graph par VBA ?
    J'ai testé un graph 3D camembert avec 30 données, et tout les labels et lignes sont alignés convenablement quel que soit la grandeur du graph. Or tu dit que chez toi il se croisent et/ou se superpose ?
    Je ne vois pas de solution, vu que je n'ai pas ce problème.
    A+

  9. #9
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut
    Pour être concret voici ce que je code en VBA pour construire le pie chart :

    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
    Set graph = base.Worksheets("template").ChartObjects.Add(70, 6850, 430, 270)
         With graph.Chart
             .ChartType = xl3DPie
             .SeriesCollection.NewSeries
             .SeriesCollection(1).XValues = Worksheets("param et graph").Range("A51:A55")
             .SeriesCollection(1).Values = Worksheets("param et graph").Range("C51:C55")
             .SeriesCollection(1).Name = "Votre financement sur base annuelle"
             .SeriesCollection(1).HasDataLabels = True
             .SeriesCollection(1).HasLeaderLines = True
             .SeriesCollection(1).LeaderLines.Border.ColorIndex = 1
             .HasLegend = False
             .ChartArea.Interior.ColorIndex = xlPatternNone
             .ChartArea.Border.ColorIndex = xlPatternNone
             .PlotArea.Interior.ColorIndex = xlPatternNone
             .SeriesCollection(1).ApplyDataLabels Type:=xlDataLabelsShowLabelAndPercent
             .SeriesCollection(1).DataLabels.Font.Size = 7
         End With
             Dim pt As Point
             For Each pt In graph.Chart.SeriesCollection(1).Points
             pt.Explosion = 10
             Next pt
    Mon problème est que les étiquettes restent "collées" au camembert et ne s'enloignent pas suffisament, ce qui fait qu'elles se superposent à chaque fois ... Y'a-t-il une proriété ou méthode pour alonger la taille des leaderlines ?

    Merci pour votre attention

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Bon, ben j'ai transpiré

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        ActiveChart.SeriesCollection(1).DataLabels.Select
        ActiveChart.SeriesCollection(1).Points(5).DataLabel.Select
        Selection.Left = 389
        Selection.Top = 159
    Pour déplacer le labels....
    A+
    Edit:
    Mais comme je le dit dans un poste précédant sur quel base ???
    Il te faudra faire de la trigono et là j'ai oubliè, depuis le temps que je ne ne m'en sert plus...

  11. #11
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut
    Merci maxime pour l'idée ... ça tombe bien je suis matheux

    Je vais creuser dans ce sens là ...

    Sorry de t'avoir fait transpiré, prends une bonne douche

    A+

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Par défaut
    Ben... J'ai pas vu d'intervenant 'maxime'...
    Et le tu peu valider le tag si la réponse te convient.
    A+

  13. #13
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 10
    Par défaut
    Hello,

    Pour réellement cloturer le poste, je ne peux m'empecher de donner ma dernière trouvaille qui fonctionne assez bien ... merci à ceux qui se sont penchés sur le problème

    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
    Set graph3 = base.Worksheets("template").ChartObjects.Add(40, 6850, 430, 350)
         With graph3.Chart
             .ChartType = xl3DPie
             .SeriesCollection.NewSeries
             .SeriesCollection(1).XValues = Worksheets("param et graph").Range("A51:A55")
             .SeriesCollection(1).Values = Worksheets("param et graph").Range("C51:C55")
             .SeriesCollection(1).Name = "Votre financement sur base annuelle"
             .Elevation = 35
             .Rotation = 240
             .HasLegend = False
             .ChartTitle.Font.Size = 14
             .ChartArea.Interior.ColorIndex = xlPatternNone
             .ChartArea.Border.ColorIndex = xlPatternNone
             .PlotArea.Interior.ColorIndex = xlPatternNone
             .PlotArea.Border.ColorIndex = xlPatternNone
             .PlotArea.Width = Round(.ChartArea.Width * 0.35, 0)
             .PlotArea.Top = Round(.ChartArea.Height / 2 - .PlotArea.Height / 2, 0)
             .PlotArea.Left = Round(.ChartArea.Width / 2 - .PlotArea.Width / 2, 0)
             .SeriesCollection(1).HasDataLabels = True
             .SeriesCollection(1).DataLabels.Position = xlLabelPositionOutsideEnd
     
             Dim pt As Point
             For Each pt In graph3.Chart.SeriesCollection(1).Points
             pt.Explosion = 10
             Next pt
     
             .SeriesCollection(1).HasLeaderLines = True
             .SeriesCollection(1).ApplyDataLabels Type:=xlDataLabelsShowLabelAndPercent
             .SeriesCollection(1).DataLabels.Font.Size = 7
     
              x_centre = .PlotArea.Left + (.PlotArea.Width / 2)
              y_centre = .PlotArea.Top + (.PlotArea.Height / 2)
     
             .SeriesCollection(1).Points(1).DataLabel.Left = Round(x_centre + 1.5 * (.SeriesCollection(1).Points(1).DataLabel.Left - x_centre), 0)
             .SeriesCollection(1).Points(1).DataLabel.Top = Round(y_centre + 1.5 * (.SeriesCollection(1).Points(1).DataLabel.Top - y_centre), 0)
             .SeriesCollection(1).Points(2).DataLabel.Left = Round(x_centre + 1.5 * (.SeriesCollection(1).Points(2).DataLabel.Left - x_centre), 0)
             .SeriesCollection(1).Points(2).DataLabel.Top = Round(y_centre + 1.5 * (.SeriesCollection(1).Points(2).DataLabel.Top - y_centre), 0)
             .SeriesCollection(1).Points(3).DataLabel.Left = Round(x_centre + 1.5 * (.SeriesCollection(1).Points(3).DataLabel.Left - x_centre), 0)
             .SeriesCollection(1).Points(3).DataLabel.Top = Round(y_centre + 1.5 * (.SeriesCollection(1).Points(3).DataLabel.Top - y_centre), 0)
             .SeriesCollection(1).Points(4).DataLabel.Left = Round(x_centre + 1.5 * (.SeriesCollection(1).Points(4).DataLabel.Left - x_centre), 0)
             .SeriesCollection(1).Points(4).DataLabel.Top = Round(y_centre + 1.5 * (.SeriesCollection(1).Points(4).DataLabel.Top - y_centre), 0)
             .SeriesCollection(1).Points(5).DataLabel.Left = Round(x_centre + 1.5 * (.SeriesCollection(1).Points(5).DataLabel.Left - x_centre), 0)
             .SeriesCollection(1).Points(5).DataLabel.Top = Round(y_centre + 1.5 * (.SeriesCollection(1).Points(5).DataLabel.Top - y_centre), 0)
     
     
         End With
    A+ et bon amusement

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

Discussions similaires

  1. Graphique-Camembert d'access vers Excel
    Par pafi76 dans le forum Access
    Réponses: 1
    Dernier message: 22/07/2006, 15h44
  2. [VBA-E]Deplacer un graphique sous Excel
    Par gaudy dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/04/2006, 06h43
  3. [VBA-E]Copie graphique de excel vers word
    Par conconbrr dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/02/2006, 10h49
  4. probleme de graphique avec excel
    Par calimero91 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/01/2006, 12h17
  5. Générer des données sous forme de graphiques (comme excel)
    Par matterazzo dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 26/10/2005, 19h21

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