Graphique C.D. - Automatisation des étiquettes de données

Bonjour à tous,

Pour comprendre mon soucis, je vous expose ci-après le contexte : je travaille actuellement sur l'automatisation d'un graphique lié à la population d'un immeuble par étage (appelé stacking). Le but est de recenser les effectifs par service puis de dispatcher les services au sein des étages de l'immeuble. Plusieurs données sont donc essentielles : noms des services, nombre d'étages de l'immeuble, capacités des étages de l'immeuble, effectifs des services.

J'ai donc construit une feuille "Données projet" centralisant les jalons du stacking et une feuille "stacking 1" où j'ai implanté un graphique croisé dynamique reprenant les données des cellules E4:G95 de la feuille "Données projet". Pour des questions de présentation, il faut absolument que les étiquettes de données du graphique apparaissent sous forme de Nom de série (=noms des services dans mon graphique)+Valeur (effectif du service) et non sous forme de valeur uniquement.

Je n'ai pas trouvé d'option intégrée dans Excel pour mettre en forme les étiquettes de données en masse, le seul moyen est de sélectionner étiquette par étiquette pour les mettre en forme...c'est pas trop contraignant quand il existe 10 services mais ça peut-être fastidieux s'il y en a plus.

Mon idée est donc d'automatiser cette mise en forme d'étiquettes de données via un bouton macro qui :

1/ actualise les données de mon graphique croisé dynamique

2/ ajoute les étiquettes de données centrées au graphique (par défaut les Valeurs)

3/ ajoute la mise en forme "Nom de série" aux étiquettes de données

4/ applique la mise en forme "Séparateur=espace" aux étiquettes de données

Je ne suis pas un expert des macros et je tatillonne pour arriver à mon but...celà marche mais la macro me retourne une erreur. J'ai prévu la possibilité d'exploiter 60 services différents dans mon tableau et donc j'ai créé la macro en conséquence des 60 possibilités. Sauf que si j'ai moins de 60 services, dans mon exemple de fichier 22 (14 services+1 donnée de postes libres par étage soit 8 = 22) : il me retourne une erreur à partir de la 23ème étiquettes de données car elle n'existe pas.

Une âme charitable saurait-elle me dépanner sur ce bout de code macro ?

J'ai laissé délibérément le graphique sans étiquettes de données pour que vous puissiez voir le but du bouton macro et surtout le message d'erreur.

En espérant avoir été suffisamment clair et précis, merci à vous !

Steph

113stacking.xlsm (46.30 Ko)

bonjour

en ajoutant une colonne CONCATENER à ton tableau, et en affichant les étiquettes à partir de cette colonne (en jaune)

Bonjour,

Merci pour votre réponse malheureusement cela ne marche pas et si cela marchait, il me faudrait effectuer la manipulation pour chaque étiquette de données non ? Hors si le graphique comporte 60 étiquettes je ne veux pas "m'amuser" à les mettre en forme une par une.

Je ne serai pas l'utilisateur de ce tableau et je veux absolument automatiser :

  • l'actualisation du graph dynamique
  • l'ajout des étiquettes de données centrées
  • la mise en forme des étiquettes de données (nom de série, valeur et séparateur)

Merci pour votre aide !

re

pour ce qui concerne le texte (nom espace et nombre) dans les étiquettes, c'est fait une formule que tu tires vers le bas, donc hyper-rapide, nul besoin de bidouiller dans le graphique qui se met à jour automatiquement

revoir la colonne en jaune dans mon exemple

pour ce qui concerne la mise en forme (taille de police et centrage) je ne sais pas

Bonjour jmd

Merci du temps que tu me consacres c'est vraiment gentil !

"en ajoutant une colonne CONCATENER à ton tableau, et en affichant les étiquettes à partir de cette colonne (en jaune)"

Je comprend bien le principe, et je suppose que la manip est donc de sélectionner l'option "Valeurs à partir de" pour mettre en forme l'étiquette et de sélectionner la plage en jaune que tu as créé, est ce bien celà ? sinon je ne comprend pas, désolé, et te demande de m'expliquer la manipulation.

Si il s'agit bien de celà,le fait est que quand j'ai pris ton tableau, si on regarde le graphique sans rien modifier à ton fichier, je ne vois qu'une seule étiquette avec ta mise en forme au 5ème étage malheureusement il y a 2 noms de services "Pôle projets" et "Libres R+5".

2 soucis donc :

1 / le service "Pôle projets" qui est renseigné via l'option "Valeurs à partir de" est faux, dans l'onglet "Données projet" il s'agit bien de "Libres R+5" et non "Pôle projets"

2 / la mise en forme est appliquée à une seule étiquette et manuellement visiblement, si mon graphique comporte 60 étiquettes et/ou que je modifie les données du projet, je ne veux pas perdre de temps à remettre en forme toutes les étiquettes

J'espère être clair sur mes explications et mon objectif...je ne suis pas certain

Merci !

Bonjour,

Une procédure à adapter.

Cdlt.

Option Explicit

Public Sub DEMO()
Dim objChart As ChartObject
Dim sr As Series

    Application.ScreenUpdating = False

    Set objChart = Me.ChartObjects(1)

    With objChart.Chart
        For Each sr In .SeriesCollection
            sr.ApplyDataLabels (xlDataLabelsShowNone)
            sr.ApplyDataLabels ShowSeriesName:=True, Separator:=" "
        Next sr
    End With

    Set objChart = Nothing

End Sub

Bonjour Jean-Eric,

Je viens de copier/coller le code pour voir mais il me retourne une erreur, je ne comprend vraiment rien au macro désolé...:

"Erreur de compilation Utilisation incorrecte du mot clé Me"

Merci à toi

Re,

Pour mon test, j'ai copié cette procédure dans le module de la feuille comportant le graphique.

"Me" correspondant à "ActiveSheet".

Remplace donc Me par ActiveSheet.

A te relire.

Cdlt.

nota : tu pourrais supprimer le bouton en intégrant la procédure dans l'évènement "Worksheet_PivotTableUpdate".

Super ! Celà fonctionne

J'ai rajouté ma ligne "Worksheets("Stacking 1").ChartObjects("Graphique 1").Chart.PivotLayout.PivotTable.PivotCache.Refresh" dans ton code pour rafraîchir les données du graphique si je fais une modifications dans l'onglet "Données projet", je ne sais pas si c'est conventionnel comme code mais ca marche

"nota : tu pourrais supprimer le bouton en intégrant la procédure dans l'évènement "Worksheet_PivotTableUpdate"."

Moi y en a pas tout comprendre...le VBA et moi ca ne fait pas 2 pour l'instant mais je doute pas que celà soit mieux !


J'aimerai également ajouté ce bout de code au tien mais celà ne marche pas

ActiveSheet.PivotTables("Tableau croisé dynamique4").PivotFields("Stacking 1"). _

ClearAllFilters

With ActiveSheet.PivotTables("Tableau croisé dynamique4").PivotFields( _

"Stacking 1")

.PivotItems("").Visible = False

.PivotItems("(blank)").Visible = False

End With

L'idée est de déflitrer le tcd et le reflitrer en excluant les données vides ou ""

Quand je rajoute des étages dans l'onglet données, étant donné le filtre actif, il ne tient pas compte des derniers étages ajoutés, les nouveaux étages sont filtrés par défaut.

Edit : Celà marche au deuxième click sur le bouton macro

J'aimerai également ajouter cette mise en forme dans ton code Jean-Eric :

ActiveSheet.ChartObjects("Graphique 1").Activate

ActiveChart.FullSeriesCollection(25).DataLabels.Select

Selection.Format.AutoShapeType = msoShapeRoundedRectangle

mais après divers essai infructueux je n'y arrive pas...

Re,

Je regarde, mais ne soit pas trop pressé.

J'ai vu des choses que je comprends pas. En autre, les données source du TCD et toutes ces cellules vides. Peux-tu expliquer l'utilité?

Cdlt.

Re,

J'ai repris ton classeur et après quelques modifications, vois le résultat.

J'ai éliminé les étiquettes inutiles (valeurs à 0).

De plus le TCD et le GCD s'actualisent à l'activation de la feuille.

A te relire.

Cdlt.

43stacking.xlsm (46.69 Ko)
Option Explicit

Private Sub Worksheet_Activate()

    Me.PivotTables(1).PivotCache.Refresh

End Sub

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)
Dim objChart As ChartObject
Dim nbSr As Long, pt As Long, sr As Long
Dim x As String

    Application.ScreenUpdating = False

    Set objChart = Me.ChartObjects(1)
    nbSr = objChart.Chart.SeriesCollection.Count

    With objChart.Chart
        For sr = 1 To .SeriesCollection.Count
            .SeriesCollection(sr).ApplyDataLabels (xlDataLabelsShowNone)
            .SeriesCollection(sr).ApplyDataLabels Type:=xlDataLabelsShowValue
            For pt = 1 To .SeriesCollection(sr).Points.Count
                x = .SeriesCollection(sr).Points(pt).DataLabel.Caption
                If Val(x) = 0 Then
                    .SeriesCollection(sr).Points(pt).HasDataLabel = False
                Else
                   .SeriesCollection(sr).Points(pt).ApplyDataLabels ShowSeriesName:=True, Separator:=" "
                End If
            Next pt
        Next sr
    End With

    Set objChart = Nothing

End Sub

Un grand grand merci Jean-Eric !!!

J'ai juste rajouté les lignes supplémentaires au tableau des données, pour laisser la latitude à un utilisateur novice de pouvoir ajouter des étages/services sans bidouiller l'aspect tableau/formules.

58stacking-v0.xlsm (72.63 Ko)

Re,

Le tableau est dynamique. Nul besoin d'avoir des lignes vides dans celui-ci.

Un ajout en fin tableau le redimensionne pour l'actualisation du TCD et GCD.

Cordialement.

Bien entendu, encore une fois je ne serai pas l'utilisateur, et je connais le niveau des utilisateurs finaux en Excel...

J'ai par ailleurs besoin de mettre en forme l'étiquette sur fond blanc avec contour gris foncé :

ActiveSheet.ChartObjects("Graphique 1").Activate

ActiveChart.FullSeriesCollection(25).DataLabels.Select

Selection.Format.AutoShapeType = msoShapeRoundedRectangle

J'avais testé ce code qui s'apparente à "Changer les formes d'étiquettes de données" quand on clique droit sur l'étiquette mais en vain

Merci à toi

Rechercher des sujets similaires à "graphique automatisation etiquettes donnees"