[RESOLU] Macro (?) pour masquer les lignes vides dans TCD

Dbordes

XLDnaute Nouveau
Bonjour à toutes & à tous,

J'ai des fichiers excel dans lesquels je gère des hiérarchies non symétriques.
Le résultat est que lorsque je fais un TCD en demandant tous les niveaux de ma hiérarchie, il y a des lignes du vides qui apparaissent (lorsque les niveaux de la hiérarchie ne sont pas renseignés dans la base de données).
J'ai réussi à faire une macro et en trouver une autre pour masquer ces lignes (show detail = false).

Le problème c'est que le niveau n+1 ne devrait pas montrer le détail non plus mais je n'arrive pas à le faire.

L'un ou l'une d'entre vous a-t-il déjà eu cette problématique et trouvé une solution?

J'ai mis un exemple en PJ

Pour info, je ne veux pas (pour le moment) "tricher" et masquer les lignes de la feuille de calcul :)

Merci d'avance pour toute l'aide que vous voudrez bien m'apporter!

Jean-Edouard
 

Pièces jointes

  • Test pyramide.xlsm
    33.6 KB · Affichages: 44

Caillou

XLDnaute Impliqué
Bonjour,

As-tu essayé de rajouter
ActiveSheet.PivotTables("TCD_1").PivotFields("N6").PivotItems("(blank)").Visible = False
dans la procédure qui masque
et
ActiveSheet.PivotTables("TCD_1").PivotFields("N6").PivotItems("(blank)").Visible = True
dans la procédure qui affiche ?

Caillou
 

Dbordes

XLDnaute Nouveau
Merci Caillou,

malheureusement, cela ne fonctionne car dans ce cas toutes les hiérarchies pour lesquelles le niveau 6 est vide sont masquées...
Ou alors, je ne l'ai pas bien fait

Sub Masquer_vide()

On Error Resume Next
Sheets("TCD").Select
ActiveSheet.PivotTables("TCD_1").PivotFields("N1").PivotItems("(blank)").ShowDetail = False
ActiveSheet.PivotTables("TCD_1").PivotFields("N2").PivotItems("(blank)").ShowDetail = False
ActiveSheet.PivotTables("TCD_1").PivotFields("N3").PivotItems("(blank)").ShowDetail = False
ActiveSheet.PivotTables("TCD_1").PivotFields("N4").PivotItems("(blank)").ShowDetail = False
ActiveSheet.PivotTables("TCD_1").PivotFields("N5").PivotItems("(blank)").ShowDetail = False
'ActiveSheet.PivotTables("TCD_1").PivotFields("N6").PivotItems("(blank)").ShowDetail = False
ActiveSheet.PivotTables("TCD_1").PivotFields("N6").PivotItems("(blank)").Visible = False

End Sub
 
Dernière édition:

Dbordes

XLDnaute Nouveau
Merci Chris,

L'idée est de pouvoir présenter un TCD qui n'affiche en "automatique" que le niveau de détail le plus fin disponible, c'est à dire masquer systématiquement les "vide".
Je rattache un fichier que j'espère plus parlant...

Jean-Edouard
 

Pièces jointes

  • Test pyramide v2.xlsm
    34.2 KB · Affichages: 40

chris

XLDnaute Barbatruc
Re

La finalité d'un TCD est de faire des statistiques.

L'ajout de tes années ne fait que compliquer puisque ces valeurs sont associé au niveau le plus bas qu'il soit ou non vide.

D'où ma question initiale sur ton objectif réel...

Dans tous les cas un TCD fonctionne très mal à partir d'un tableau à double entrée et là, le tableau data n'est clair que pour toi...

Si quelqu'un essaye de comprendre à quel niveau correspondent les chiffres, le fait que cela soit rattaché au niveau le plus bas non vide est un choix de ta part mais pas une évidence... liée à la structure de ce tableau.
 

Dbordes

XLDnaute Nouveau
J'imagine bien volontiers que la data n'est pas très claire pour quelqu'un qui découvre le sujet.
Je vais donc essayer de l'expliciter un peu mieux.

Nous pourrions dire, par exemple, que les chiffres des années correspondent aux ventes d'un produit A dans chaque "secteur".
Certains secteurs étant restreints (Toulouse, Bordeaux), d'autres plus larges, (Nord-Est, Espagne) et d'autres trés trés larges (la Lune, Jupiter).
Ces secteurs correspôndent à un niveau de ma pyramide (on pourrait avoir Planète/ Continent/ Pays/ Région/ Ville au lieu de Niveau 1/ Niveau 2/ Niveau 3/ ...)

Je veux pourvoir afficher les ventes de la manière la plus détaillée possible sans avoir les lignes "vide" qe je considère comme inutiles, ni sans avoir à afficher / masquer le détail manuellement.

Pourquoi parles-tu de double entrée? Les niveaux sont en ligne et les années dans la zone des valeurs...

Merci encore pour ton temps et ton aide.

Jean-Edouard
 

chris

XLDnaute Barbatruc
Re

Pas trouvé d'autre solution que de passer par les valeurs pour trouver la hiérarchie.
Code:
Sub Masquer_vide()

    For Each rangee In ActiveSheet.PivotTables("TCD_1").DataBodyRange.Rows
        If WorksheetFunction.Sum(rangee.Cells) > 0 Then
            x = rangee.Cells(1, 1).PivotCell.RowItems.Count
            For Y = x To 1 Step -1
                If rangee.Cells(1, 1).PivotCell.RowItems(Y) = "(blank)" Then VVide = Y
            Next Y
            If VVide <> 0 Then rangee.Cells(1, 1).PivotCell.RowItems(VVide - 1).ShowDetail = False
        End If
    Next rangee

End Sub
 

Dbordes

XLDnaute Nouveau
Bonjour Chris,

et surtout Merci !!!
ca marche nickel sur mon exemple, un peu moins dans mon fichier de travail..

J'ai rajouté on error resume next
+ j'enlève tous les sous-totaux en début de ma macro et je les remets en sortant.
--> et là c'est quasiment top (j'ai encore quelques tests à faire !)

Encore une fois merci beaucoup!!!

Je marque le sujet en résolu

PS : j'avais l'idée qu'il fallait tester chacun des éléments mais j'ignorais totalement comment m'y prendre :-(

Jean-Edouard
 

Discussions similaires

Statistiques des forums

Discussions
312 203
Messages
2 086 193
Membres
103 153
dernier inscrit
SamirN