Filtrer champ (arborescence) d'un tableau croisé dynamique

fx62

XLDnaute Junior
Bonjour le forum,

Je viens vers vous car j'ai un problème pour filtrer mon tableau croisé dynamique par macro.
Tout d'abord je tiens à dire que les données de ce tableau proviennent de cubes OLAP (serveur). Il m'est malheureusement impossible de fournir un fichier avec les données.

Pour en revenir à mon soucis : je voudrais afficher les résultats d'un département pour la semaine qui vient de s'écouler, pour cela j'ai mis en place un TCD dans lequel j'ai un champ pour chaque département et un autre pour choisir la date.
Ce champs "Date" est construit sous la forme d'une arborescence. C'est à dire qu'il y a les années, les trimestres, les mois, les semaines, ainsi de suite ... ;) (cf. image en pièce jointe).

Voici le code relié à une commande "bouton". Je souhaiterais qu'un clic sur ce bouton, change le filtre du TCD, afin de visualiser les données de la semaine précédente. Mais à chaque fois, j'ai un message d'erreur (1004 : élément introuvable dans le cube OLAP) sur la ligne ActiveSheet.PivotTables("TCD_1").PivotFields(...
Pourtant les données existent bien puisque lorsque je le fais manuellement, cela fonctionne.
Code:
Sub Semaine_derniere()

Dim Semaine1, Semaine2, Mois, NomMois, Trimestre, Annee As Variant 'Définition des variables
Dim NumSemaine1, NumSemaine2 As String 'Définition des variables

Semaine1 = Now 'Définition date système
Semaine2 = DateAdd("ww", -1, Semaine1) 'Demande semaine précédente
NumSemaine1 = Format(Semaine2, "ww", vbMonday, vbFirstFourDays) 'Demande numéro semaine précédente
NumSemaine2 = "Semaine " & Format(Semaine2, "ww", vbMonday, vbFirstFourDays) 'Définition "Semaine ..."

If NumSemaine1 = 1 Or NumSemaine1 = 2 Or NumSemaine1 = 3 Or NumSemaine1 = 4 Or NumSemaine1 = 5 Then
Mois = "January" 'S01, 02, 03, 04, 05 = Janvier
ElseIf NumSemaine1 = 6 Or NumSemaine1 = 7 Or NumSemaine1 = 8 Or NumSemaine1 = 9 Then
Mois = "February" 'S06, 07, 08, 09 = Février
ElseIf NumSemaine1 = 10 Or NumSemaine1 = 11 Or NumSemaine1 = 12 Or NumSemaine1 = 13 Then
Mois = "March" 'S10, 11, 12, 13 = Mars
ElseIf NumSemaine1 = 14 Or NumSemaine1 = 15 Or NumSemaine1 = 16 Or NumSemaine1 = 17 Or NumSemaine1 = 18 Then
Mois = "April" 'S14, 15, 16, 17, 18 = Avril
ElseIf NumSemaine1 = 19 Or NumSemaine1 = 20 Or NumSemaine1 = 21 Or NumSemaine1 = 22 Then
Mois = "May" 'S19, 20, 21, 22 = Mai
ElseIf NumSemaine1 = 23 Or NumSemaine1 = 24 Or NumSemaine1 = 25 Or NumSemaine1 = 26 Then
Mois = "June" 'S23, 24, 25, 26 = Juin
ElseIf NumSemaine1 = 27 Or NumSemaine1 = 28 Or NumSemaine1 = 29 Or NumSemaine1 = 30 Or NumSemaine1 = 31 Then
Mois = "July" 'S27, 28, 29, 30, 31 = Juillet
ElseIf NumSemaine1 = 32 Or NumSemaine1 = 33 Or NumSemaine1 = 34 Or NumSemaine1 = 35 Then
Mois = "August" 'S31, 32, 33, 34, 35 = Août
ElseIf NumSemaine1 = 36 Or NumSemaine1 = 37 Or NumSemaine1 = 38 Or NumSemaine1 = 39 Or NumSemaine1 = 40 Then
Mois = "September" 'S36, 37, 38, 39, 40 = Septembre
ElseIf NumSemaine1 = 41 Or NumSemaine1 = 42 Or NumSemaine1 = 43 Or NumSemaine1 = 44 Then
Mois = "October" 'S41, 42, 43, 44 = Octobre
ElseIf NumSemaine1 = 45 Or NumSemaine1 = 46 Or NumSemaine1 = 47 Or NumSemaine1 = 48 Then
Mois = "November" 'S45, 46, 47, 48 = Novembre
ElseIf NumSemaine1 = 49 Or NumSemaine1 = 50 Or NumSemaine1 = 51 Or NumSemaine1 = 52 Then
Mois = "December" 'S49, 50, 51, 52 = Décembre
End If

If Mois = "January" Or Mois = "February" Or Mois = "March" Then
Trimestre = "Trimestre 1" 'Janvier, Février, Mars = Trimestre 1
ElseIf Mois = "April" Or Mois = "May" Or Mois = "June" Then
Trimestre = "Trimestre 2" 'Avril, Mai, Juin = Trimestre 2
ElseIf Mois = "July" Or Mois = "August" Or Mois = "September" Then
Trimestre = "Trimestre 3" 'Juillet, Août, Septembre = Trimestre 3
ElseIf Mois = "October" Or Mois = "November" Or Mois = "December" Then
Trimestre = "Trimestre 4" 'Octobre, Novembre, Décembre = Trimestre 4
End If

Annee = Year(Date) 'Définition de l'année

ActiveSheet.PivotTables("TCD_1").PivotFields( _
    "[OT Date fin réelle]").CurrentPageName = _
    "[OT Date fin réelle].[Tout OT Date de fin réelle].&[" & Annee & "].&[" & Trimestre & "].&[" & Mois & "].&[" & NumSemaine2 & "]"

End Sub

J'espère avoir été clair, si ça n'est pas le cas, faites le moi savoir, j'essayerai d'y remédier.
Merci d'avance pour votre aide malgrès la non-présence de fichier. :(
fx62
 

Pièces jointes

  • Menu.JPG
    Menu.JPG
    16.7 KB · Affichages: 281
  • Menu.JPG
    Menu.JPG
    16.7 KB · Affichages: 245
  • Menu.JPG
    Menu.JPG
    16.7 KB · Affichages: 237
Dernière édition:

fx62

XLDnaute Junior
Re : Filtrer champ (arborescence) d'un tableau croisé dynamique

Bonjour MJ13, Chris, Misange, le forum

Chris, j'ai mis les guillemets comme tu le disais, à savoir & "[" & Annee & "]" ...
Malheureusement, j'ai le droit à une erreur en retour (erreur de compilation, attendu : fin d'instruction) avec la ligne complète en rouge et [" & Annee & "] surligné en bleu.

Quelqu'un aurait une idée, un fil, ou quoique se soit sur les menus en arobrescence, dans le but de tester ce bout de code :
Code:
ActiveSheet.PivotTables("TCD_1").PivotFields( _
    "[OT Date fin réelle]").CurrentPageName = _
    "[OT Date fin réelle].[Tout OT Date de fin réelle].&[" & Annee & "].&[" & Trimestre & "].&[" & Mois & "].&[" & NumSemaine2 & "]"
Peut-être que je n'ai pas utilisé les bons mots pour effectuer mes recherches sur internet. Savez-vous comment est-ce que l'on appelle ce genre de menu déroulant ?

Si j'arrive à tester ce code, et qu'il fonctionne, cela voudra dire que le problème vient de la liaison avec les cubes OLAP.

Merci pour votre aide,
fx62
 

chris

XLDnaute Barbatruc
Re : Filtrer champ (arborescence) d'un tableau croisé dynamique

Bonjour

Quand le TCD est construit sur un cube OLAP les dates sont automatiquement hiérarchisées.

De toute évidence ta chaîne n'est pas bonne.
Les " et les & ne vont pas.
Si tu mets une variable tu dois
  • fermer la chaîne en cours après le [
  • ajouter le & suivi du nom de la variable
  • puis &
  • puis rouvrir un " suivi du ]
Il ne doit pas y avoir de & à l'intérieur d'une chaîne délimitée par " à gauche et " à droite.

Sans le tableau rien de sûr mais plutôt

Code:
ActiveSheet.PivotTables("TCD_1").PivotFields( _
    "[OT Date fin réelle]").CurrentPageName = _
    "[OT Date fin réelle].[Tout OT Date de fin réelle].[" &  Annee & "].[" & Trimestre & "].[" & Mois &  "].[" & NumSemaine2 & "]"
 

fx62

XLDnaute Junior
Re : Filtrer champ (arborescence) d'un tableau croisé dynamique

Et bien que dire à part merci chris ;)
C'est bon ma macro fonctionne ... c'est juste énorme !!!
Une petite erreur qui m'a fait perdre 2 semaines :p

Encore merci chris ! Merci également à MJ13 et Misange pour leur participation et leur aide.
 

MJ13

XLDnaute Barbatruc
Re : Filtrer champ (arborescence) d'un tableau croisé dynamique

Bonjour à tous

Et bien que dire à part merci chris ;)
C'est bon ma macro fonctionne ... c'est juste énorme !!!
Une petite erreur qui m'a fait perdre 2 semaines :p


C'est vrai que c'est bien, quand les passionnés du forum :) viennent en aide et que cela peut résoudre un problème si complexe.

Mais ce que je préfère, c'est quand on nous donne la solution qui fonctionne. C'est peut être le plus important dans un forum d'échange :).

Alors fx, juste un effort :eek:.
 

fx62

XLDnaute Junior
Re : Filtrer champ (arborescence) d'un tableau croisé dynamique

Si j'ai bien compris MJ13, tu souhaites avoir le code complet et corrigé. Pas de soucis, en réalité il est très peu différent de celui du premier post.
Par contre pour le fichier je ne peux le mettre en ligne car il ne serait d'aucune utilité étant donné que la base de données est externe.

Code:
Sub Semaine_derniere()

Dim Semaine1, Semaine2, Mois, Trimestre, Annee As Variant 'Définition des variables
Dim NumSemaine1, NumSemaine2 As String 'Définition des variables

Semaine1 = Now 'Définition date système
Semaine2 = DateAdd("ww", -1, Semaine1) 'Demande semaine précédente
NumSemaine1 = Format(Semaine2, "ww", vbMonday, vbFirstFourDays) 'Demande numéro semaine précédente
NumSemaine2 = "Semaine " & Format(Semaine2, "ww", vbMonday, vbFirstFourDays) 'Définition "Semaine n°..."

If NumSemaine1 = 1 Or NumSemaine1 = 2 Or NumSemaine1 = 3 Or NumSemaine1 = 4 Or NumSemaine1 = 5 Then
Mois = "January" 'S01, 02, 03, 04, 05 = Janvier
ElseIf NumSemaine1 = 6 Or NumSemaine1 = 7 Or NumSemaine1 = 8 Or NumSemaine1 = 9 Then
Mois = "February" 'S06, 07, 08, 09 = Février
ElseIf NumSemaine1 = 10 Or NumSemaine1 = 11 Or NumSemaine1 = 12 Or NumSemaine1 = 13 Then
Mois = "March" 'S10, 11, 12, 13 = Mars
ElseIf NumSemaine1 = 14 Or NumSemaine1 = 15 Or NumSemaine1 = 16 Or NumSemaine1 = 17 Or NumSemaine1 = 18 Then
Mois = "April" 'S14, 15, 16, 17, 18 = Avril
ElseIf NumSemaine1 = 19 Or NumSemaine1 = 20 Or NumSemaine1 = 21 Or NumSemaine1 = 22 Then
Mois = "May" 'S19, 20, 21, 22 = Mai
ElseIf NumSemaine1 = 23 Or NumSemaine1 = 24 Or NumSemaine1 = 25 Or NumSemaine1 = 26 Then
Mois = "June" 'S23, 24, 25, 26 = Juin
ElseIf NumSemaine1 = 27 Or NumSemaine1 = 28 Or NumSemaine1 = 29 Or NumSemaine1 = 30 Or NumSemaine1 = 31 Then
Mois = "July" 'S27, 28, 29, 30, 31 = Juillet
ElseIf NumSemaine1 = 32 Or NumSemaine1 = 33 Or NumSemaine1 = 34 Or NumSemaine1 = 35 Then
Mois = "August" 'S31, 32, 33, 34, 35 = Août
ElseIf NumSemaine1 = 36 Or NumSemaine1 = 37 Or NumSemaine1 = 38 Or NumSemaine1 = 39 Or NumSemaine1 = 40 Then
Mois = "September" 'S36, 37, 38, 39, 40 = Septembre
ElseIf NumSemaine1 = 41 Or NumSemaine1 = 42 Or NumSemaine1 = 43 Or NumSemaine1 = 44 Then
Mois = "October" 'S41, 42, 43, 44 = Octobre
ElseIf NumSemaine1 = 45 Or NumSemaine1 = 46 Or NumSemaine1 = 47 Or NumSemaine1 = 48 Then
Mois = "November" 'S45, 46, 47, 48 = Novembre
ElseIf NumSemaine1 = 49 Or NumSemaine1 = 50 Or NumSemaine1 = 51 Or NumSemaine1 = 52 Then
Mois = "December" 'S49, 50, 51, 52 = Décembre
End If

If Mois = "January" Or Mois = "February" Or Mois = "March" Then
Trimestre = "Trimestre 1" 'Janvier, Février, Mars = Trimestre 1
ElseIf Mois = "April" Or Mois = "May" Or Mois = "June" Then
Trimestre = "Trimestre 2" 'Avril, Mai, Juin = Trimestre 2
ElseIf Mois = "July" Or Mois = "August" Or Mois = "September" Then
Trimestre = "Trimestre 3" 'Juillet, Août, Septembre = Trimestre 3
ElseIf Mois = "October" Or Mois = "November" Or Mois = "December" Then
Trimestre = "Trimestre 4" 'Octobre, Novembre, Décembre = Trimestre 4
End If

Annee = Year(Date) 'Définition de l'année

ActiveSheet.PivotTables("TCD_1").PivotCache.Refresh

ActiveSheet.PivotTables("TCD_1").PivotFields("[OT Date fin réelle]").CurrentPageName = _
        "[OT Date fin réelle].[Tout OT Date de fin réelle].[" & Annee & "].[" & Trimestre & "].[" & Mois & "].[" & NumSemaine2 & "]"

End Sub

Voilà le code avec quelques commentaires, en espérant que ça en aidera plus d'un ;)
MJ13, si j'ai mal compris ta demande, fais le moi savoir !

fx62
 

chris

XLDnaute Barbatruc
Re : Filtrer champ (arborescence) d'un tableau croisé dynamique

Bonjour
Bise à MJ13

fx62 : ravie que cela ait solutionné ton problème.

Effectivement MJ13 a raison : le fil que tu avais indiqué t'avais induit en erreur, avec le code qui marche, ton fil pourra aider ceux qui rencontrerons le même problème.

De mon côté j'ai été obligée de me pencher sur l'aspect cube OLAP : je me coucherai moins bête ce soir.
 

MJ13

XLDnaute Barbatruc
Re : Filtrer champ (arborescence) d'un tableau croisé dynamique

Re

Merci pour le code :).

Mais sinon, un code de ce type, aurait-il pu fonctionner :confused: ( maisje suis sur XL2007 ).

Code:
Sub TCD_Semaine_Anterieure()
NumSem = InputBox("Quelle numéro de semaine?")
Application.ScreenUpdating = False
numSemaineDerniere = Format(Date, "ww", vbMonday, vbFirstFourDays) - NumSem
On Error Resume Next
ActiveSheet.PivotTables("TCD1").PivotFields("Semaine").CurrentPage = "(All)"
ActiveSheet.PivotTables("TCD1").PivotCache.Refresh
    With ActiveSheet.PivotTables("TCD1").PivotFields("Semaine")
      For i = 1 To ActiveSheet.PivotTables("TCD1").PivotFields("Semaine").PivotItems.Count
        .PivotItems("Semaine " & numSemaineDerniere).Visible = True
        .PivotItems(i).Visible = False
      Next
    End With
Application.ScreenUpdating = True
'ActiveSheet.PivotTables("TCD1").PivotFields("Semaine").EnableMultiplePageItems _
        = True
End Sub

PS: bise aux filles aussi :eek:.
 

chris

XLDnaute Barbatruc
Re : Filtrer champ (arborescence) d'un tableau croisé dynamique

Bonjour

Mais sinon, un code de ce type, aurait-il pu fonctionner :confused: ...
j'ai testé sur le fichier que tu as fourni au post 13+1.

A priori la structure du Filtre est différente sur une source OLAP. Avec 2002/2003 on pouvait générer un cube depuis Msquery (c'est comme cela que j'ai pu voir le type de filtre) mais ils ont supprimé cette fonctionnalité depuis la v 2007...
 

fx62

XLDnaute Junior
Re : Filtrer champ (arborescence) d'un tableau croisé dynamique

Bonjour MJ13, chris, Misange, le forum,

MJ13, comme promis, j'ai testé ton code, en effet il fonctionne sur le fichier que j'ai fourni en post 14 (même avec excel 2003).
Par contre le code pour réinitialiser le filtre, lui, ne fonctionne plus.

J'ai également testé sur mon fichier avec données sur cubes OLAP mais cela ne fonctionne pas.

Merci quand même MJ13,
fx62
 

MJ13

XLDnaute Barbatruc
Re : Filtrer champ (arborescence) d'un tableau croisé dynamique

Bonjour à tous

A priori la structure du Filtre est différente sur une source OLAP. Avec 2002/2003 on pouvait générer un cube depuis Msquery (c'est comme cela que j'ai pu voir le type de filtre) mais ils ont supprimé cette fonctionnalité depuis la v 2007...
Merci Chris :). Les Cube Olap, je croyais que c'était une marque un jeu de cubes en bois :eek:.

MJ13, comme promis, j'ai testé ton code, en effet il fonctionne sur le fichier que j'ai fourni en post 14 (même avec excel 2003).
Par contre le code pour réinitialiser le filtre, lui, ne fonctionne plus.

J'ai également testé sur mon fichier avec données sur cubes OLAP mais cela ne fonctionne pas.

Peux-tu tester ce code. Pour le Cube Olap, j'avais comme un présentiment :eek:.


Code:
Sub TCD_Sem_Anterieure()
'MJ
NumSem = InputBox("Quelle numéro de semaine?")
Application.ScreenUpdating = False
numSemaineDerniere = Format(Date, "ww", vbMonday, vbFirstFourDays) - NumSem
On Error Resume Next
ActiveSheet.PivotTables("TCD1").PivotFields("Semaine").CurrentPage = "(All)"
ActiveSheet.PivotTables("TCD1").PivotCache.Refresh
    With ActiveSheet.PivotTables("TCD1").PivotFields("Semaine")
      For i = 1 To ActiveSheet.PivotTables("TCD1").PivotFields("Semaine").PivotItems.Count
        .PivotItems("Semaine " & numSemaineDerniere).Visible = True
        .PivotItems(i).Visible = False
      Next
    End With
     Application.ScreenUpdating = True
ActiveSheet.PivotTables("TCD1").PivotFields("Semaine").CurrentPage = _
        "Semaine " & numSemaineDerniere
End Sub
 

fx62

XLDnaute Junior
Re : Filtrer champ (arborescence) d'un tableau croisé dynamique

Toujours pas. Ce qui est bizarre, c'est que je n'ai même pas d'erreur :confused:
L'inputbox fonctionne, le pivotcache.refresh aussi mais rien ne se passe après.

Je pense qu'on en revient au même problème, à savoir le menu déroulant sous forme d'arborescence, nan ? ;)

fx62
 
Dernière édition: