[Excel] Macro Graphique Camenberts

Résolu
Bonjour,

Je voulais savoir si il était possible de ne pas afficher les étiquettes de données si leur valeur est égale a Zéro.

En effet je desire faire une presentation avec camembert pour plusieur machines les données change et des fois sont egale a 0 j'ai reussi a suprimer l'apparition du 0 grace a la mise en forme 0;; mais il reste les etiquettes de données regoupées les une sur les autre.
J'ai vu une possibilitée de ce genre mais je ne la comprend pas un peu d'aide serai la bien venue
For Each p In ActiveChart.SeriesCollection(1).Points
If Mid(p.DataLabel.Text, 7, 2) = 0 Then p.HasDataLabel = False
Merci

10 réponses

  1. bonjour à tous

    une tentative avec macros

    http://www.cijoint.fr/cjlink.php?file=cj201105/cijyEGFkBT.xls

    bonne suite
    1
    1. Salut ccm81,
      Ça a l'air bien cette macro. C'est surtout plus facile à utiliser que ce que j'ai fait.
      Je ne porte aucune appréciation sur la macro elle-même. Je suis nul dans ce domaine.
      Par contre j'ai fait fonctionner un peu sans dénicher un bug.
      Bonne soirée.
      0
    2. Ca a l'air de très bien fonctionner mais mon problème c'est que j'ai plusieurs graph et je vous avoue que je ne vois pas comment insérer cette macro dans mon classeur avec mes différentes plages
      Je l'ai copier dans ma feuille graph et tenter de renommer mes différente plage de graph mais cela ne fonctionne pas...
      Je vous met mon fichier pour exemple
      0
    3. http://www.cijoint.fr/cjlink.php?file=cj201105/cijyrSYKpv.xlsx
      0
    4. re

      1. comme tu as plusieurs graphiques concernés par les etiquettes "nulles", tu nommes les plages correspondantes dans ta feuille (c'est plus commode) et tu complete le code de la procedure Change comme dans l'exemple ci-dessous, où j'ai traité un graphique 2 attaché à la "plage2"
      etc ...

      Private Sub Worksheet_Change(ByVal Target As Range)
      If Not Intersect(Range("plage1"), Target) Is Nothing Then
        Call RemetEtiquettes(1)
        Call SupprimeEtiquetteNulle(1)
      End If
      If Not Intersect(Range("plage2"), Target) Is Nothing Then
        Call RemetEtiquettes(2)
        Call SupprimeEtiquetteNulle(2)
      End If
      
      
      End Sub


      ici 1 est un numéro de graphique
      Call RemetEtiquettes(1)
      Call SupprimeEtiquetteNulle(1)

      2. je ne peux pas lire ton fichier, je suis resté à excel 2003! donc, si tu le renvoies, fais le au format excel 2003

      3. tu copies le code dans le module de ta feuille, le pb, c'est qu'il te faut bien faire correspondre les numéros de graphiques et les plages correspondantes.
      Je t'ai mis un bouton permettant de reperer les numéros de tes graphiques

      4. salutations a tontong

      5. un exemple avec 2 graphiques dans la feuille

      http://www.cijoint.fr/cjlink.php?file=cj201105/cij4Q3lP0i.xls

      bonne suite
      0
    5. Voici le fichier au format 2003 mais qui est devenu très lourd il y a beaucoup de formules...
      En espérant que cela soit possible avec ce type de données en effet les graph proviennent de données qui changent par le biais d'une formule en feuille "recap par machine la macro fonctionne très bien quand je change manuellement mais pas avec les modifs par le biais de la formule.
      http://www.cijoint.fr/cjlink.php?file=cj201105/cij1nLG7Wr.zip
      0
  2. Bonjour,

    Quand tu cliques une première fois sur tes étiquettes, elles sont toutes sélectionnées. Si tu recliques alors sur l'une d'elle, seule cette dernière est active. Tu peux alors la supprimer.

    A+

    pépé
    0
    1. Merci pour ta réponse Pepe35530 mais en fait les valeurs des graphes évoluent donc il faudrait que ce soit évolutif en fonction des valeurs en non permanant
      0
  3. Bonjour,
    Il y a une solution mais elle me parait complexe par rapport à la proposition de pépé 35530. Je ne suis pas sûr de pouvoir l'expliquer dans tous ses détails.
    Dans les grandes lignes:
    1* Créer par des formules un tableau secondaire qui élimine les valeurs nulles et vides.
    2* Nommer les champs de ce tableau secondaire avec en référence une fonction DECALER. Ceci permet d'avoir des champs ajustés et dynamiques.

    Pour avoir lu vos questions précédentes voici quelques principes que j'essaye d'appliquer pour avoir des graphiques "parlants":
    Pas plus de 6 parts (8 grand max) dans un camembert. ;-)
    Une dizaine de données pour un "secteur +histogramme"
    Au delà il ne reste que les histogrammes dont l'axe Ox doit présenter une notion d'ordre: ordre chronologique, ordre alphabétique, ordre des valeurs triées, ordre logique (du producteur à l'utilisateur par exemple). Tout ceci n'est qu'un avis personnel!
    0
    1. re
      ton fichier est en effet très lourd !!
      comme les données des graphiques sont calculées, il y a, du moins je crois, avec worksheet_change un pb avec la MAJ des etiquettes
      je te suggere de mettre un bouton (controle activeX) dans chaque feuille où il y a des graphiques à traiter et de lui affecter le code comme ci-dessous

      Private Sub CommandButton2_Click()
      Dim nbgr As Long, nugr As Long
      nbgr = ActiveSheet.ChartObjects.Count
      For nugr = 1 To nbgr
        Call RemetEtiquettes(nugr)
        Call SupprimeEtiquetteNulle(nugr)
      Next nugr
      End Sub


      où les deux procedures RemetEtiquettes et SupprimeEtiquetteNulle sont celles que tu as déjà

      RQ. je n'ai pas essayé dans ton classeur

      bonne suite
      0
      1. J'ai ajouter le bouton qui fonctionne tres bien dans le classeur que tu m'avaiss proposer au click il met les parametres a jour mais dans mon classeur il provoque une erreur 1004
        sur la ligne en gras "nbpoints="

        A quoi correspond .SeriesCollection(1)
        Desoler je ne suis pas tres affuté en Macro

        Option Explicit

        Public Sub SupprimeEtiquetteNulle(NumGraph)
        Dim nbpoints As Long, nupoint As Long
        Dim ValY
        With ChartObjects(NumGraph).Chart
        nbpoints = .SeriesCollection(1).Points.Count
        ValY = .SeriesCollection(1).Values
        For nupoint = 1 To nbpoints
        If ValY(nupoint) = 0 Then
        .SeriesCollection(1).Points(nupoint).DataLabel.Delete
        End If
        Next nupoint
        End With
        End Sub

        Public Sub RemetEtiquettes(NumGraph)
        ChartObjects(NumGraph).Chart.ApplyDataLabels ShowCategoryName:=True, HasLeaderLines:=True
        End Sub

        Private Sub CommandButton2_Click()
        Dim nbgr As Long, nugr As Long
        nbgr = ActiveSheet.ChartObjects.Count
        For nugr = 1 To nbgr
        Call RemetEtiquettes(nugr)
        Call SupprimeEtiquetteNulle(nugr)
        Next nugr
        End Sub
        0
    2. re
      nbpoints = .SeriesCollection(1).Points.Count
      donne le nombre de points de la série de données

      dans ta feuille graph il y a des graphiques sans serie de données
      le pb vient certainement de là!
      donc
      Etape 1. vérifies avec le bouton qui permet de voir quels sont les graphiques a traiter et quelle série de donnée leur est attachée
      Etape 2. modifier eventuellement la procedure (du bouton)pour ne traiter que les "bons graphs"

      RQ. sinon, il y a une solution : gérer l'erreur produite dans ce cas avec un "on error goto"

      Public Sub SupprimeEtiquetteNulle(NumGraph)
      Dim nbpoints As Long, nupoint As Long
      Dim ValY
      On Error GoTo fin
      With ChartObjects(NumGraph).Chart
        nbpoints = .SeriesCollection(1).Points.Count
        ValY = .SeriesCollection(1).Values
        For nupoint = 1 To nbpoints
          If ValY(nupoint) = 0 Then
            .SeriesCollection(1).Points(nupoint).DataLabel.Delete
          End If
        Next nupoint
      End With
      fin:
      End Sub


      et

      Public Sub RemetEtiquettes(NumGraph)
      On Error GoTo fin
        ChartObjects(NumGraph).Chart.ApplyDataLabels ShowCategoryName:=True, HasLeaderLines:=True
      fin:
      End Sub


      bonne suite
      0
      1. Et ba voila cela fonctionne bien maintenant pour ma feuille recap par machine
        Je pensais que je pouvais traiter que la feuille recap par machine dans un premier temps.

        Par contre sachant que mes graph de la feuille "graph" sont les meme que ceux de la feuille "recap par machine" je me suis servis de la meme plage de donnés pour les creer.

        Hors ces graph de la feuille "graph n'ont pas les meme nom et je ne pourrais donc pas le faire sur cette page a moin de recréer de nouvelles plage pour cette feuille correspondante au nom des graps present sur cette feuille...

        Ou sinon est-ce possible de renommer un graph je n'y arrive pas...
        0
      2. re
        dans la mesure où tu n'as qu'une feuille de plus a traiter (la feuille graph)
        je crois que le plus simple, c'est de mettre un bouton dans la feuille graph, de lui affecter le code du bouton de la feuille recap par machine
        puis de recopier dans le module de la feuille graph, les deux procedures Remet et Supprime

        ce qui t'oblgera a faire un clic dans chacune des deux feuilles

        si c'est trop genant, on peut essayer de s'y prendre autrement
        0
    3. re

      1. dans le module de la feuille qui contient les données

      Option Explicit
      
      Private Sub CommandButton1_Click()
      Dim nugr As Long
        nugr = Range("nugr").Value
        ActiveSheet.ChartObjects(nugr).Select
      End Sub
      
      Private Sub CommandButton2_Click()
        Call Traite("Feuil1")
        Call Traite("F1")
        Call Traite("F2")
      End Sub


      à toi de modifier/ajouter les noms des feuilles a traiter

      2. Puis insertion/nouveau module

      Option Explicit
      
      Public Sub SupprimeEtiquetteNulle(NomFeuille, NumGraph)
      Dim nbpoints As Long, nupoint As Long
      Dim ValY
      On Error GoTo fin
      With Sheets(NomFeuille).ChartObjects(NumGraph).Chart
        nbpoints = .SeriesCollection(1).Points.Count
        ValY = .SeriesCollection(1).Values
        For nupoint = 1 To nbpoints
          If ValY(nupoint) = 0 Then
            .SeriesCollection(1).Points(nupoint).DataLabel.Delete
          End If
        Next nupoint
      End With
      fin:
      End Sub
      
      Public Sub RemetEtiquettes(NomFeuille, NumGraph)
      On Error GoTo fin
        Sheets(NomFeuille).ChartObjects(NumGraph).Chart.ApplyDataLabels ShowCategoryName:=True, HasLeaderLines:=True
      fin:
      End Sub
      
      Public Sub Traite(NF As String)
      Dim nbgr As Long, nugr As Long
      nbgr = Sheets(NF).ChartObjects.Count
      For nugr = 1 To nbgr
        Call RemetEtiquettes(NF, nugr)
        Call SupprimeEtiquetteNulle(NF, nugr)
      Next nugr
      End Sub

      De cette façon on passe les noms des feuilles à traiter à la procedure Traite(NF) qui elle meme passe le nom de la feuille aux procedures Remet et Supprime

      bonne suite
      0
      1. Merci pour tes reponses et solution tres rapide sependant je ne suis pas encore tres àlaise avec les macro et j'ai encore une erreur que je ne sais pas traiter sur la ligne
        nugr = Range("nugr").Value
        "la methode 'range' de l'object Worlsheet a echoué.

        Comment la resoudre
        0
    4. re
      Cette cellule (nommée "nugr" dans la feuille) est utilisée par le bouton qui permet de reperer les graphiques selon la valeur (1, 2, ...) de cette cellule. En fait ce bouton servait dans l'option choisie au départ d'utiliser worksheet_change, mais ce n'est plus d'actualité.
      Je suppose que tu n'utilises plus ce bouton, donc tu peux supprimer la procedure ou du moins la désactiver en mettant toutes les lignes en commentaire (ajouter un ' devant chaque ligne)
      bonne suite
      0
      1. C'est parfait cela fonctionne a merveille je te remercie énormément pour le temps que tu a pris pour ce problème.

        Pense tu qu'il serai possible d'appliquer la mémé chose pour les titre des graph si toute les valeur de la plage du graph sont a zéro que le titres soit retiré...

        Je sais j'abuse tu as déjà fait un très bon travail et je comprendrai que tu ne réponde pas a cette dernière question

        Encore un grand merci pour tous vous étés très réactifs et avez toujours une bonne réponse sous les doigt bonne continuation.
        0
    5. re

      c'est posible, on compte le nb de pts nuls, et s'il est egal au nb de points on suuprime le titre

      Public Sub SupprimeEtiquetteNulle(NomFeuille, NumGraph)
      Dim nbpoints As Long, nupoint As Long, nbpointsnuls As Long
      Dim ValY
      On Error GoTo fin
      nbpointsnuls = 0
      With Sheets(NomFeuille).ChartObjects(NumGraph).Chart
        nbpoints = .SeriesCollection(1).Points.Count
        ValY = .SeriesCollection(1).Values
        For nupoint = 1 To nbpoints
          If ValY(nupoint) = 0 Then
            .SeriesCollection(1).Points(nupoint).DataLabel.Delete
            nbpointsnuls = nbpointsnuls + 1
          End If
        Next nupoint
        If nbpointsnuls = nbpoints Then
          .HasTitle = False
        End If
      End With
      fin:
      End Sub


      bon après midi
      0
      1. Merci,
        Désoler pour la réponse tardive.
        Cela fonctionne nikel cependant toujours dans le même but de pouvoir remetre les titre quand le graph reçoit des valeurs...

        J'ai tenté de rajouter une ligne dans

        Public Sub RemetEtiquettes(NomFeuille, NumGraph)
        On Error GoTo fin
        Sheets(NomFeuille).ChartObjects(NumGraph).Chart.ApplyDataLabels ShowCategoryName:=True, HasLeaderLines:=True
        Sheets(NomFeuille).ChartObjects(NumGraph).Chart.HasTitle ShowCategoryName:=True, HasLeaderLines:=True
        fin:
        End Sub

        Mais ça doit pas être ça car rien n'y fait du coup encore une tite question comment faire pour faire réapparaitre les titre quand les données sont différente de zéro

        Finalement j'ai fait comme ça et ca a l'ai de fonctionner

        Public Sub SupprimeEtiquetteNulle(NomFeuille, NumGraph)
        Dim nbpoints As Long, nupoint As Long, nbpointsnuls As Long
        Dim ValY
        On Error GoTo fin
        nbpointsnuls = 0
        With Sheets(NomFeuille).ChartObjects(NumGraph).Chart
        nbpoints = .SeriesCollection(1).Points.Count
        ValY = .SeriesCollection(1).Values
        For nupoint = 1 To nbpoints
        If ValY(nupoint) = 0 Then
        .SeriesCollection(1).Points(nupoint).DataLabel.Delete
        nbpointsnuls = nbpointsnuls + 1
        End If
        Next nupoint
        If Not nbpointsnuls = nbpoints Then
        .HasTitle = True
        End If

        If nbpointsnuls = nbpoints Then
        .HasTitle = False
        End If
        End With
        fin:
        End Sub

        Je ne sais pas si c'est bien

        J'ai cru que c'était bon mais malheureusement quand les titres reviennent ils sont réinitialisés
        Ca revient à "Titre du graphique" je perd donc le titre de mon graph y a t'il un moyen que cela ne le face pas
        0
    6. re
      aïe, c'est vrai que c'est un peu plus délicat.

      .Hastitle = True est la bonne propriété mais si ça autorise le titre, ça ne le récupère pas

      Option1. attribuer au nom de la serie de chaque graphique le titre souhaité, ce que tu n'as pas fait (clic sur le graphique/données source/series/nom) puis modifier RemetEtiquettes comme ci dessous

      Option2. faire quelque part une liste des titres selon les n° de graphique

      RQ. dans les deux cas, il va bien falloir les ecrires ces titres, donc l'option 1 est la plus propre

        If nbpointsnuls = nbpoints Then    
          .HasTitle = False    
        Else    
          .HasTitle = True    
          .ChartTitle.Characters.Text = .SeriesCollection(1).Name    
        End If

      bonne suite
      0
      1. je n'arrive pas a trouver sous 2007 au boulot je suis sous 2003 et je testerais donc demain merci pour la réponse
        Oupsss c'est bon je viens de trouver je vais donc tester de suite

        Et bien Voila une dernière modifications de commentaire pour dire

        Un grand merci a ccm81 qui suivis ce dossier je pense que je vais pouvoir mettre Résolus
        J'ai encore appris des tas de truc même si je comprend encore pas tout merci Bcp pour tout encore une fois.
        0
      2. Et bien au fait je revient vers toi je viens de le tester sous Excel 2003 et rien ne ce passe y a t'il une action speciale a faire "Probleme de convertion"

        Je pense que cela vien de l'appelation des Graph sous Excel 2003

        J'ai enregistrer en verssion 97-2003 et ça à l'air bon sauf la taille du fichier qui fait pres de 56 000 ko....

        Merci
        0