TCD : sélection d’un mois unique bugge par VBA

Sebast

XLDnaute Impliqué
Bonsoir à toutes et à tous,

je n’arrive pas à restreindre mes tcd au mois exact que je recueille par une inputbox.
Autant en cumul, j’arrive par le signe « < « à afficher de janvier au mois n, autant je n’arrive pas à afficher UNIQUEMENT le mois n

J’ai l’impression que ça bugge car je « désaffiche » tous les mois (alors que dans mon code, certes je mets tout à zéro mais dans la foulée, j’affiche le mois souhaité)

J’ai essayé avec 12 select case mais ça devient une usine à gaz et je ne m’y retrouve plus …

Quelqu’un a-t-il une idée comment contourner la difficulté ?

Merci d’avance

Xxx mon code xxxx

Sub SaisiePériode()

Dim sh As Long
Dim MaRéponse As Variant

' je demande la période

Do While MaRéponse > 12 Or MaRéponse <= 0 Or MaRéponse <> Int(MaRéponse)
MaRéponse = Application.InputBox("Saisissez un chiffre entier correspond au mois de " + vbCrLf + _
"l'analyse souhaitée (1 = janvier, 12 = décembre)" _
+ vbCrLf + vbCrLf + "Cette question apparaît tant qu'une réponse valable " + vbCrLf + "ne sera pas saisie !", Type:=1)
Loop

For sh = 1 To Sheets.Count

Sheets(sh).Select

If ActiveSheet.PivotTables.Count > 0 Then ' pour que ça ne teste que les TCD

With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Mois")
.PivotItems("Janvier").Visible = False
.PivotItems("Février").Visible = False
.PivotItems("Mars").Visible = False
.PivotItems("Avril").Visible = False
.PivotItems("Mai").Visible = False
.PivotItems("Juin").Visible = False
.PivotItems("Juillet").Visible = False
.PivotItems("Août").Visible = False
.PivotItems("Septembre").Visible = False
.PivotItems("Octobre").Visible = False
.PivotItems("Novembre").Visible = False
.PivotItems("Décembre").Visible = False

If MaRéponse = 1 Then .PivotItems("Février").Visible = True
If MaRéponse = 2 Then .PivotItems("Février").Visible = True
If MaRéponse = 3 Then .PivotItems("Mars").Visible = True
If MaRéponse = 4 Then .PivotItems("Avril").Visible = True
If MaRéponse = 5 Then .PivotItems("Mai").Visible = True
If MaRéponse = 6 Then .PivotItems("Juin").Visible = True
If MaRéponse = 7 Then .PivotItems("Juillet").Visible = True
If MaRéponse = 8 Then .PivotItems("Août").Visible = True
If MaRéponse = 9 Then .PivotItems("Septembre").Visible = True
If MaRéponse = 10 Then .PivotItems("Octobre").Visible = True
If MaRéponse = 11 Then .PivotItems("Novembre").Visible = True
If MaRéponse = 12 Then .PivotItems("Décembre").Visible = True
End With

End If ' f(ActiveSheet.PivotTables.Count > 0)

Next

End Sub
 

Gareth

XLDnaute Impliqué
Re : TCD : sélection d’un mois unique bugge par VBA

Bonsoir,

Je crois que nous sommes en présence d'un petit bug.

Le code ci-dessous, fontionne parfaitement SI les parametres "Région et Langue" de Windows sont "Anglais Etats Unis" ...

Code:
Sub Test2()
Var = InputBox("Taper un mois") 'Mois saisi par l'utilisateur
Var2 = Format(DateSerial(2012, Var, 1), "mmm") 'Mois au format abrégé
For Each VarSheet In Sheets 'Boucle sur les feuilles
    If VarSheet.PivotTables.Count > 0 Then 'S'il y a un TCD ...
        For Each TCD In VarSheet.PivotTables '...boucle sur les TCD
            For Each VarPivotField In TCD.PivotFields 'Boucle sur les Champs
                If VarPivotField.Name = "Date" Then 'Sin on trouve un champ "Date" ...
                    VarPivotField.PivotItems(Var2).Visible = True 'Affiche le champs choisi par l'utilisateur
                    For Each VarItem In VarPivotField.PivotItems '... on boucle sur les items
                        If VarItem.Name <> VarPivotField.PivotItems(Var2).Name Then VarItem.Visible = False 'S'il ne s'agit pas du champ choisi, on masque
                    Next VarItem
                End If
            Next VarPivotField
        Next TCD
    End If
Next VarSheet
End Sub

Sources : Excel 2007 accessing PivotItem.Visible gives error if the field item value is a DATE

Un autre moyen, serait semble t il de rajouter une colonne dans ta base qui contiendrait une formule =TEXTE(B2;"mmm") et de filtrer les mois sur cette colonne.
 

Sebast

XLDnaute Impliqué
Re : TCD : sélection d’un mois unique bugge par VBA

Bonjour Gareth,

merci pour ta proposition. En fait, j'avais dû mal m'exprimer car mon problème n'est pas là où tu l'as vu.


Mon code était censé balayer toutes les feuilles d'un classeur et afficher le même mois sur tous les TCD à partir d'une saisie unique du mois demandé (intéressant pour s'épargner d'avoir à afficher le mois m dans 25 TCD ...).

MAIS entre-temps, j'ai fait des essais et me suis rendu compte que sur des TCD qui peuvent ne pas avoir le ou les mois voulus, la macro s'arrête car l'item n'existe pas.
Ex : je saisis le mois 9 (septembre) et la macro boucle sur les feuilles, met le tcd de la feuil1 sur septembre, idem pour la feuil2 etc mais si dans la feuiln, j'ai un tcd présentant des données non représentées en septembre, et bien ça plante ...


Et comme il n'existe pas d'instruction permettant de tester la présence d'un item (un peu du genre If ActiveSheet.PivotTables.Count > 0 permet de voir si un tcd est présent), ce risque est inévitable et donc on ne peut pas placer un if ... end if pour squizzer la difficulté.

Du coup, je ferai mes réglages à la main


Encore merci pour ta contribution
 

Pierrot93

XLDnaute Barbatruc
Re : TCD : sélection d’un mois unique bugge par VBA

Bonjour,

pas tout compris... mais à priori tu commence par masquer tous les items... hors dans un TCD au moins un item doit être visible.... Dans ce cas un message d'erreur est renvoyé...

bonne journée
@+
 

Sebast

XLDnaute Impliqué
Re : TCD : sélection d’un mois unique bugge par VBA

Bonjour Pierrot,

j'ai effectivement vu la raison du plantage mais comme je l'ai écrit plus haut, ça ne peut que planter quand je tombe sur un tcd n'ayant pas de données au mois souhaité ...
Donc je préfère abandonner dans cette direction
 

Pierrot93

XLDnaute Barbatruc
Re : TCD : sélection d’un mois unique bugge par VBA

Re,

un code que j'espère tu pourras adapter à ta problèmatique, que j'avoue ne pas avoir comprise...
Code:
Option Explicit
Sub tcd()
Dim pf As PivotField, p As PivotItem
Application.ScreenUpdating = False
Set pf = ActiveSheet.PivotTables(1).PivotFields("dates")
With pf
    For Each p In .PivotItems
        p.Visible = True
    Next p
    For Each p In .PivotItems
        If p.Value <> "Décembre" Then
            If .VisibleItems.Count > 1 Then
                p.Visible = False
            Else
                MsgBox "Au moins 1 élément doit être affiché..."
                Exit Sub
            End If
        End If
    Next p
End With
End Sub
 

chris

XLDnaute Barbatruc
Re : TCD : sélection d’un mois unique bugge par VBA

Bonjour

On peut dans un boucle tester les valeurs d'un champ et donc savoir si la valeur est présente ou non.
Cependant dans le cas où les valeurs sont nombreuses cela peut être un peu long.


Edit : coucou Pierrot. Par sécurité, j'affiche tout puis travaille par masquage, ceci fin d'éviter d'oublier de démasquer des éléments nouveaux (apparus à l'actualisation mais masqués si un filtre était actif). Mais comme tu le montres, le test visant à ne pas tout masquer est impératif.
 
Dernière édition:

Pierrot93

XLDnaute Barbatruc
Re : TCD : sélection d’un mois unique bugge par VBA

Re, bonjour Chris,
Edit : coucou Pierrot. Par sécurité, j'affiche tout puis travaille par masquage, ceci fin d'éviter d'oublier de démasquer des éléments nouveaux (apparus à l'actualisation mais masqués si un filtre était actif). Mais comme tu le montres, le test visant à ne pas tout masquer est impératif.

oui tout à fait d'accord Chris:), comme dans la première boucle de mon code qui affiche tous les items...
 

Sebast

XLDnaute Impliqué
Re : TCD : sélection d’un mois unique bugge par VBA

Pierrot,

je regarde ton code mais en attendant, je résume mon souci :

si je tombe sur un tcd affichant des données n'existant par ex que pour janvier et février alors que je veux par vba afficher le mois de mars, alors ça plante ...
 

chris

XLDnaute Barbatruc
Re : TCD : sélection d’un mois unique bugge par VBA

Re
...
si je tombe sur un tcd affichant des données n'existant par ex que pour janvier et février alors que je veux par vba afficher le mois de mars, alors ça plante ...

D'où le test : quand tu masques tu peux vérifier qu'il reste un item et d'autre part tu peux tester quelles valeurs existe pour l'item mois : avec douze mois la boucle est rapide !
 

Pierrot93

XLDnaute Barbatruc
Re : TCD : sélection d’un mois unique bugge par VBA

Re,

Bonjour

Pierrot : Oups, javais lu trop vite. Il y a dans 2007 la commande ClearManualFilter qui évite la boucle. Je ne sais pas si elle existait dans 2003.

Pas de souci:), je me disais que j'avais peut être raté quelque chose... fort possible... Par contre "ClearManualFilter " n'existe pas sous 2003.... Je te souhaite une bonne journée
 

Gareth

XLDnaute Impliqué
Re : TCD : sélection d’un mois unique bugge par VBA

@ Sebast,

Bonjour,

Sauf erreur de ma part, mon code fait exactement ce que tu décris.
J'affiche en premier le champ souhaité et ensuite masque les autres => pas de risque.
Il se trouve que sous Excel 2010 il créé tous les mois (dates ou pas dates dans la base) => pas de probleme d'affichage.
Excepté le bug dont je parle (voir lien dans mon 1er post).
Ma macro fontionne en US et non en FR. Pb sur l'interpretation des dates semble t il.

NB- dans ma macro, on peut tester l'existence mois avec VarItem.Name.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
314 654
Messages
2 111 595
Membres
111 211
dernier inscrit
christophe.saillant