IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comparaison entre deux dates pour filtrer dans tableau croisé dynamique [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif
    Inscrit en
    Mai 2006
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 140
    Points : 233
    Points
    233
    Par défaut Comparaison entre deux dates pour filtrer dans tableau croisé dynamique
    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 :
    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)
    Cette méthode me permet de récupérer la date "31/07/2014" lorsque la personne a renseigné "juillet 2014" dans le champ.

    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 :
    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
    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.
    Nom : erreur.PNG
Affichages : 1843
Taille : 4,2 Ko
    Nom : espion.PNG
Affichages : 1809
Taille : 10,3 Ko
    Nom : methode.PNG
Affichages : 1966
Taille : 19,9 Ko

    En revanche, en retournant sous Excel, je remarque un filtre étonnant.
    Nom : debut.PNG
Affichages : 1982
Taille : 12,1 Ko
    Nom : fin.PNG
Affichages : 2076
Taille : 12,7 Ko
    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.

  2. #2
    Expert éminent sénior

    Profil pro
    Conseil, Formation, Développement - Indépendant
    Inscrit en
    Février 2010
    Messages
    8 469
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Conseil, Formation, Développement - Indépendant

    Informations forums :
    Inscription : Février 2010
    Messages : 8 469
    Points : 16 349
    Points
    16 349
    Par défaut
    Bonjour

    Ta date de fin correspond au 31/07/2014 à 00:00 (heure par défaut si on ne précise pas) donc il est normal que les autres horaires de ce 31/7 ne soit pas cochés : il faudrait le 1/08 à 0H ou le 31/07 à 23:59.

    Par ailleurs il y a pas mal de souci sur les dates dans les TCD selon le format, la version Excel dans laquelle le TCD a été initialement crée (les migrations de 2003 à 2007 ou 2007 à 2010 ajoutent des PB) : VBA les voit probablement sous la forme US donc le 1/08 est le 8/01.
    Vérifier en pas à pas ce que donne les conversions que tu effectues.

    Voir s'il serait ne serait pas plus efficace de faire le filtre via un segment...

    Un fil qui parle du PB des vides et des dates http://www.developpez.net/forums/d13...eme-item-vide/
    Chris
    PowerQuery existe depuis plus de 13 ans, est totalement intégré à Excel 2016 &+. Utilisez-le !

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.
    Confucius

    ----------------------------------------------------------------------------------------------
    En cas de résolution, n'hésitez pas cliquer sur c'est toujours apprécié...

  3. #3
    Membre actif
    Inscrit en
    Mai 2006
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 140
    Points : 233
    Points
    233
    Par défaut
    L'anomalie a été identifiée et corrigée à l'aide de Format().

    Les cellules des dates étaient bien spécifiées de type jj/mm/aaaa hh:mm

    En revanche, lorsqu'une cellule de ce type est parsée dans le vba, il fait fi de ce format spécifié et la déclare comme mm/jj/aaaa hh:mm sans toutefois intervertir le jour et le mois !

    Lorsqu'il détecte un jour (qu'il considère comme un mois) strictement supérieur à 12, la date est reconnue comme jj/mm/aaaa.

    Le 7 janvier était donc au format US (01/07/2014) mais le 13 janvier était lui au format français (13/01/2014).

    J'ai donc réalisé la correction (moche) suivante en attendant de voir s'il existe une façon de spécifier le type de type date (!) que l'on veut.

    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
     
        ' 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
                    date_annee = CInt(Format(CDate(pvtitem.Value), "yyyy"))
                    If CInt(Format(CDate(pvtitem.Value), "dd")) >= 13 Then
                        date_mois = CInt(Format(CDate(pvtitem.Value), "mm"))
                        date_jour = CInt(Format(CDate(pvtitem.Value), "dd"))
                    Else
                        date_mois = CInt(Format(CDate(pvtitem.Value), "dd"))
                        date_jour = CInt(Format(CDate(pvtitem.Value), "mm"))
                    End If
                    If date_annee < date_fin_periode_Year Or (date_annee = date_fin_periode_Year And date_mois < date_fin_periode_Month) Or _
                        (date_annee = date_fin_periode_Year And date_mois = date_fin_periode_Month And date_jour <= date_fin_periode_Day) 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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Macro pour filtrer un tableau croisé dynamique
    Par shakapouet dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 29/02/2012, 11h59
  2. Réponses: 2
    Dernier message: 26/05/2009, 11h52
  3. Réponses: 3
    Dernier message: 30/10/2008, 11h46
  4. Comparaison entre deux dates dans une table
    Par Biskot75 dans le forum Access
    Réponses: 6
    Dernier message: 19/09/2006, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo