Bonjour à tous,
Je souhaiterais mettre en place un filtre dans un tableau croisé dynamique concernant deux dates.
Je dispose d'une date d'ouverture et d'une date de fin de période.
L'objectif est de sélectionner toutes les lignes où la date d'ouverture est antérieure ou égale à la date de fin de période.
Ma date d'ouverture est présente dans une cellule renseignée sous la forme : 05/08/2014 16:17:00
Le format de cette cellule est "Personnalisée" à "jj/mm/aaaa hh:mm"
J'en dispose d'une par ligne de données
Ma date de fin de période doit être déterminée
Je dispose d'une cellule "Période choisie" présente dans une autre feuille du classeur Excel sous la forme "juillet 2014"
Le format de cette cellule est "Standard"
1ère étape : déterminer la date de fin de période
Pour déterminer ma date de fin de période, j'ai codé la méthode suivante :
Cette méthode me permet de récupérer la date "31/07/2014" lorsque la personne a renseigné "juillet 2014" dans le champ.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 ' Calcul de la date de fin de période If IsNumeric(Right(Wb.Sheets(lib_onglet_Synthese).Range(pos_periode_choisie).Value, 4)) Then date_fin_periode_Year = CInt(Right(Wb.Sheets(lib_onglet_Synthese).Range(pos_periode_choisie).Value, 4)) Else date_fin_periode_Year = 1 End If TamponMois = Mid(Wb.Sheets(lib_onglet_Synthese).Range(pos_periode_choisie).Value, 1, Len(Wb.Sheets(lib_onglet_Synthese).Range(pos_periode_choisie)) - 5) If TamponMois = "janvier" Or TamponMois = "Janvier" Then date_fin_periode_Month = 1 date_fin_periode_Day = 31 ElseIf TamponMois = "février" Or TamponMois = "Février" Or TamponMois = "fevrier" Or TamponMois = "Fevrier" Then date_fin_periode_Month = 2 date_fin_periode_Day = 29 ElseIf TamponMois = "mars" Or TamponMois = "Mars" Then date_fin_periode_Month = 3 date_fin_periode_Day = 31 ElseIf TamponMois = "avril" Or TamponMois = "Avril" Then date_fin_periode_Month = 4 date_fin_periode_Day = 30 ElseIf TamponMois = "mai" Or TamponMois = "Mai" Then date_fin_periode_Month = 5 date_fin_periode_Day = 31 ElseIf TamponMois = "juin" Or TamponMois = "Juin" Then date_fin_periode_Month = 6 date_fin_periode_Day = 30 ElseIf TamponMois = "juillet" Or TamponMois = "Juillet" Then date_fin_periode_Month = 7 date_fin_periode_Day = 10 ElseIf TamponMois = "août" Or TamponMois = "Août" Or TamponMois = "aout" Or TamponMois = "Aout" Then date_fin_periode_Month = 8 date_fin_periode_Day = 31 ElseIf TamponMois = "septembre" Or TamponMois = "Septembre" Then date_fin_periode_Month = 9 date_fin_periode_Day = 30 ElseIf TamponMois = "octobre" Or TamponMois = "Octobre" Then date_fin_periode_Month = 10 ' Volontairement mis à 10 pour les tests date_fin_periode_Day = 31 ElseIf TamponMois = "novembre" Or TamponMois = "Novembre" Then date_fin_periode_Month = 11 date_fin_periode_Day = 30 ElseIf TamponMois = "décembre" Or TamponMois = "decembre" Or TamponMois = "Décembre" Or TamponMois = "Decembre" Then date_fin_periode_Month = 12 date_fin_periode_Day = 31 Else date_fin_periode_Year = 1 date_fin_periode_Month = 1 date_fin_periode_Day = 1 End If date_fin_periode = CDate(date_fin_periode_Day & "/" & date_fin_periode_Month & " / " & date_fin_periode_Year)
2ème étape : sélection des dates antérieures à la date de fin de période et passage en filtre du tableau croisé dynamique
Pour mener cette opération, j'ai réalisé la méthode suivante :
Après avoir exécuté ma procédure en sélectionnant "juillet 2014", je remarque que je récupère bien les informations de la bonne colonne et le traitement semble se dérouler correctement, hormis cet étrange <Incompatibilité de type> sur l'attribut .Visible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 ' Sélection des incidents ouverts antérieurement à la date de fin de période With TCD_M7.PivotFields(lib_col_DateOuverture) svgASO = .AutoSortOrder .AutoSort xlManual, .SourceName TCD_M7.ManualUpdate = True 'On Error Resume Next For Each pvtitem In .PivotItems If Not (IsNull(pvtitem.Value) Or IsEmpty(pvtitem.Value) Or IsMissing(pvtitem.Value) Or _ (Trim(pvtitem.Value) = "") Or (Trim(pvtitem.Value) = "(blank)")) Then If (Format(CDate(pvtitem.Value), "yyyy/mm/dd") <= Format(date_fin_periode, "yyyy/mm/dd")) Then pvtitem.Visible = True Else pvtitem.Visible = False End If Else pvtitem.Visible = False End If Next 'On Error GoTo 0 TCD_M7.ManualUpdate = False .AutoSort svgASO, .SourceName End With With TCD_M7.PivotFields(lib_col_DateOuverture) .Orientation = xlPageField .Position = 1 End With
En revanche, en retournant sous Excel, je remarque un filtre étonnant.
Le filtre s'arrête au 31 juillet et sélectionne toutes les entrées en août, et ce, alors que j'ai bien forcé le format des dates avec la commande Format pour m'assurer qu'elles sont bien disposées de la même façon. Il n'y a pas d'autres périodes désélectionnées.
Est-ce que l'un d'entre vous pourrait me donner une piste dans le but de m'aider ?
En vous remerciant par avance.
Partager