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 :

Autofilter sur trimestre paramettrable


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Conseiller/formateur en risques prof.
    Inscrit en
    Mars 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseiller/formateur en risques prof.
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 41
    Points : 29
    Points
    29
    Par défaut Autofilter sur trimestre paramettrable
    Bonjour,
    je tourne un peu en rond après avoir monté un USF pour filtrer les données dates et autre,
    la déclaration des parametres est faite en tête de module Public ChampPeriode As Variant, Public CritPériode1, Public CritPériode2
    je rencontre un problème avec "FiltrePériode" qui bloque sur autofiter, alors que "FitrageMois" ne pose pas de problème
    je ne vois pas la bourde.

    Merci de votre aide

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Sub FiltrePériode()
     
        Dim LeTrim As Byte 
        Dim Rnd 'As Range
        '1/ choix feuille
        If txtSheet = "ATX" Then
          Set Rnd = Range("A1:Q65000")
            ChampPeriode = 1
        Else:
          Set Rnd = Range("A1:S65000")
            ChampPeriode = 2
        End If
     
     
        If cboMois = "_" Then
    '2/ parametre trimestre
        LeTrim = cboTrimestre.ListIndex+1
            Select Case LeTrim
     
                Case 1  '"1er Trim"
                    CritPériode1 = "1/1/" & cboAnnée
                    CritPériode2 = "31/3/" & cboAnnée
     
                Case 2  '"2ème Trim"
                    CritPériode1 = "1/4/" & cboAnnée
                    CritPériode2 = "31/6/" & cboAnnée
     
                Case 3  '"3ème Trim"
                    CritPériode1 = "1/7/" & cboAnnée
                    CritPériode2 = "31/9/" & cboAnnée
     
                Case 4  '"4ème Trim"
                    CritPériode1 = "1/10/" & cboAnnée
                    CritPériode2 = "31/12/" & cboAnnée
                End Select
            ElseIf cboMois = "_Tout" Then
     '3/ parametre année
                CritPériode1 = "1/1/" & cboAnnée
                CritPériode2 = "31/12/" & cboAnnée
            Else
    '4/ parametre Mois
                CritPériode1 = "1/" & cboMois & "/" & cboAnnée    'mise au format text mois /jour/an
                CritPériode2 = "31/" & cboMois & "/" & cboAnnée
            End If
     
            '5/ filtrage
            Range("A1:Q65000").AutoFilter Field:=ChampPeriode, Operator:=xlFilterValues, Criteria2:=Array(1, CritPériode1, 1, CritPériode2)
        End Sub
     
     
    Sub filtreTrimestre()
    'OK 8/7/15
        Dim CritPériode1, CritPériode2
        Range("A1:Q650000").Select
     
        ChampPeriode = 1
        CritPériode1 = "01/01/" & cboAnnée    '"01/01/2015"
        CritPériode2 = "03/30/" & cboAnnée    '"03/30/2015"
        ActiveSheet.Range("$A$1:$Q$65000").AutoFilter Field:=1, Operator:=xlFilterValues, Criteria2:=Array(1, CritPériode1, 1, CritPériode2)
    End Sub
     
     
     
    Sub FitrageMois()
        ActiveSheet.Range("$A$1:$Q$20").AutoFilter Field:=1, Operator:= _
                xlFilterValues, Criteria2:=Array(1, "1/30/2015", 1, "6/30/2015")
        Selection.AutoFilter
    End Sub
     
    Private Sub xxxcboTrimestre_Change()
    'OK 4/7/15
        txtPeriode = "Période sélectionnée =  " & cboTrimestre & " - " & cboAnnée
        cboMois.ListIndex = 0
        txtChoixTrimestre = Left(cboTrimestre, 1)
    End Sub

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 763
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Si tu as une version supérieure à 2003, tu as le filtre chronologique qui permet de filtrer sur ce type de période.
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveSheet.Range("$K$1:$K$382").AutoFilter Field:=1, Criteria1:=xlFilterNextQuarter, Operator:=xlFilterDynamic
    Il reste une autre option avec les filtres avancés d'excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut heu
    bonjour
    déjà pour commencer tu dois avoir un beau message d'erreur si tant est que les argument soit valides en terme de string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Case 1  '"1er Trim"
                    CritPériode1 = "1/1/" & cboAnnée
                    CritPériode2 = "31/3/" & cboAnnée
    remplace ton 31 par 25 car février a maximum 29 jour selon les années
    quand au mois (avril,juin,septembre,etc...) n'ont que 30 jours

    heu... même avec 25 ca prend en charge les jours 26 au dernier jours du mois au cas ou tu te poserais la question

    a bon entendeur
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Conseiller/formateur en risques prof.
    Inscrit en
    Mars 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseiller/formateur en risques prof.
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    Bonjour Philippe,
    Merci pour l'info. J'avais bien vu cette possibilité dans les paramètres de Autofilter, mais cela ne me convient pas car je souhaite souhaite pouvoir rechercher par exemple le 3ème trimestre de 2012, hors ici ce ne sont que les 4 derner trimestre que l'on peu filtrer.

    J'ai apporté une modif dans la définition des parametre, mais cela n'est aps suffisant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CritPériode1 = CDate("1/" & cboMois & "/" & cboAnnée)  'mise au format text mois /jour/an 
                CritPériode2 = CDate("31/" & cboMois & "/" & cboAnnée)
    Donc toujours à la recherche d'info

    Bonjour patricktoulon,
    si j'ai bien compris, il faudrait que je paramètre :
    - pour février à 25,
    - pour avril,juin,septembre et novembre à 30
    - et 31 pour les autre mois
    Je vais donc faire un 3ème test imbriqué

    Merci j'essaie cela

  5. #5
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut
    oila ce que donne l'enregistreur de macro pour le 1 er trimestre dans une de mes bases de données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ActiveSheet.ListObjects("Tableau_bilan2014").Range.AutoFilter Field:=2, _
            Operator:=xlFilterValues, Criteria2:=Array(1, "1/31/2014", 1, "2/28/2014", 1, "3/31/2014")
    je remplace le 31 ou le dernier jour de fevrier par 25 et j'ai le même résultat

    donc les arguments seront pour le 1 er trimestre
    "1/25/" & année
    "2/25/"& année
    "3/25/"& année
    resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      ActiveSheet.ListObjects("Tableau_bilan2014").Range.AutoFilter Field:=2, _
            Operator:=xlFilterValues, Criteria2:=Array(1, "1/25/" & année, 1, "2/,25/" & année, 1, "3/25/" & année)
    adapte le sheets et le field(num de la colonne)

    Citation Envoyé par markos63 Voir le message
    Bonjour patricktoulon,
    si j'ai bien compris, il faudrait que je paramètre :
    - pour février à 25,
    - pour avril,juin,septembre et novembre à 30
    - et 31 pour les autre mois
    Je vais donc faire un 3ème test imbriqué

    Merci j'essaie cela
    non!!!! tu met 25 pour tout les mois

    le 26,27,28,29,30,31 selon les mois seront pris en compte quand meme !!!!!!
    tu n'a donc aucun test imbriqué a faire
    regarde l'exemple que je t'ai donné en adaptant le sheets et le field bien sur
    pour le sheets tu fait simplement sheets(nom du sheets):le listobject n'est pas nécessaire pour toi moi j'ai ca parce que j'ouvre une base Access avec excel
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Conseiller/formateur en risques prof.
    Inscrit en
    Mars 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseiller/formateur en risques prof.
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    Pk,
    j'ai essayé ceci suite à ton poste, et même problème erreur " Erreur d'execution 1004 : la méthode Autofilter de la classe range à échoué"

    Mon filtre filtre sur 2 feuilles ou la date n'est pas dans la même colonne et sur année, trimestre ou mois avec 3 combo (cboAnnée, cboTrim, cboMois) raison pour laquelle je paramètre tous, mais mal à priori.
    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
     LeMoi = cboMois.ListIndex - 1      'Le combo comprend 2 autres valeurs avant Janvier
            Select Case LeMoi
    Case 2    ' pour février à 25,
                CritPériode1 = CDate(cboMois & "/1/" & cboAnnée)     'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate(cboMois & "/25/" & cboAnnée)
            Case 4, 6, 9, 11    ' avril,juin,septembre et novembre à 30
                CritPériode1 = CDate(cboMois & "/1/" & cboAnnée)      'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate(cboMois & "/30/" & cboAnnée)
            Case 1, 3, 4, 7, 8, 9, 12    '31 pour les autre mois
     
                CritPériode1 = CDate(cboMois & "/1/" & cboAnnée)   'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate(cboMois & "/31/" & cboAnnée)
            End Select
            txtPeriode = "Période sélectionnée =  " & cboMois & " - " & cboAnnée
            Range("A1:Q65000").Select
            Selection.AutoFilter Field:=ChampPeriode, Operator:=xlFilterValues, Criteria2:=Array(1, CritPériode1, 1, CritPériode2)

  7. #7
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    déjà quand tu dis range(.....) précise le sheets c'est mieux
    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.AutoFilter Field:=ChampPeriode, Operator:=xlFilterValues, Criteria2:=Array(1, CritPériode1, 1, CritPériode2)
    tu n'a pas l'impression qu'il manque un argument la ?
    pour moi dans un trimestre il y a 3 mois
    ensuite je n'ai pas très bien compris tu tri sur plusieurs sheets etc.... pffffff je vais analyser ton dernier post

    bon apres analyse a moins que je n'ai rien compris ta macro filtre sur un seul mois puisque l'argument mois et generé avec la listbox
    si tu veux faire par trimestre c'est tout le code qu'il faut repenser
    exemple ici tes deux critères traite le meme mois c'est pour ca que ca ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CritPériode1 = CDate(cboMois & "/1/" & cboAnnée)   'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate(cboMois & "/31/" & cboAnnée)
    dans mon exemple il y a 3 critères ( 1 pour chaque mois du trimestre )
    donc c'est tout ton select case qu'il faut repenser
    exemple
    a suposer que tu click sur le mois janvier ou fevrier ou mars
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select case ta listebox 
    case 1,2,3
    ' les mois sont 1,2,3
    critere1="1/25/" & année
    critere2="2/25/" & année
    critere3="3/25/" & année
    case 4,5,6 ' ici pour les mois d'avril ,mai ,juin
    critere1="4/25/" & année
    critere2="5/25/" & année
    critere3="6/25/" & année
    etc... jusqu'à 12
    ensuite tu met les 3critere dans la ligne du code du filtre c'est pas compliqué
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  8. #8
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 763
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Merci pour l'info. J'avais bien vu cette possibilité dans les paramètres de Autofilter, mais cela ne me convient pas car je souhaite souhaite pouvoir rechercher par exemple le 3ème trimestre de 2012, hors ici ce ne sont que les 4 derner trimestre que l'on peu filtrer.
    Dans ce cas, je ne peux que te conseiller l'utilisation des filtres avancés d'excel avec critères nommés qui offre bien plus de possibilités.
    A lire éventuellement Les filtres avancés ou élaborés dans Excel
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Conseiller/formateur en risques prof.
    Inscrit en
    Mars 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseiller/formateur en risques prof.
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    Bonjour et merci à tous,

    cette fois tous les types de filtrage fonctionnent.
    il faillait modifier les valeurs en type Long avec CLng (et non integer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.AutoFilter Field:=ChampPeriode, Criteria1:=">=" &  CLng(CritPériode1), Operator:=xlAnd, Criteria2:="<=" & CLng(CritPériode2)
    pour ceux qui seraient intéressés voici la macro basée sur un USF avec trois combo : mois année, trimestre, la macro filtrage se déclenche sur le changement des combo.
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Sub FiltrePériode()
        Dim LeTrim As Byte    'As Range
        Dim LeMoi As Byte
     
     '1/ choix feuille
        If txtSheet = "AT" Then
            Range("A1:Q65000").Select   '1 048 576 lignes en Ver 2010
     
            ChampPeriode = 1
        Else:
            Range("A1:S65000").Select
     
            ChampPeriode = 2
        End If
     
        If cboMois = "_" Then
            txtPeriode = "Période sélectionnée = " & cboTrimestre & " - " & cboAnnée
            'If cboMois.ListIndex > 1 Then
     
    '2/ parametre trimestre
            LeTrim = cboTrimestre.ListIndex    
            Select Case LeTrim
            Case 0
                Exit Sub
            Case 1      '"1er Trim"
                CritPériode1 = CDate("1/1/" & cboAnnée)
                CritPériode2 = CDate("31/3/" & cboAnnée)
     
            Case 2      '"2ème Trim"
                CritPériode1 = CDate("1/4/" & cboAnnée)
                CritPériode2 = CDate("30/6/" & cboAnnée)
            Case 3      '"3ème Trim"
                CritPériode1 = CDate("1/7/" & cboAnnée)
                CritPériode2 = CDate("30/9/" & cboAnnée)
     
            Case 4      '"4ème Trim"
                CritPériode1 = CDate("1/10/" & cboAnnée)
                CritPériode2 = CDate("31/12/" & cboAnnée)
            End Select
            txtPeriode = "Période sélectionnée =" & cboAnnée
     
        ElseIf cboMois = "_Tout" Then
     
     '3/ parametre année
            CritPériode1 = CDate("1/1/" & cboAnnée)
            CritPériode2 = CDate("31/12/" & cboAnnée)
            txtPeriode = "Période sélectionnée = " & cboAnnée
     
        Else
     
     '4/ parametre Mois
            LeMoi = cboMois.ListIndex - 1
            Select Case LeMoi
     
            Case 2    ' pour février à 25,
                CritPériode1 = CDate("01/" & cboMois & "/" & cboAnnée)      'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate("28/" & cboMois & "/" & cboAnnée)
            Case 4, 6, 9, 11    ' avril,juin,septembre et novembre à 30
                CritPériode1 = CDate("01/" & cboMois & "/" & cboAnnée)      'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate("30/" & cboMois & "/" & cboAnnée)
            Case 1, 3, 4, 7, 8, 9, 12    '31 pour les autre mois
     
                CritPériode1 = CDate("01/" & cboMois & "/" & cboAnnée)   'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate("31/" & cboMois & "/" & cboAnnée)
            End Select
            txtPeriode = "Période sélectionnée =  " & cboMois & " - " & cboAnnée
            Range("A1:Q65000").Select
     
        End If
     
    '5/ filtrage
        Selection.AutoFilter Field:=ChampPeriode, Criteria1:=">=" & CLng(CritPériode1), Operator:=xlAnd, Criteria2:="<=" & CLng(CritPériode2)
     
    End Sub
    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
    Private Sub UserForm_Initialize()
     
        Dim MonAnnée
        Dim X
        MonAnnée = Year(Date)
        cboAnnée.AddItem MonAnnée
        cboAnnée.AddItem Year(Date) - 1
        cboAnnée.AddItem Year(Date) - 2
        cboAnnée.AddItem Year(Date) - 3
        cboAnnée.AddItem Year(Date) - 4
        cboAnnée.AddItem Year(Date) - 5
        cboAnnée.ListIndex = 0
        cboTrimestre.AddItem "_"
        cboTrimestre.AddItem "1er Trim"
        cboTrimestre.AddItem "2ème Trim"
        cboTrimestre.AddItem "3ème Trim"
        cboTrimestre.AddItem "4ème Trim"
        cboMois.AddItem "_"
        cboMois.AddItem "_Tout"
        For X = 1 To 12
            cboMois.AddItem Format(DateSerial(2006, X, 1), "mmmm")
        Next
     ' Initialisation de la ListBox sur le premier élément
        cboMois.ListIndex = 0
     
        cboTrimestre.ListIndex = DatePart("Q", Date)    ' trimestre en cours
        end sub

  10. #10
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    pour les dates en long dans les criterial je suis surpris!!!!
    après on peu nettoyer le code
    déjà pour commencer
    pour l'initialise de l'usf

    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
    Private Sub UserForm_Initialize()
        Dim X, i, t
        For i = Year(Date) To Year(Date) - 5 Step -1
            cboAnnée.AddItem i
        Next
        cboAnnée.ListIndex = 0
        cboTrimestre.AddItem "_"
     
    For t = 1 To 4
            cboTrimestre.AddItem IIf(t = 1, t & " er " & "trim", t & " eme " & "trim")
        Next
        cboTrimestre.ListIndex = DatePart("Q", Date)    ' trimestre en cours
     
        cboMois.AddItem "_"
        cboMois.AddItem "_Tout"
            For X = 1 To 12
            cboMois.AddItem Format(DateSerial(2006, X, 1), "mmmm")
        Next
        ' Initialisation de la ListBox sur le premier élément
        cboMois.ListIndex = 0
    End Sub
    ensuite ici pourquoi ne pas se servir de l'index plutôt que la valeur
    tu n'aurais pas été obligé de convertir le criterial en long

    a la place de cbomois j'aurais utilisé cbomois.listindex -1 puisque l'index correspond au mois en long
    et en applicant ce que je t'ai dis dans mes réponse précédentes tu n'aurais même pas eu besoins d'un select case



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Select Case cboMois.ListIndex - 1
     
            Case 2    ' pour février à 25,
                CritPériode1 = CDate("01/" & cboMois & "/" & cboAnnée)      'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate("28/" & cboMois & "/" & cboAnnée)
            Case 4, 6, 9, 11    ' avril,juin,septembre et novembre à 30
                CritPériode1 = CDate("01/" & cboMois & "/" & cboAnnée)      'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate("30/" & cboMois & "/" & cboAnnée)
    a la place de ton select case j'aurais fait ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CritPériode1 = CDate("01/" & cboMois.listindex-1 & "/" & cboAnnée)      'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate("25/" & cboMois.listindex -1  & "/" & cboAnnée)
    ceci fonctionne pour tout les mois meme avec 25
    comme je te l'ai dis avant même avec le 25 pour les mois en 30 ou 31 ca va jusqu'au bout


    tu n'aurais pas un exemple de ton sheets avec des données bidon pour que je te fasse un proto ?

    enfin avec moins de la moitié de tes lignes de code je fait la même chose et plus rapide car je ne sélectionne pas la plage j'utilise une variable range
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Conseiller/formateur en risques prof.
    Inscrit en
    Mars 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseiller/formateur en risques prof.
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    Bonsoir,
    Merci à tous, la macro fonctionne.
    La solution c'est de mettre les critères en format Long avec CLng(critère).

    Voici la macro complète si cela intéresse quelqu'un.
    basée sur un USF avec 3 combo : Année, Trimestre et mois, si changement déclenche la macro :

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    Sub FiltrePériode()
        Dim LeTrim As Byte    'As Range
        Dim LeMoi As Byte
     
    '1/ choix feuille
        If txtSheet = "MAT" Then
            Range("A1:Q65000").Select   '1 048 576 lignes en Ver 2010
            ChampPeriode = 1
        Else:
            Range("A1:S65000").Select
            ChampPeriode = 2
        End If
        If cboMois = "_" Then
            txtPeriode = "Période sélectionnée = " & cboTrimestre & " - " & cboAnnée
            'If cboMois.ListIndex > 1 Then
    '2/ Choix toutes les données
         If cboAnnée = "Tout" Then
            cmdAffTout_Click
             txtPeriode = "Aucune période sélectionnée "
         Exit Sub
      End If
    '3/ Choix trimestre
            LeTrim = cboTrimestre.ListIndex    '+ 1
            Select Case LeTrim
            Case 0
                Exit Sub
            Case 1      '"1er Trim"
                CritPériode1 = CDate("1/1/" & cboAnnée)
                CritPériode2 = CDate("31/3/" & cboAnnée)
     
            Case 2      '"2ème Trim"
                CritPériode1 = CDate("1/4/" & cboAnnée)
                CritPériode2 = CDate("30/6/" & cboAnnée)
            Case 3      '"3ème Trim"
                CritPériode1 = CDate("1/7/" & cboAnnée)
                CritPériode2 = CDate("30/9/" & cboAnnée)
     
            Case 4      '"4ème Trim"
                CritPériode1 = CDate("1/10/" & cboAnnée)
                CritPériode2 = CDate("31/12/" & cboAnnée)
            End Select
            txtPeriode = "Période sélectionnée =" & cboAnnée
        ElseIf cboMois = "_Tout" Then
     
    '4/ Choix année
            CritPériode1 = CDate("1/1/" & cboAnnée)
            CritPériode2 = CDate("31/12/" & cboAnnée)
            txtPeriode = "Période sélectionnée = " & cboAnnée
     
        Else
    '5/ Choix Mois
            LeMoi = cboMois.ListIndex - 1
            Select Case LeMoi
     
            Case 2    ' pour février à 25,
                CritPériode1 = CDate("01/" & cboMois & "/" & cboAnnée)      'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate("28/" & cboMois & "/" & cboAnnée)
     
            Case 4, 6, 9, 11    ' avril,juin,septembre et novembre à 30
                CritPériode1 = CDate("01/" & cboMois & "/" & cboAnnée)      'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate("30/" & cboMois & "/" & cboAnnée)
     
            Case 1, 3, 4, 7, 8, 9, 12    '31 pour les autre mois
                CritPériode1 = CDate("01/" & cboMois & "/" & cboAnnée)   'mise au format text mois /jour/an '.ListIndex + 1
                CritPériode2 = CDate("31/" & cboMois & "/" & cboAnnée)
            End Select
     
            txtPeriode = "Période sélectionnée =  " & cboMois & " - " & cboAnnée
            Range("A1:Q65000").Select
        End If
     
    '6/ filtrage
        Selection.AutoFilter Field:=ChampPeriode, Criteria1:=">=" & CLng(CritPériode1), Operator:=xlAnd, Criteria2:="<=" & CLng(CritPériode2)
    End Sub
    A plus

  12. #12
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    bonjour
    apparemment les conseillers formateurs n'écoutent pas les autres

    en gros tu construit un mur de château pour en casser une partie pour obtenir une clôture
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  13. #13
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 763
    Points : 28 622
    Points
    28 622
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Tu construis une usine à gaz pour calculer le début et fin de trimestre et je reste persuadé que dans ce cas précis il est plus simple d'utiliser le filtre avancé. Après avoir déterminé la zone des données et la zone des critères, la ligne de code se résume à une ligne.

    Exemple de calcul de début et fin de trimestre avec Excel et sa fonction DATE (A adapter donc en VBA)
    En D17 l'année, en B17 le n° du trimestre
    Début de trimestre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =DATE($D17;(($B17-1)*3)+1;1)
    Fin du trimestre
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  14. #14
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    re
    absolument Philipe!

    et même si on reste en pure vba
    j'ai fait la même chose sans select case

    2 lignes pour les trimestre avec expression(switch)pour alimenter les criterial

    2 ligne pour le mois avec l'index de la combobox directement dans la ligne des critères comme précédemment cité

    le tout sans select de range
    point barre
    mais visiblement c'est passé au oubliettes
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  15. #15
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re exemple
    re
    exemple

    pour l'année

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    '4/ Choix année
            CritPériode1 = CDate("1/1/" & cboAnnée)
            CritPériode2 = CDate("31/12/" & cboAnnée)
            txtPeriode = "Période sélectionnée = " & cboAnnée
    pour le trimestre 1,2,3 ou 4:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     LeTrim = cboTrimestre.ListIndex + 1
            moisdeb = Switch(LeTrim = 1, 1, LeTrim = 2, 4, LeTrim = 3, 7, LeTrim = 4, 10)
            CritPériode1 = CDate("1/" & moisdeb & "/" & cboAnnée)
            CritPériode2 = CDate("31/" & moisdeb + 2 & "/" & cboAnnée)
    et enfin pour le mois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     ' on calcule automatiquement le nombre de jour du mois sélectionné(fevrier,30 ou 31)
            NB_JOURS = Day(DateSerial(cboAnnée, (cboMois.ListIndex - 1) + 1, 1) - 1)
            CritPériode1 = CDate("1/" & cboMois.ListIndex - 1 & "/" & cboAnnée)
            CritPériode2 = CDate(NB_JOURS & "/" & cboMois.ListIndex - 1 & "/" & cboAnnée)
            txtPeriode = "Période sélectionnée =  " & cboMois & " - " & cboAnnée
    point barre
    et je ne me suis pas assez planché dessus mais je suis certain que l'on peut encore plus simplifié
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Conseiller/formateur en risques prof.
    Inscrit en
    Mars 2012
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Conseiller/formateur en risques prof.
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2012
    Messages : 41
    Points : 29
    Points
    29
    Par défaut
    Merci patricktoulon,

    Formateur et oui, mais dans un autre domaine et surtout je passe sur la partie développement de mon appli quand j'ai un peu de temps et de manière très morcelée. Quand je coince je passe à une autre partie... et puis je reviens....
    Dans quelque temps je vais essayer Windev, quand penses tu ?

    c'est vrai que mon traitement est un peu long, mais je n'ai pas trouvé pour l'instant d'autre solution.
    en sachant que ce traitement est croisé avec d'autres choix d'item.
    Et, je ne connait pas l'instruction Switch.

    je vais donc essayer tes solutions dans mon cas : filtre sur l'année et (le trimestre ou le mois) + mes autres critères de choix.

    merci encore
    A plus.

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    la fonction switch peut remplacer un select case ou même une série de if imbriqués

    mais c'est pas la seule astuce dans mon dernier exemple
    par exemple pour les mois 1 a 12 tu utilisais un select case
    moi je n'en utilise pas du tout les 2 lignes servent pour tout les mois

    en ayant ajouté un ligne pour compter le nombre de jours du mois en paramètre

    analyse bien le code il est vraiment pas compliqué
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    Membre expérimenté
    Avatar de tototiti2008
    Homme Profil pro
    Formateur/développeur
    Inscrit en
    Octobre 2008
    Messages
    747
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Formateur/développeur

    Informations forums :
    Inscription : Octobre 2008
    Messages : 747
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonsoir,

    ou alors pour moisdeb

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    moisdeb=LeTrim+(LeTrim-1)*2
    donc


  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 075
    Points
    12 075
    Billets dans le blog
    8
    Par défaut re
    oui ca coïncide mais sa serait l'induire en erreur en terme de compréhension du code

    point barre
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #20
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Bonjour Patrick..
    Juste un commentaire sur ton code :
    Pourquoi passer par une chaine de caractere pour rassembler dans une variable de type date une date dont tu as les 3 éléments jour,mois,année ? La fonction dateserial est faites pour cela et éviterais tous éventuel probléme de paramétrage excel...
    Ensuite est tu sur que tous les mois terminant un trimestre ont 31 jours?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. VBA autofilter sur plus de 20 valeurs
    Par toto92 dans le forum Excel
    Réponses: 1
    Dernier message: 02/06/2014, 09h27
  2. VBScript : AutoFilter sur une colonne Excel.
    Par ConteZero dans le forum VBScript
    Réponses: 4
    Dernier message: 24/05/2010, 14h55
  3. Et il possible de faire un autofilter sur plus de 2 variables?
    Par Esmax666 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/06/2009, 15h50
  4. AutoFilter sur date
    Par grateurs dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/11/2008, 22h32
  5. Réponses: 3
    Dernier message: 30/04/2007, 16h37

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