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 zMais ç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
P.
Ok moi non plus j'ai commencé VBA la semaine dernière
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
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.GroupVoili voilou