Re : Macro pour cacher des items dans un TCD
Bon, je crois que ma premiere explication n'etait pas claire.
Apres de longues heures de recherches infructueuses, je reviens exposer mon probleme avec plus de clarte.
J'ai un TCD du type de celui en fichier joint ("test3.xls") dans lequel je veux cacher toutes les lignes dont la valeur du chamsp "Share" est inferieur a 5%. Le probleme est que ce champs "Share" est un champs calcule (de formule ='My Wgt' /'Mkt Wgt', donc le rapport entre "My Weight" et "Mkt Weight"). Or je n'ai pas trouve le moyen d'utiliser les valeurs calculees pour realiser mon tri. J'ai lu quelque part qu'il suffisait de remplacer le terme "PivotFields" par "CalculatedFields" dans la macro. J'ai donc essaye ca :
Sub Macro_1()
'essai en prenant la variable dans le champs calcule
Dim pt As PivotTable
Set pt = Worksheets("Sheet4").PivotTables("PivotTable1")
'verifie chaque item du champs "Share"
For Each ci In pt.CalculatedFields("Shr").CalculatedItems
For Each pi In pt.PivotFields("Client").PivotItems
'repere les items dont la valeur est inferieure a 5%
If ci.Value > 0.05 Then
'cache la ligne correspondante
'(par l'intermediaire du champs "Client" car on ne peut pas cacher a partir du champs calcule "Share")
pi.Visible = False
End If
Next pi
Next ci
End Sub
Malheureusement, il ne semble pas apprecier le "CalculatedFields"...
La macro fonctionne cependant bien dans le cas d'un champs pivot (non calcule) comme "My Wgt" (cf. "macro_1_bis" dans le fichier).
J'ai donc essaye en definissant plusieurs variables qui me permettraient de retrouver la valeur du champs "Share" sans passer par le CalculatedItem. Ca donne :
Sub Macro_2()
Dim pt As PivotTable
Dim pi As PivotItem
Dim pj As PivotItem
Dim pk As PivotItem
Set pt = Worksheets("Sheet4").PivotTables("PivotTable1")
For Each pi In pt.PivotFields("My Wgt").PivotItems
For Each pj In pt.PivotFields("Mkt Wgt").PivotItems
For Each pk In pt.PivotFields("Client").PivotItems
If pi.Value / pj.Value > 0.05 Then
pk.Visible = False
End If
Next pk
Next pj
Next pi
End Sub
Mais je crois que je definis mal les variables car le resultat est etonnant. Je pense que ce que je n'arrive pas a faire, c'est faire en sorte que la division ne se fasse qu'entre les valeurs d'une meme ligne a chaque fois.
J'ai enfin tente avec la fonction "Offset" :
Sub Macro_3()
Dim pt As PivotTable
Dim pi As PivotItem
Set pt = Worksheets("Sheet4").PivotTables("PivotTable1")
For Each pi In pt.PivotFields("My Wgt").PivotItems
For Each pj In pt.PivotFields("Mkt Wgt").PivotItems
If pi.Value / pj.Value > 0.05 Then
pi.DataRange.Activate
ActiveCell.Offset(rowoffset:=0, columnoffset:=-3).Select
ActiveCell.Delete
End If
Next pj
Next pi
End Sub
Encore une fois le resultat n'est pas le bon, mais je ne comprends pas car si je remplace la ligne
If pi.Value / pj.Value > 0.05 Then
par la ligne
If pi.Value / pj.Value = 0.86 Then
alors elle me supprime bien la ligne avec la "Share" = 86%
J'avais aussi pense a trier le tableau puis a utiliser la fonction Do Until ou Do While, mais je ne sais pas comment elles fonctionnent et je ne sais pas si elles peuvent servir ici.
Pour resumer, quelqu'un connaitrait-il un moyen direct ou contourne de supprimer les lignes d'un TCD en fonction de valeurs calculees?
Merci d'avance.