Je sèche sur le problème suivant. Je souhaite présenter un graphique de type camembert qui écarte les valeurs inférieures à 1 % tant au niveau du camembert que de la légende.
J'arrive à écarter du camembert les valeurs inférieures à 1 % avec " #N/A".
=SI(D2>(0,01*$F$1);D2/$F$1;#N/A)
Mais je souhaiterais que ces valeurs soient également écartées de la légende. Je ne sais pas comment faire.
En annexe un fichier qui illustre mon problème.
Je serais heureux d'avoir une piste s'il y en a une ?
Dans le fichier joint, deux macros, l'une pour supprimer les légendes dont l'élément de série est null et l'autre pour toutes les réafficher et une troisième pour appeler l'une ou l'autre sur clique d'un rectangle servant de bouton
Code:
Sub AfficherSupprimerLegende()
Dim shp As Shape
If TypeName(Application.Caller) <> "String" Then Exit Sub
On Error GoTo FIN
'
' Récupération du shape ayant déclenché la macro
Set shp = ThisWorkbook.Sheets("Feuil1").Shapes(Application.Caller)
'
' suivant son texte affiché, on lance l'une ou l'autre des macros
' puis on change son texte pour le prochain appel
If shp.TextFrame.Characters.Text = "Supprimer les légendes nulles" Then
SuppressionLégendesNulles
shp.TextFrame.Characters.Text = "Afficher toutes les légendes"
Else
AfficherToutesLesLegendes
shp.TextFrame.Characters.Text = "Supprimer les légendes nulles"
End If
FIN:
End Sub
Sub SuppressionLégendesNulles()
Dim oChart As Chart
Dim i As Integer
Dim tbl As Variant
'
' Obtenir le graphique
Set oChart = Sheets("Feuil1").ChartObjects("Graphique 1").Chart
'
' Obtenir les valeurs de la serie 1
tbl = oChart.SeriesCollection(1).Values
'
' Parcourir les valeurs du BAS vers le HAUT (important)
For i = UBound(tbl) To 1 Step -1
'
' si l'une est vide, on supprime sa legende
If IsEmpty(tbl(i)) Then oChart.Legend.LegendEntries(i).Delete
Next
End Sub
Sub AfficherToutesLesLegendes()
'
' Se contente d'afficher les légendes du graphique
' telles qu'ells étaient au moment de la création.
With Sheets("Feuil1").ChartObjects("Graphique 1").Chart
.SetElement (msoElementLegendNone)
.SetElement (msoElementLegendRight)
End With
End Sub
Elle passe par un tableau intermédiaire. Elle nécessite un peu de boulot mais le résultat est celui escompté et sans macro (selon les usages) : elle ne conserve que les valeurs sélectionnées selon un critère ( plus que 1% par exemple) et ne présente dans le graphique que ces valeurs filtrées et les libellés associés à ces valeurs filtrées dans la légende.
Cette solution fait notamment appel à : GRANDE.VALEUR, NB, INDEX, EQUIV, SOMMEPROD
Elle fonctionne également avec des tables de longueur variable avec les plages définies dynamiquement avec la fonction DECALER.
En gros agregat permet d'appliquer une formule à une matrice en évitant zappant les erreurs ou les lignes cachées et autres options du genre. Ici la formule appliquée est Petite.Valeur (premier paramètre), en évitant les erreurs (6 du deuxième paramètre), et en produisant des erreurs par des divisions pas zéro si le test est faux (faux = 0) :
En gros agregat permet d'appliquer une formule à une matrice en évitant zappant les erreurs ou les lignes cachées et autres options du genre. Ici la formule appliquée est Petite.Valeur (premier paramètre), en évitant les erreurs (6 du deuxième paramètre), et en produisant des erreurs par des divisions pas zéro si le test est faux (faux = 0) :
Je pense que je vais devoir abandonner l'idée de cette liste dynamique des éléments du camembert et de la légende en écartant les valeurs de moins de 1%.
Les raisons :
J'utilise un graphique camembert à double tracé. Je souhaite afficher des valeurs précises dans le second tracé.
Quand j'actualise avec de nouvelles données qui modifient le nombre de lignes, des données du second tracé sont déplacées vers le premier tracé.
L'autre problème, c'est les couleurs. Idem elles varient en fonction du nombre de lignes.
En d'autre terme je souhaiterais figer la couleur et l'appartenance au tracé (1 ou 2) en fonction du type de données.