Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 AutoFiltre Mois Trimestre

cathodique

XLDnaute Barbatruc
Bonjour,

Après une recherche infructueuse, je vous soumets mon problème.
Sur la feuille BD, colA des dates, col B et C des montants. Je voudrais mettre en place des autofiltres, pour le journalier c'est ok. Je récupère les dates dans un dictionnaire sur lequel je boucle pour filtrer.

Par contre je n'arrive pas à filtrer par rapport au mois (pour trimestre pas encore abordé).
Je refais la même chose sauf que dans le dictionnaire, je récupère les mois.
VB:
Option Explicit
Sub Calculs()    'en utilisant Filtrages successifs
    Dim i As Long, j As Long, k As Long, NBd As Long, NCr As Long, dl As Long
    Dim derlig As Long, Dercol As Integer, ShBd As Worksheet, ShSyn As Worksheet
    Dim c As Range, Ddate As Object, cle, Période As String
    Application.ScreenUpdating = False
    'On Error Resume Next
    Set ShBd = Worksheets("BD")
    Set ShSyn = Worksheets("MaFeuille")

    ShBd.AutoFilterMode = False
    NBd = ShBd.Cells(ShBd.Rows.Count, 1).End(xlUp).Row

    With ShSyn
        Période = .Range("D1").Value
        dl = .Cells(.Rows.Count, 1).End(xlUp).Row
        If dl > 5 Then .Range("A6:I" & dl).Rows.Delete
        With ShBd

            'MsgBox Month(cle)
            Select Case Période
            Case "Par date"
                Set Ddate = CreateObject("Scripting.Dictionary")    'date sans doublon
                For Each c In .Range("A6:A" & NBd)
                    Ddate(c.Value) = ""
                Next c
                For Each cle In Ddate
                    .Range("A1:I" & NBd).AutoFilter Field:=1, Criteria1:=Format(cle, "dd/mm/yyyy")
                    derlig = ShSyn.Cells(.Rows.Count, 1).End(xlUp).Row
                    ShSyn.Cells(derlig + 1, 1) = cle
                    'code 9 pour somme - code 101= moyenne
                    ShSyn.Cells(derlig + 1, 2) = WorksheetFunction.Subtotal(9, ShBd.Columns(2))
                    ShSyn.Cells(derlig + 1, 3) = WorksheetFunction.Subtotal(9, ShBd.Columns(3))
                Next cle
            Case "Mensuel"
                Set Ddate = CreateObject("Scripting.Dictionary")    'date sans doublon
                For Each c In .Range("A6:A" & NBd)
                    Ddate(Month(c.Value)) = ""
                Next c
                For Each cle In Ddate
                    .Range("A1:I" & NBd).AutoFilter Field:=1, Criteria1:=cle
                    derlig = ShSyn.Cells(.Rows.Count, 1).End(xlUp).Row
                    ShSyn.Cells(derlig + 1, 1) = Format(Month(cle), "mmmm")
                    ShSyn.Cells(derlig + 1, 2) = WorksheetFunction.Subtotal(9, ShBd.Columns(2))
                    ShSyn.Cells(derlig + 1, 3) = WorksheetFunction.Subtotal(9, ShBd.Columns(3))
                Next cle

            Case "Trimestriel"
                'en instance
            Case "Annuel"
                'en instance
            End Select

            .AutoFilterMode = False
        End With
    End With

    Set ShBd = Nothing
    Set ShSyn = Nothing
End Sub
Merci par avance.
 

Pièces jointes

  • AutoFiltreDate.xlsm
    31.8 KB · Affichages: 37

cathodique

XLDnaute Barbatruc
Merci beaucoup JCLG,

En effet, un TCD fait l'affaire. Mais c'est pour apprendre à manipuler les dates.
Ces dernières me torturent. Alors, j'ai décidé de m'y attaquer et pour le moment ça coince.
Et ce, malgré les multiples exemples de Boisgontier, je ne suis pas encore parvenu aux résultats escomptés (filtrer des dates).

Encore merci et bon dimanche.
 

mapomme

XLDnaute Barbatruc
Bonjour cathodique, JCGL,

Un essai à ma sauce. Je n'avais pas compris que le sujet de la question était spécifiquement le filtrage des dates (et pourtant le nom du fichier était parlant !). J'ai donc tout fait, quelque soit la période, via un dictionary sans aucune utilisation de l'autofliter (pas bien ). Désolé .
 

Pièces jointes

  • cathodique- AutoFiltreDate- v1.xlsm
    33.7 KB · Affichages: 35

chris

XLDnaute Barbatruc
Bonjour à tous

Pour répondre à la finalité "apprendre à manipuler les dates", quelques remarques

  • Passer par des filtres automatiques et des formules sous-total est
  • contre productif : je faisais cela à une certaine époque et cela rame dès que le nombre de lignes est conséquent.
    du coup le dictionnaire n'apporte rien
  • incorrect tel que tu l'as fait : il faudrait pour le mois 1,
    soit utiliser le filtre chronologique avec la période Janvier,
    soit un filtre personnalisé avec début >=01/01/2017 et fin <=31/01/2017
  • si tu ne veux pas passer par un TCD, tu pourrais directement passer par une function SUMIFS
 
Dernière édition:

cathodique

XLDnaute Barbatruc
@mapomme: comme à l'accoutumer précis et efficace. Même avec les tableaux, c'est aussi une bonne base pour moi. Merci beaucoup.

@Chirs: Je te remercie beaucoup pour tes explications. Je vais en tenir compte.
Le dictionnaire, c'était juste là pour avoir les dates non en double.
Je n'ai pas dit que je ne voulais pas de TCD. Le but est d'apprendre à manipuler les dates. Je constate que ce n'est pas aussi évident que ça.

J'ai utilisé l'enregistreur mais je ne vois vraiment pas comment manipuler le code pour y intégrer la variable.
VB:
Option Explicit
Sub Filtre_mois()
    Range("A1").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$C$204").AutoFilter Field:=1, Criteria1:= _
        xlFilterAllDatesInPeriodSeptember, Operator:=xlFilterDynamic
End Sub
Sub Macro2()
    ActiveSheet.Range("$A$1:$C$204").AutoFilter Field:=1, Operator:= _
        xlFilterValues, Criteria2:=Array(1, "5/16/2017")
End Sub
Merci pour votre apport.
 

chris

XLDnaute Barbatruc
Bonjour

Voilà comment je traiterais le mensuel sans filtre
Code:
                Dim mois As Byte, An As Integer
                Dim TotMoisD As Currency, TotMoisR As Currency

                derlig = 6
                For An = Year(WorksheetFunction.Min(.Range("A2:A" & NBd))) To Year(WorksheetFunction.Max(.Range("A2:A" & NBd)))

                    For mois = 1 To 12
                        TotMoisR = WorksheetFunction.SumIfs(.Range("B2:B" & NBd), .Range("A2:A" & NBd), ">=" & mois & "/01/" & An, .Range("A2:A" & NBd), "<" & WorksheetFunction.EoMonth(mois & "/01/" & An, 0))
                        TotMoisD = WorksheetFunction.SumIfs(.Range("c2:c" & NBd), .Range("A2:A" & NBd), ">=" & mois & "/01/" & An, .Range("A2:A" & NBd), "<" & WorksheetFunction.EoMonth(mois & "/01/" & An, 0))
                        If TotMoisR <> 0 Or TotMoisD <> 0 Then
                            ShSyn.Cells(derlig, 1) = Format(CDate("01/" & mois & "/" & An), "mmmm")
                            ShSyn.Cells(derlig, 2) = TotMoisR
                            ShSyn.Cells(derlig, 3) = TotMoisD
                            derlig = derlig + 1
                        End If
                    Next mois
                Next An
Edit : on peut modifier la condition pour mettre les 12 mois, sans valeurs, le cas échéant
Edit 2 : je n'ai pas inscrit l'année mais le code prévoit plusieurs années à la suite, il serait donc mieux de mentionner l'année dans la restitution.
Edit 3 : erreur de copie du code, j'ai remis le bon
 
Dernière édition:

cathodique

XLDnaute Barbatruc
Merci Chris, ton code est impeccable.

Sauf que je ne sais toujours pas quelle est la "syntaxe", pour effectuer un filtrage par rapport au mois des dates. Ce n'est la sommation de données qui m'importe, mais le filtrage.

J'ai revue mon code et maintenant c'est le mois en toutes lettres qui est renvoyé dans le dictionnaire. Malgré cela, pas de filtrage. Pourquoi?
VB:
Case "Mensuel"
                Set Ddate = CreateObject("Scripting.Dictionary")    'date sans doublon
                For Each c In .Range("A6:A" & NBd)
                    Ddate(Format((c.Value), "mmmm")) = ""
                Next c
                For Each Cle In Ddate
'                MsgBox Cle
                   .Range("A1:I" & NBd).AutoFilter Field:=1, Operator:=xlFilterValues, Criteria1:=cle '*** ça coince ici
              Next Cle
Mon objectif est de parvenir à mettre en place le filtre par rapport au mois dans un premier temps.

Vraiment, très gentil de votre part d'avoir passer du temps sur mon problème en ce dimanche.
Bonne fin de journée.
 

chris

XLDnaute Barbatruc
Re

Il est inutile de parcourir 204 lignes pour trouver les 12 mois...
Tu peux utiliser
  • soit mes critères à l'intérieur du SUMIFS comme bornes pour un filtre personnalisé
  • soit le filtre chronologique équivalent au mois

    Code:
                    Dim mois As Byte
                    For mois = 1 To 12
                        .Range("A1:I" & NBd).AutoFilter Field:=1, Criteria1:=20 + mois, Operator:=xlFilterDynamic
                       ..............................
                    Next mois
 

mapomme

XLDnaute Barbatruc
Bonsoir cathodique,

Selon moi, le filtre élaboré est plus adapté pour les filtres par mois, trimestre et année que l'autofilter.

Voir dans le fichier joint trois filtres élaborés (mensuel, trimestriel et annuel) qui font le travail. A adapter bien sûr à ton cas.
  • en f1, sélectionner le type de filtre
  • en m1, n1 et o1, saisir la valeur filtrée
 

Pièces jointes

  • cathodique- filtre avancé- v1.xlsm
    36 KB · Affichages: 33
Dernière édition:

klin89

XLDnaute Accro
Bonsoir à tous,

cathodique, il faut commencer ton code comme ceci :
VB:
Sub Filtre_mois()
Dim txt
'''
    Set Ddate = CreateObject("Scripting.Dictionary")
    Select Case Sheets("MaFeuille").Range("D1").Value
        Case "Par date"
            txt = c.Value
        Case "Mensuel"
            txt = Month(c.Value)
        Case "Trimestriel"
            'txt = j'en sais rien
        Case "Annuel"
            txt = Year(Value)
    End Select
    For Each c In .Range("A6:A" & NBd)
        Ddate(txt) = ""
    Next c
    'la suite de ton code
    '''
End Sub
Je n'ai pas poussé l'analyse de ta demande trop loin
klin89
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Bonsoir tout le monde

Je ne sais pas si ça peux aider. Moi j'ai fait comme ceci, pour avoir les ventes mensuelles

Code:
If UsfEtats.ComboBox3.ListIndex = 0 Then
            plage.AutoFilter 5, "=1", xlAnd
            For k = 2 To derlig
                .Range("c2:d" & derlig).Cells.SpecialCells(xlCellTypeVisible).Copy ActiveSheet.Range("b4")
            Next
            ActiveSheet.Range("b4:c" & .Range("c" & Rows.Count).End(xlUp).Row).Sort ActiveSheet.Range("b4"), xlAscending
        ElseIf UsfEtats.ComboBox3.ListIndex = 1 Then
            plage.AutoFilter 5, "=2", xlAnd
            For k = 2 To derlig
                .Range("c2:d" & derlig).Cells.SpecialCells(xlCellTypeVisible).Copy ActiveSheet.Range("b4")
            Next

Critères 1 et 2 sont les mois.

Pour les ventes trimestrielles AllDatesInPeriodQuarter (de 1 à 4)

VB:
With WsFact
        derlig = .Range("a" & Rows.Count).End(xlUp).Row
        Set plage = .Range("a1:l" & derlig)
        If UsfEtats.ComboBox2.ListIndex = 0 Then
            ActiveSheet.Range("h4, l4, p4").ClearContents
            plage.AutoFilter 6, xlFilterAllDatesInPeriodQuarter1, xlFilterDynamic
            ActiveSheet.Range("d4") = Application.Subtotal(9, .Range("h2:h65536"))
            .Range("w1") = Application.Subtotal(9, .Range("h2:h65536"))
        End If
        If UsfEtats.ComboBox2.ListIndex = 1 Then
            ActiveSheet.Range("d4, l4, p4").ClearContents
            plage.AutoFilter 6, xlFilterAllDatesInPeriodQuarter2, xlFilterDynamic
            ActiveSheet.Range("h4") = Application.Subtotal(9, .Range("h2:h65536"))
            .Range("x1") = Application.Subtotal(9, .Range("h2:h65536"))
        End If
 

chris

XLDnaute Barbatruc
Re

De même que le filtre indiqué pour les mois (21 à 32), on peut utiliser les nombres 17 à 20 pour les trimestres plutôt que xlFilterAllDatesInPeriodQuarter1, xlFilterAllDatesInPeriodQuarter2 etc
Code:
                Dim Trimestre As Byte
                For Trimestre = 1 To 4
                    .Range("A1:I" & NBd).AutoFilter Field:=1, Criteria1:=16 + Trimestre, Operator:=xlFilterDynamic
                   ..............................
                Next Trimestre

Ou plus simplement

                Dim Trimestre As Byte
                For Trimestre = 17  To 20
                    .Range("A1:I" & NBd).AutoFilter Field:=1, Criteria1:= Trimestre, Operator:=xlFilterDynamic
                   ..............................
                Next Trimestre

Edit : les filtres chronologiques vont, dans l'ordre de la liste déroulante de 1 à 32
 
Dernière édition:

Si...

XLDnaute Barbatruc
Bonsoir

Comme c’était fait, un exemple de filtres selon dates.

Nota (pas eu le temps) : si cela est nécessaire, on peut compléter (comme pour filtrer selon le mois et l’année).
 

Pièces jointes

  • AutoFiltreDate.xlsm
    27.8 KB · Affichages: 58

cathodique

XLDnaute Barbatruc
Bonjour,

@chris , voilààà! tu m'as bien compris maintenant. Je suis parti du principe que le filtrage mois, trimestre était réalisable sous excel donc reproductible en vba. J'avais effectué des enregistrements de macros mais je ne suis pas parvenu à les adapter pour insérer une variable pour effectuer une boucle (des filtres successifs). Merci tu viens de trouver une approche. En conclusion c'est réalisable, il faut juste trouver l'astuce. BRAVO.

@mapomme: Très intéressant ton fichier. J'avoue que j'ai du mal avec les filtres élaborés surtout en vba. Je dois m'y mettre pour mieux les comprendre. Merci beaucoup.

Bonne semaine à toutes et à tous.

Edit: Pas vu vos messages, Klin89, chris,Si... et Lone-wolf trop gentil de votre part. Je revois tout ça après le petit-déjeuner. Merci à vous, bonne journée.
 
Dernière édition:

Discussions similaires

Réponses
4
Affichages
455
Réponses
7
Affichages
529
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…