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 :

Position étiquettes de données graphe en barres empilées (xlBarStacked)


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Position étiquettes de données graphe en barres empilées (xlBarStacked)
    Bonjour à tous,

    Après de nombreuses recherches sur ce forum et sur internet, je n'ai malheureusement pas trouvé de solution à mon problème :
    J'ai rédigé une macro me permettant d'afficher un diagramme de gantt à partir de taches rentrées par l'utilisateur sur une feuille excel. Ce dernier rentre à la main le nom de chaque tâche, son début et sa durée, puis la date de fin est calculée par le fichier.
    Ma macro permet d'afficher un diagramme de Gantt à partir de ces données, sous la forme suivante :

    Nom : taches.PNG
Affichages : 546
Taille : 18,9 Ko

    Avec en abscisses de mon graphe, l'axe du temps :

    Nom : dates.PNG
Affichages : 468
Taille : 21,3 Ko

    L'utilisateur a ensuite la possibilité de rentrer un % d'accomplissement devant chaque tâche (illustration sur la photo : il écrit 50% devant la tâche 3 sur la feuille de données par exemple, et celle-ci va changer de couleur sur ses 50 premiers % sur le graphe).

    Tout cela fonctionne très bien, jusqu'au moment ou je veux gérer la place des étiquettes du graphe (qui représentent la durée de chaque tâche). En effet, sur les graphe de type xlBarStacked comme celui que j'utilise, il est seulement possible de placer des étiquettes à l'intérieur de la barre de donnée, avec les paramètres "xlLabelPositionInsideBase" (au début de la barre de données), "xlLabelPositionCenter" (centré dans la barre de données) et "xlLabelPositionInsideEnd"(à la fin de la barre de données comme sur ma photo).

    J'aimerais pouvoir décaler mes étiquettes de données à la fin de la barre de données, mais à l'extérieur de cette dernière pour plus de lisibilité, c'est à dire que j'aimerais pouvoir décaler les étiquettes de données de quelques points vers la droite par rapport à ce qu'on observe sur la photo.
    J'ai essayé de définir la position des étiquettes sur "xlLabelPositionInsideEnd" puis de les décaler vers la droit en incrémentant la propriété "Left" des datalabels, mais sans succès.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    With Activechart.SeriesCollection(3)
    For i = 1 To .Points.Count
                With .Points(i)
                           .HasDataLabel = True
                           .DataLabel.Text = Plage_Total.Cells(Ind(i - 1), 6)
                           .DataLabel.Position = xlLabelPositionInsideEnd
                           .DataLabel.Left = .DataLabel.Left + 10
               End With
    Next i
    End With
    J'obtiens en effet le résultat suivant avec ce code, qui nèst pas sitisfaisant puisque toutes les étiquettes de données ne sont pas décallées de la même distance vers la droite :
    Nom : tachespositionend.PNG
Affichages : 509
Taille : 18,1 Ko

    J'ai aussi essayé de définir la position sur "xlLabelPositionInsideBase", puis de décaler les étiquettes vers la droite en fonction de la durée de la tâche concernée, mais sans succès non plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    With Activechart.SeriesCollection(3)
    For i = 1 To .Points.Count
                With .Points(i)
                           .HasDataLabel = True
                           .DataLabel.Text = Plage_Total.Cells(Ind(i - 1), 6)
                           .DataLabel.Position = xlLabelPositionInsideBase
                           .DataLabel.Left = .DataLabel.Left + CDbl(Plage_Total.Cells(Ind(i - 1), 17)) * 4 'Plage_Total.Cells(Ind(i - 1), 17) correspond à la durée de la tâche en jours sur mon fichier de données, 
                                                      'que je convertis en double et que je multiplie par un facteur d'échelle (le nombre de points ne correspond pas à des jours :  il faut faire la conversion)
               End With
    Next i
    End With
    J'obtiens alors le résultat suivant, pas non plus satisfaisant pour les mêmes raisons :

    Nom : tachespositionbase.PNG
Affichages : 509
Taille : 19,7 Ko

    Quelqu'un saurait-il me dire comment faire? Ou alors pourquoi cela ne fonctionne pas dans mon code (peut-être une erreur de compréhension d'objets de ma part)?

    Par avance merci pour votre aide !

  2. #2
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 791
    Points : 1 465
    Points
    1 465
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    As-tu essayé de remplacer xlLabelPositionInsideEnd par xlLabelPositionAbove ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour tototiti2008,

    J'ai effectivement essayé, sans succès non plus. Le problème c'est que tous les types de position d'étiquettes ne sont pas supportés par tous les types de graphes. Dans mon cas (xlBarStacked), seuls les 3 décris dans mon message initial sont disponibles si je ne dis pas de bêtises.
    En tout cas, xlLabelPositionAbove me renvoie une erreur alors que les trois autres types testés fonctionnent...

  4. #4
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 791
    Points : 1 465
    Points
    1 465
    Billets dans le blog
    2
    Par défaut
    Re,

    Peut-être, à l'aveugle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    With Activechart.SeriesCollection(3)
    For i = 1 To .Points.Count
                With .Points(i)
                           .HasDataLabel = True
                           .DataLabel.Text = Plage_Total.Cells(Ind(i - 1), 6)
                           .DataLabel.Position = xlLabelPositionInsideEnd
                           .DataLabel.Left = .DataLabel.Left + .DataLabel.width
               End With
    Next i
    End With

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci pour ton aide tototiti2008!

    Malheureusement, cela ne fonctionne toujours pas...
    J'obtiens cela :

    Nom : tachespositionend_width.PNG
Affichages : 506
Taille : 18,6 Ko

    En revanche, j'ai remarqué que la place des étiquettes est dépendante de l'avancement en pourcentage de la tâche.
    Ainsi, pour la tâche 4, si je change l'avancement à 25% et non plus à 100%, voilà le résultat avec le code que tu me proposes :

    Nom : tachespositionend_width_25.PNG
Affichages : 479
Taille : 17,6 Ko

    C'est perturbant parce qu'à priori, la place du datalabel n'est pas dépendant de la série d'avant (série de barres striées, qui représente la partie déjà effectuée de la tâche)... Une explication pour ce phénomène? Cela résiderai dans la propriété .Left du Datalabel?

    En désactivant la ligne de code "DataLabel.Left ... " , et en gardant uniquement xlPositionInsideEnd, la position est indépendante de l'avancement de la tâche...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    With Activechart.SeriesCollection(3)
    For i = 1 To .Points.Count
                With .Points(i)
                           .HasDataLabel = True
                           .DataLabel.Text = Plage_Total.Cells(Ind(i - 1), 6)
                           .DataLabel.Position = xlLabelPositionInsideEnd
                           '.DataLabel.Left = .DataLabel.Left + .DataLabel.width
               End With
    Next i
    End With

  6. #6
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 791
    Points : 1 465
    Points
    1 465
    Billets dans le blog
    2
    Par défaut
    Re,

    Et comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    With Activechart.SeriesCollection(3)
    For i = 1 To .Points.Count
                With .Points(i)
                           .HasDataLabel = True
                           .DataLabel.Text = Plage_Total.Cells(Ind(i - 1), 6)
                           .DataLabel.Position = xlLabelPositionInsideEnd
                           .DataLabel.Position = xlLabelPositionCustom
                            .DataLabel.Left = .DataLabel.Left + .DataLabel.width
               End With
    Next i
    End With
    La pêche miraculeuse les yeux bandés

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Non toujours pas malheureusement. Même la propriété "xlLabelPositionCustom" est refusée...

Discussions similaires

  1. [XL-2010] Étiquette de donnée graphique en barre
    Par Thib31 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/03/2017, 12h15
  2. Graphe : les barres empilées
    Par FOCUS77 dans le forum Contribuez
    Réponses: 2
    Dernier message: 30/03/2015, 14h44
  3. [JpGraph] Erreur pour générer un graph en barre empilées
    Par timmy1 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 06/12/2011, 15h13
  4. [AC-2007] Graphe à barres empilées
    Par lio33 dans le forum IHM
    Réponses: 2
    Dernier message: 10/01/2011, 17h25
  5. Ajout d'étiquettes de données sur un graphe MSCHART type 2dXY
    Par Invité dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 15/01/2007, 22h37

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