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 :

Filtre automatique entre deux dates [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Filtre automatique entre deux dates
    Bonjour,
    Je sais que le sujet a déjà été traiter 52 miles fois, mais je n'arrive pas à comprendre pourquoi cela ne fonctionne pas.
    J'ai fais une macro qui trie entre deux dates mais celle-ci ne fonctionne pas.
    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
    Sub Macro2Date()
     Dim Datedebut As String
     Dim Datefin As String
     Dim A As Date
     Dim B As Date
     
     Datedebut = InputBox("Entrer la date de debut au format JJ/MM/AAAA", _
     "Format jour/mois/année")
     If Datedebut = "" Then Exit Sub
     Datefin = InputBox("Entrer la date de fin au format JJ/MM/AAAA", _
     "Format jour/mois/année")
     If Datefin = "" Then Exit Sub
    If Datefin > Datedebut Then
        A = Datefin
        B = Datedebut
    Else
    : A = Datedebut
        B = Datefin
    End If
     
    If Datedebut = "" Then Exit Sub
    If Datefin = "" Then Exit Sub
    If IsDate(A) And IsDate(B) Then
     With Sheets("Base de données")
     .Range("$A$1:$BY$8").AutoFilter Field:=31, _
     Criteria1:=">=" & Format(A, "mm/dd/yyyy"), Operator:=xlAnd, _
     Criteria2:="<=" & Format(B, "mm/dd/yyyy")
     
    End With
    End If
    End Sub
    Avez vous des indication à me donnez.
    Cordialement,
    Passepartout007

  2. #2
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 071
    Points : 9 850
    Points
    9 850
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    plutôt que de formater ta date, utilise son numéro de série, en convertissant ta date via CDbl(MaDate)

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Re: qu'elle type de variable cela entraine ?
    Bonjour dans la déclaration des différentes variable que me propose tu de mettre actuellement j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     Dim Datedebut As String
     Dim Datefin As String
     Dim A As Date
     Dim B As Date
    Cela me provoque une incompatibilité de Type à l'application de :
    J'ai bien essayer
    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
    Sub Macro2Date()
     Dim Datedebut As String
     Dim Datefin As String
     Dim A As Date
     Dim B As Date
     
     Datedebut = InputBox("Entrer la date de debut au format JJ/MM/AAAA", _
     "Format jour/mois/année")
     If Datedebut = "" Then Exit Sub
     Datefin = InputBox("Entrer la date de fin au format JJ/MM/AAAA", _
     "Format jour/mois/année")
     If Datefin = "" Then Exit Sub
    If Datefin > Datedebut Then
        A = Datefin
        B = Datedebut
    Else
    : A = Datedebut
        B = Datefin
    End If
    A = CDbl(A)
    B = CDbl(B)
    MsgBox A
    If Datedebut = "" Then Exit Sub
    If Datefin = "" Then Exit Sub
    If IsDate(A) And IsDate(B) Then
     With Sheets("Base de données")
     .Range("$A$1:$BY$8").AutoFilter Field:=31, _
     Criteria1:=">=" & A, Operator:=xlAnd, _
     Criteria2:="<=" & B
     
    End With
    End If
    End Sub
    Mais cela ne fonctionne pas non plus.
    Cordialement,
    Passepartout007

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,


    Problème de format?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub ComboBox2_click()
       f.[A1].AutoFilter field:=5, _
         Criteria1:=">=" & Format(Me.ComboBox2, "mm/dd/yyyy"), Operator:=xlAnd, _
         Criteria2:="<=" & Format(Me.ComboBox3, "mm/dd/yyyy")
    End Sub
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          f.[A1].AutoFilter Field:=5, Criteria1:=">=" & CDbl(CDate(Me.ComboBox2)), Operator:=xlAnd, _
            Criteria2:="<" & CDbl(CDate(Me.ComboBox3))
    Exemples en PJ



    Boisgontier
    Fichiers attachés Fichiers attachés

  5. #5
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Salut

    Si tu veux trier des dates, laisse-les au format date, c'est le meilleur moyen

    Si tu veux les transformer en texte avant, il vaut mieux utiliser le format yyyy/mm/dd que mm/dd/yyyy car ce second format ne te permettra pas de bien trier les dates, sur plusieurs années en tout cas.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  6. #6
    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 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    bonjour
    j'ai toujours entendu dire qui etait preferable de filtrer les dates par leur valeur (long)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test()
    'date_debut = CDate(combobox2.Value)
    'date_fin = CDate(combobox3.Value)
    date_debut = CDate("01/07/2018")
    date_fin = CDate("27/10/2018")
       ActiveSheet.[A1].AutoFilter Field:=1, Criteria1:=">=" & CLng(date_debut), Operator:=xlAnd, Criteria2:="<" & CLng(date_fin)
    End Sub
    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

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Re
    Bonjour à vous deux,
    j'obtient toujours un filtre nul (aucune valeur trouvée) ... Je ne comprend pas pourquoi.

    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
    Sub Macro2Date()
     Dim Datedebut As String
     Dim Datefin As String
     Dim A As Date
     Dim B As Date
     
     Datedebut = InputBox("Entrer la date de debut au format JJ/MM/AAAA", _
     "Format jour/mois/année")
     If Datedebut = "" Then Exit Sub
     Datefin = InputBox("Entrer la date de fin au format JJ/MM/AAAA", _
     "Format jour/mois/année")
     If Datefin = "" Then Exit Sub
    If Datefin > Datedebut Then
        A = Datefin
        B = Datedebut
    Else
    : A = Datedebut
        B = Datefin
    End If
    A = CDate(A)
    B = CDate(B)
     
    If Datedebut = "" Then Exit Sub
    If Datefin = "" Then Exit Sub
    If IsDate(A) And IsDate(B) Then
     With Sheets("Base de données")
     
     .[A1].AutoFilter Field:=31, Criteria1:=">=" & CDbl(CDate(A)), Operator:=xlAnd, _
            Criteria2:="<" & CDbl(CDate(B))
     
    End With
    End If
    End Sub
    J'ai également essayer la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     With Sheets("Base de données")
    .[A1].AutoFilter Field:=31, Criteria1:=">=" & CLng(A), Operator:=xlAnd, Criteria2:="<" & CLng(B)
    End with
    Je ne comprend pas pourquoi cela ne fonctionne pas. Pourtant ma plage de cellule est bien en format date et ce que je rentre dans les InputBox corresponde bien à des dates.
    Cordialement,
    Passepartout007

  8. #8
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Salut.

    Les Exit Sub, c'est assez bof bof...

    Dans le classeur en pièce jointe, je te montre comment faire fonctionner le filtre.

    L'architecture est la suivante:
    Le userform sert uniquement à récupérer les dates bornes. Il ne fait rien d'autre. La procédure principale appelle le userform et récupère les dates bornes saisies dans celui-ci, puis applique le filtre en fonction de ces dates bornes en transformant les dates en LONG.

    Ton problème étant ici le filtrage, j'ai laissé de côté la vérification des dates au sein du formulaire de saisie, ce n'est pas le propos ici. On considère pour l'exemple que les dates ont été correctement saisies et qu'elles renvoient une période valide

    * Joe, je t'ai pour conterbalancer le -1 inexplicable
    Fichiers attachés Fichiers attachés
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Bonjour,


    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
    Sub Macro2Date()
     Datedebut = InputBox("Entrer la date de debut au format JJ/MM/AAAA", _
          "Format jour/mois/année")
     Datefin = InputBox("Entrer la date de fin au format JJ/MM/AAAA", _
          "Format jour/mois/année")
     If Datedebut <> "" And Datefin <> "" Then
        A = CDate(Datedebut)
        B = CDate(Datefin)
        If B < A Then tmp = A: A = B: B = tmp
        If IsDate(A) And IsDate(B) Then
           With Sheets("feuil1")
             .[A1].AutoFilter Field:=1, Criteria1:=">=" & CDbl(A), Operator:=xlAnd, _
                Criteria2:="<" & CDbl(B)
           End With
        End If
     End If
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  10. #10
    Expert éminent

    Homme Profil pro
    Curieux
    Inscrit en
    Juillet 2012
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2012
    Messages : 5 071
    Points : 9 850
    Points
    9 850
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    * Joe, je t'ai pour conterbalancer le -1 inexplicable

    Bonjour,

    il n'était pas si inexplicable que ça, je pensais avoir parlé de la conversion en Long, or j'ai fais du double

  11. #11
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Re
    Bonjour à vous deux,

    Merci pour ce code magnifique j'ai intégrer le vérification de date en même temps voici le code :

    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
    Sub Macro2Date() 'macro date
    'déclaration de variable
     Dim Datedebut As String
     Dim Datefin As String
     Dim A As Date
     Dim B As Date
     'Lance InputBox et attribu a datedebut la valeur rentrée
     Datedebut = InputBox("Entrer la date de debut au format JJ/MM/AAAA", _
          "Format jour/mois/année")
    'Lance InputBox et attribu a datefin la valeur rentrée
     Datefin = InputBox("Entrer la date de fin au format JJ/MM/AAAA", _
          "Format jour/mois/année")
    'Si Datedebut et date fin sont une date et qu'elles sont au format "##/##/####" alors
     If IsDate(Datedebut) And Datedebut Like "##/##/####" And IsDate(Datefin) And Datefin Like "##/##/####" Then
        A = CDate(Datedebut) ' A = DateDebut
        B = CDate(Datefin) 'B = DateDebut
        If B < A Then tmp = A: A = B: B = tmp 'Si B < A alors échnager les valeur de A et de B
        'Si A et B sont des dates alors
        If IsDate(A) And IsDate(B) Then
        ' Avec la feuille " Base de données"
           With Sheets("Base de données")
           'Faire un autofiltre colonne 31 entre la valeur A et la valeur B
             .[A1].AutoFilter Field:=31, Criteria1:=">=" & CDbl(A), Operator:=xlAnd, _
                Criteria2:="<=" & CDbl(B)
           End With
        End If
       ElseIf Datedebut = "" Or Datefin = "" Then Exit Sub 'Sinon si  Datededebut ou datefin = vide alors exit sub
       Else
        MsgBox "Format date incorrect Format à utiliser est : jj/mm/aaaa " 'Sinon MSGbox "Format date incorrect
        Macro2Date 'Relance la macro2Date
     End If
     
    End Sub
    Encore merci à vous je marque le sujet comme résolut.
    Cordialement,
    Passepartout007

  12. #12
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par joe.levrai Voir le message
    Bonjour,

    il n'était pas si inexplicable que ça, je pensais avoir parlé de la conversion en Long, or j'ai fais du double
    Ca fonctionne aussi avec cdbl (mais il y a parfois des mal lunés sur le forum qui flinguent à tout va quand on ne pense pas comme eux )

    L'important, c'est d'utiliser le numéro de série, VBA étant capricieux sur la transformation des string en date

    @ Passepartout:
    Pour éviter toute méprise, je ne saurais trop te conseiller de convertir ta saisie en date avec DateSerial plutôt qu'avec cDate
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #13
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Re
    Bonjour Pierre,

    Le DateSerial est au format ( année, mois, jour ) cependant moi je suis actuellement en format jour/mois/année ou année/mois/jours.
    un contrôle du type DateSerial(Datedebut) ne fonctionne donc pas pour ma part.
    Je comprend que cela éviterais les erreurs et je suis disposé à modifier mon code afin d'inclure ce contrôle.
    Aurais tu des propositions à m'apporter ?
    Pour l'instant le code fonctionne parfaitement.
    Cordialement,
    Passepartout007

  14. #14
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Je t'ai fourni un classeur d'exemple qui te montre comment cela fonctionne. En cliquant sur le bouton placé sur la feuille Excel, tu accéderas au formulaire dans lequel tu saisis tes dates au format jj/mm/aaaa. DateSerial transforme ces saisies textuelles en date au travers de la fonction spécifique du userform. Tu récupères donc bien des dates (et donc le format n'entre plus en ligne de compte).

    Après, justement pour éviter que le format entre à nouveau en ligne de compte lors de l'évaluation des bornes du filtre, tu utilises cLng (ou cDbl) pour bien utiliser le numéro de série. Ainsi, c'est toi qui contrôle comment le VBA doit interpréter ta saisie, du début à la fin du traitement.

    Fais fonctionner le code en pas à pas et tu verras la simplicité, et surtout la sécurité, de la démarche.

    Si tu tiens absolument à garder tes inputbox (perso, sur le plan ergonomique, ce n'est par forcément le top), tu appliques le même traitement à chaque saisie d'inputbox pour la conversion en date. Crois-moi, il est toujours préférable de travailler avec des vraies dates que tu crées avec DateSerial plutôt que de laisser VBA le faire avec des formatages douteux ou avec des fonctions qui ne te laissent pas le choix de l'interprétation de la saisie
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  15. #15
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Cas du filtre auto sur égalité 1 date

    Il semblerait que:

    [A1].AutoFilter field:=2, Criteria1:=CDbl(Dte2) ' ne fonctionne pas

    ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Private Sub b_filtre_Click()
     If Me.Dte <> "" Then
        If IsDate(Me.Dte) Then
          Dte2 = CDate(Dte)
          '[A1].AutoFilter field:=2, Criteria1:=CDbl(Dte2)   ' ne fonctionne pas
          [A1].AutoFilter field:=2, Criteria1:=Format(Dte2, "dd/mm/yyyy")
       End If
     End If
    End Sub
    Boisgontier
    Fichiers attachés Fichiers attachés

  16. #16
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par boisgontierjacques Voir le message
    Cas du filtre auto sur égalité 1 date[...]
    D'où sort il, ce code?

    Faudra qu'on m'explique à quoi sert une gesticulation de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If IsDate(Me.Dte) Then
          Dte2 = CDate(Dte)
    Si Dte est une date, CDate(Dte) ne sert à rien. Déjà, pourquoi Me.Dte sur la ligne du If et Dte sans Me. sur la ligne d'affectation? Ou alors, il y a une variable Dte à l'intérieur de la proc et qui est différente de Me.Dte, ce qui amènerait le code à tester une chose puis à en utiliser une autre. Il serait intéressant d'avoir le code complet de la procédure et pas un extrait non significatif, car ici on ne sait même pas à quoi se réfère Me.

    A partir de là, le reste du code, qu'on n'a jamais vu ailleurs dans la discussion, est aussi sujet à caution.

    J'ai donné un code dans mon fichier qui fonctionne avec CLng comme avec CDbl, sur base d'un fichier de plus de 700 lignes générées aléatoirement et j'obtenais le filtre souhaité. Il suffit de s'appuyer sur ce modèle, qui expose en plus une architecture qui découpe le code en fonctions à responsabilité unique, au lieu d'un "grand machin" qui fait tout, mais le fait mal.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #17
    Membre régulier
    Homme Profil pro
    Ingénieur maintenance industriel
    Inscrit en
    Juin 2018
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur maintenance industriel
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2018
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Re
    Bonjour,

    Effectivement le contrôle dans le fichier fonctionne très biens. Je l'adapterais au mien le moment voulu.

    Encore merci pour votre aide, cordialement.
    Passepartout007

  18. #18
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Septembre 2013
    Messages
    1 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 1 369
    Points : 2 156
    Points
    2 156
    Par défaut
    Une conversion d'une chaine avec Cdate(chaîne) qui ne contient pas une date provoque une erreur, d'où le code

    If IsDate(Me.Dte) Then
    Dte2 = CDate(Dte)

    Boisgontier

  19. #19
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 955
    Points
    55 955
    Billets dans le blog
    131
    Par défaut
    Ben oui, mais isdate("05/25/2018") renverra aussi que c'est une date valide (pour VBA) alors que pour nous, ça ne l'est pas. C'est pour cela qu'il ne faut jamais faire ce genre de tests. C'est tout simplement casse-gueule, comme dans les cas suivants ou VBA agit différemment selon ce qu'il interprète sans te laisser le choix:

    Month(CDate("05/25/2018"))renvoie 5 car VBA considère la date au format mm/dd/yyyy, puisqu'il ne peut pas la considérer au format dd/mm/yyyy.
    Month(CDate("05/12/2018"))renvoie 12 car VBA considère la date au format dd/mm/yyyy sur le continent, mais la considérera au format mm/dd/yyyy et renverra 5 sur des Windows anglo-saxons. Assez casse-gueule, ce genre de truc.

    C'est pour cela que je dis qu'il faut travailler avec la valeur des dates (qui sont des valeurs numériques) et pas avec une chaine représentant une date.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  20. #20
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Pour compléter les propos de Pierre un simple numérique retournera true.

    if isdate(5) then

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

Discussions similaires

  1. Filtre entre deux dates
    Par Christ79 dans le forum VBA Access
    Réponses: 18
    Dernier message: 01/06/2012, 09h39
  2. Probleme avec un filtre entre deux dates
    Par roubase dans le forum Bases de données
    Réponses: 6
    Dernier message: 13/03/2012, 11h58
  3. Fonction Calcul automatique de nombre de jours ouvrable entre deux dates
    Par KiMbOoO dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/04/2011, 10h23
  4. [SPS07] Comment faire un filtre entre deux dates ?
    Par Tybo34 dans le forum Développement Sharepoint
    Réponses: 11
    Dernier message: 23/07/2010, 10h42
  5. [ADO Table] Filtre entre deux dates
    Par aliwassem dans le forum Bases de données
    Réponses: 3
    Dernier message: 22/04/2007, 13h36

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