[Excel] Macro Graphique Camenberts

Résolu
elglouton Messages postés 197 Statut Membre -  
elglouton Messages postés 197 Statut Membre -
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. ccm81 Messages postés 11033 Statut Membre 2 434
     
    bonjour à tous

    une tentative avec macros

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

    bonne suite
    1
    1. tontong Messages postés 2575 Date d'inscription   Statut Membre Dernière intervention   1 064
       
      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. elglouton Messages postés 197 Statut Membre 1
       
      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. elglouton Messages postés 197 Statut Membre 1
       
      http://www.cijoint.fr/cjlink.php?file=cj201105/cijyrSYKpv.xlsx
      0
    4. ccm81 Messages postés 11033 Statut Membre 2 434
       
      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. elglouton Messages postés 197 Statut Membre 1
       
      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. pépé35530 Messages postés 2951 Date d'inscription   Statut Membre Dernière intervention   1 390
     
    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. Elglouton
       
      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. tontong Messages postés 2575 Date d'inscription   Statut Membre Dernière intervention   1 064
     
    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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. elglouton Messages postés 197 Statut Membre 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
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. elglouton Messages postés 197 Statut Membre 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. ccm81 Messages postés 11033 Statut Membre 2 434
       
      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
  7. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. elglouton Messages postés 197 Statut Membre 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
  8. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. elglouton Messages postés 197 Statut Membre 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
  9. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. elglouton Messages postés 197 Statut Membre 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
  10. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. elglouton Messages postés 197 Statut Membre 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. elglouton Messages postés 197 Statut Membre 1
       
      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