Groupage de pivotitems dans un TCD

Bonjour,

J'ai un tableau croisé dynamique avec des nombres de logements en étiquette de colonnes qui vont de (vide) à 1500

Je voudrais les grouper suivant 3 catégories:

  • <4 = (vide), 0,1,2,3
  • <12 = 4,5,...,11
  • >=12 le reste

pour cela j'ai fait le bout de code suivant pour tester pour la catégorie <4 (code que je reproduirai pour <12):

Dim z
Dim StrRng3 As String

For Each z In ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems
    If z.Name = "0" Or z.Name = "1" Or z.Name = "2" Or z.Name = "3" Or z.Name = "4" Or z.Name = "(blank)" Then
        If StrRng3 = "" Then
            StrRng3 = ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems(z.Name).LabelRange.Address
        Else
            StrRng3 = StrRng3 & ", " & ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems(z.Name).LabelRange.Address
        End If

    End If
Next z

Mais ça ne marche pas et ça ne m'affiche aucun message d'erreur...

Comment je peux procéder? et y a-t-il une meilleure méthode?

Je vous remercie de votre aide car je commence déjà à desespérer.

Bonjour,

il y a ici qq spécialistes du TCD (pas moi ) mais sans voir le fichier.. ou une bonne copie anonymisée

P.

Ok moi non plus j'ai commencé VBA la semaine dernière une bonne copie anonymisée ci-joint du coup

Cependant, j'ai avancé un peu depuis sur le code (qui a marché tout seul comme par magie ... peut être problème de ressources car la BDD est assez conséquente)

maintenant il groupe bien les <4, puis les <12, mais pas les >=12 et l'erreur est : "La méthode range de l'objet global a échoué"

Limitation de Range ou problème de ressources? et que faire?

Merci de votre aide

Voici le code:

Dim z
Dim StrRng3 As String

For Each z In ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems
    If z.Name = "0" Or z.Name = "1" Or z.Name = "2" Or z.Name = "3" Or z.Name = "(blank)" Then
        If StrRng3 = "" Then
            StrRng3 = ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems(z.Name).LabelRange.Address
        Else
            StrRng3 = StrRng3 & ", " & ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems(z.Name).LabelRange.Address
        End If

    End If
Next z

Range(StrRng3).Select
Selection.Group

StrRng3 = Empty
z = Empty

For Each z In ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems
    If z.Name = "4" Or z.Name = "5" Or z.Name = "6" Or z.Name = "7" Or z.Name = "8" Or z.Name = "9" Or z.Name = "10" Or z.Name = "11" Then
        If StrRng3 = "" Then
            StrRng3 = ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems(z.Name).LabelRange.Address
        Else
            StrRng3 = StrRng3 & ", " & ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems(z.Name).LabelRange.Address
        End If

    End If
Next z

Range(StrRng3).Select
Selection.Group

StrRng3 = Empty
z = Empty

For Each z In ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems
    If z.Value > 11 Then
        If StrRng3 = "" Then
            StrRng3 = ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems(z.Name).LabelRange.Address
        Else
            StrRng3 = StrRng3 & ", " & ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems(z.Name).LabelRange.Address
        End If

    End If
Next z

Range(StrRng3).Select
Selection.Group

ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements2").PivotItems("Groupe1").Caption = "<4"
ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements2").PivotItems("Groupe2").Caption = "<12"
ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements2").PivotItems("Groupe3").Caption = ">=12"
ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements2").ShowDetail = False
24exemple-1.xlsx (93.08 Ko)

re,

une colonne supplémentaire dans la feuille 1 pourrait t'aider à faire des groupes je pense ...

=SI(OU(B2="";B2<4);1;SI(ET(B2>3;B2<12);2;SI(B2>=12;3)))

et puis inclure ce groupe dans ton tcd

P.

à confirmer par les spécialistes du forum

p: ton tcd est particulièrement difficile à lire dans ce sens là; ce ne serait pas mieux de l'inverser ?

Merci pour ta réponse.

En effet, ça marcherait mais ça alourdirait mon fichier qui est déjà vraiment conséquent et plein de formules rechercheV et autres index-equiv. C'est pour cette raison que je passe par une macro car sinon la manipulation directement sur le fichier est extrêmement coûteuse en temps du fait de sa lourdeur. Je cherche plutôt à supprimer un maximum de colonnes.

Sinon dans mon fichier j'ai beaucoup plus de catégories que le fichier exemple donc pour la lisibilité c'est mieux de les laisser en ligne et de regrouper les intitulés de colonnes dans 3 catégories.

re,

il n'a y aurais pas trop de données dans le 3e groupe ?

P.

ps: je ne travaille jamais les tcd en VBA mais au pas à pas, il plante quand on a un grand nombre de data dans StrRng3

au premier pasage: $B$4, $C$4, $D$4, $E$4, $OF$4

au 2e: $G$5, $H$5, $I$5, $J$5, $K$5, $BHT$5, $BHU$5

au 3e 1581 données ....

Le problème est peut être là

P.

Tout à fait.

Le problème est que Range est limitée à 256 caractères.

Pour contourner il faut filouter pour créer une plage et pas sélectionner les cellules une par une:

Dim StrRng4 As String
Dim v

v = ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems.Count

  StrRng4 = ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems("12").LabelRange.Address & ":" & Cells(ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems("12").LabelRange.Row, ActiveSheet.PivotTables(nom(17)).PivotFields("Nb logements").PivotItems(12).LabelRange.Column + v - 13).Address
  Range(StrRng4).Select
  Selection.Group

Voili voilou si ça peut aider quelqu'un.

Rechercher des sujets similaires à "groupage pivotitems tcd"