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

VBA Access Discussion :

La galère des dates! pourquoi le 30/11/2016 est supérieur au 28/06/2018


Sujet :

VBA Access

  1. #1
    Membre habitué Avatar de Gabrieel
    Profil pro
    Inscrit en
    juin 2004
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : juin 2004
    Messages : 186
    Points : 176
    Points
    176
    Par défaut La galère des dates! pourquoi le 30/11/2016 est supérieur au 28/06/2018
    Bonjour,

    je sais qu'il y a beaucoup de tuto qui circulent sur le site ou sur le net, mais je ne m'en sort pas a cause des histoires d'inversion et autre

    soit ma fonction de formatage de date
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function DtUs(ByVal dDate)
        DtUs = format(CDate(dDate), "mm/dd/yyyy")
    End Function
    voici mon 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
    34
    35
    36
    37
    38
    39
    Public Function DelaiStkRBLMois(ByVal dDebPer As Date, ByVal dFinPer As Date, ByVal dSTK_TGC As Date, ByVal dDtIn As Date, ByVal dDtOut As Date, Optional ByVal sProprio As String) As Long
    'D'abord on elimine les vehicules sortie TGC rentré une deuxieme fois
            Dim dDeb, dFin  As Date
            If sProprio = "BCD000377" Or sProprio = "BCD060377" Or sProprio = "BCD000679" Or sProprio = "BCD060679" Or sProprio = "BCD000517" Or sProprio = "BCD000589" Or sProprio = "BCD060589" Or sProprio = "BCD000585" Or sProprio = "BCD000590" Or sProprio = "BCD060585" Or sProprio = "BCD060590" Then
                    DelaiStkRBLMois = 0
            Else
                'Borne Inférieur
                If DtUs(dDtIn) > DtUs(dDebPer) Then
                dDeb = DtUs(dDtIn)
                Else
                dDeb = DtUs(dDebPer)
                End If
                Debug.Print dDeb
                'Borne Supérierur
                If DtUs(dDtOut) < DtUs(dFinPer) Then
                    If DtUs(dSTK_TGC) < DtUs(dDtOut) And DtUs(dSTK_TGC) > DtUs(dDeb) Then
                    dFin = DtUs(dSTK_TGC)
                    Else
                    dFin = DtUs(dDtOut)
                    End If
                Else
                    If DtUs(dSTK_TGC) < DtUs(dFinPer) Then
                    dFin = DtUs(dSTK_TGC)
                    Else
                    dFin = DtUs(dFinPer)
                    End If
                End If
                Debug.Print dFin
                'Calcul
                'If DateDiff("d", dDeb, dFin) < 0 Then
                '     DelaiStkRBLMois = 0
                'Else
                    DelaiStkRBLMois = DateDiff("d", DtUs(dDeb), DtUs(dFin))
                    If DelaiStkRBLMois < 0 Then
                    DelaiStkRBLMois = 0
                    End If
                'End If
            End If
    End Function
    évidement quand je calcule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ?DelaiStkRBLMois(#01/06/2018#, #30/06/2018#, #16/10/2017#, #30/11/2016#, #28/06/2018#,"651000517")
    il donne 575 jours car il considère que le 30/11/2016 est supérieur au 01/06/2018 et donc le substitut a la date de début de période

    franchement la je coince je n'ai aucune idée pourquoi il considère le 30/11/2016 comme supérieur au 01/06/2018 même en considérant qu'il fasse l'inversion!

    voyez vous une piste? au bord du craquage votre aide sera particulièrement apprecié

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    novembre 2004
    Messages
    6 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : novembre 2004
    Messages : 6 963
    Points : 11 774
    Points
    11 774
    Par défaut
    Bonsoir,
    je vois deux erreurs :
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function DtUs(ByVal dDate) As Date
    sinon la fonction ne retournera pas une date et c'est certainement la cause de ton problème.
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim dDeb As Date, dFin  As Date
    Chaque variable doit être déclarée de manière univoque, dans cette ligne d'instruction :
    dDeb sera de type variant, seul dFin sera de type date
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  3. #3
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    novembre 2004
    Messages
    6 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : novembre 2004
    Messages : 6 963
    Points : 11 774
    Points
    11 774
    Par défaut
    Bonsoir,
    j'ai testé ton code et le résultat est toujours faux car la première date est ambigüe. Ce qu'il faut faire, c'est formater les dates dès qu'elles entrent dans l'environnement VBA de manière à avoir une date définitive au format US, seul format accepté dans cet environnement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ?DelaiStkRBLMois(DtUs(#01/06/2018#), DtUs(#30/06/2018#), DtUs(#16/10/2017#), DtUs(#30/11/2016#), DtUs(#28/06/2018#),"651000517")
    ' le résultat :
    01/06/2018 
    28/06/2018 
     27
    et les 2 fonctions modifiées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function DtUs(ByVal dDate) As Date
        DtUs = Format(CDate(dDate), "mm/dd/yyyy")
    End Function
    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
    Public Function DelaiStkRBLMois(ByVal dDebPer As Date, ByVal dFinPer As Date, ByVal dSTK_TGC As Date, ByVal dDtIn As Date, ByVal dDtOut As Date, Optional ByVal sProprio As String) As Long
    'D'abord on elimine les vehicules sortie TGC rentré une deuxieme fois
            Dim dDeb As Date, dFin  As Date
            If sProprio = "BCD000377" Or sProprio = "BCD060377" Or sProprio = "BCD000679" Or sProprio = "BCD060679" Or sProprio = "BCD000517" Or sProprio = "BCD000589" Or sProprio = "BCD060589" Or sProprio = "BCD000585" Or sProprio = "BCD000590" Or sProprio = "BCD060585" Or sProprio = "BCD060590" Then
                    DelaiStkRBLMois = 0
            Else
                'Borne Inférieur
                If dDtIn > dDebPer Then
                dDeb = dDtIn
                Else
                dDeb = dDebPer
                End If
                Debug.Print dDeb
                'Borne Supérierur
                If dDtOut < dFinPer Then
                    If dSTK_TGC < dDtOut And dSTK_TGC > dDeb Then
                    dFin = dSTK_TGC
                    Else
                    dFin = dDtOut
                    End If
                Else
                    If dSTK_TGC < dFinPer Then
                    dFin = dSTK_TGC
                    Else
                    dFin = dFinPer
                    End If
                End If
                Debug.Print dFin
                'Calcul
                'If DateDiff("d", dDeb, dFin) < 0 Then
                '     DelaiStkRBLMois = 0
                'Else
                    DelaiStkRBLMois = DateDiff("d", dDeb, dFin)
                    If DelaiStkRBLMois < 0 Then
                    DelaiStkRBLMois = 0
                    End If
                'End If
            End If
    End Function
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  4. #4
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 219
    Points : 52 609
    Points
    52 609
    Billets dans le blog
    114
    Par défaut
    Salut.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function DtUs(ByVal dDate)
        DtUs = format(CDate(dDate), "mm/dd/yyyy")
    End Function
    La fonction FORMAT renvoie du texte, et tu ne types pas ta fonction. Dès lors, elle renvoie du texte, et donc, "30" est bien après "28". Logique, dès lors, que "30/06/2016" soit "plus grand" que "28/02/2018"...

    Il n'est pas utile de modifier le format us d'une date pour la passer comme argument à une fonction (c'est même néfaste, en fait).

    Dans ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ?DelaiStkRBLMois(#01/06/2018#, #30/06/2018#, #16/10/2017#, #30/11/2016#, #28/06/2018#,"651000517")
    Je ne passerais pas les dates ainsi, mais en variables dates que je composerais avec DateSerial. C'est la seule façon pour éviter qu'Access ne comprenne les dates en anglais ou en français.
    "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...
    ---------------

  5. #5
    Membre habitué Avatar de Gabrieel
    Profil pro
    Inscrit en
    juin 2004
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : juin 2004
    Messages : 186
    Points : 176
    Points
    176
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Je ne passerais pas les dates ainsi, mais en variables dates que je composerais avec DateSerial. C'est la seule façon pour éviter qu'Access ne comprenne les dates en anglais ou en français.
    malheureusement en serial aussi ça ne marche pas le problème d'inversion reviens des lors qu'on est avec un mois <10 ou un jour <10

    exemple soit ma function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function DtSL(ByVal dDate As Date)
    DtSL = DateSerial(Year(dDate), Month(dDate), Day(dDate))
    End Function
    autant j'aurai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ?DtSL(#01/06/2018#)
    06/01/2018
    alors que je n'ai visiblement pas le meme resultat quand je passe au 15/06
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ?DtSL(#15/06/2018#)
    15/06/2018

  6. #6
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 219
    Points : 52 609
    Points
    52 609
    Billets dans le blog
    114
    Par défaut
    Ca ne sert à rien de désérialiser une date pour la resérialiser ensuite. Tu auras forcément le problème.

    VBA essaie, par défaut, de comprendre ta date au format mm/dd/yyyy. S'il n'y arrive pas, il va tenter de la comprendre au format dd/mm/yyyy

    Donc, ta date #01/06/2018# est comprise mm/dd/yyyy car VBA connaît cette date, le 6 janvier 2018 existe bien, et il inverse le mois et le jour par rapport à tes attentes.

    Par contre, #15/06/2018# ne peut être compris comme mm/dd/yyyy, car le 06 du 15ième mois, ça n'existe pas, donc VBA la comprend en dd/mm/yyyy et n'inverse pas les jours et les mois par rapport à tes attentes.

    Si tu crées ta date avec dateserial(2018, 6, 15), tu n'auras aucun problème.

    Manipule tes dates en tant que dates et pas en tant que texte US ou pas US. Ce sera beaucoup plus simple. Et si tu veux utiliser #../../....#, tu dois utiliser le format mm/dd/yyyy.

    Peux-tu expliquer ce que tu cherches à réaliser avec ton code? (en français, pas en VBA)
    "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...
    ---------------

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    novembre 2004
    Messages
    6 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : novembre 2004
    Messages : 6 963
    Points : 11 774
    Points
    11 774
    Par défaut
    bonjour,
    Citation Envoyé par Gabrieel Voir le message
    malheureusement en serial aussi ça ne marche pas le problème d'inversion reviens des lors qu'on est avec un mois <10 ou un jour <10

    exemple soit ma function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function DtSL(ByVal dDate As Date)
    DtSL = DateSerial(Year(dDate), Month(dDate), Day(dDate))
    End Function
    autant j'aurai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ?DtSL(#01/06/2018#)
    06/01/2018
    alors que je n'ai visiblement pas le meme resultat quand je passe au 15/06
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ?DtSL(#15/06/2018#)
    15/06/2018
    tu as encore une fois oublié de déclarer le type de la fonction DtSL: DtSL(ByVal dDate As Date) As Date sinon tu auras encore du texte en retour, car si tu ne précises pas, cela sera du Variant par défaut.

    As-tu essayé ma solution (post #3) avec tes fonctions corrigées ? Je l'ai testé et cela fonctionne très bien.
    Il faut savoir que dès lors que l'on formate une date dès le début dans VBA il n'y a plus d'ambiguïté par la suite.
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  8. #8
    Membre habitué Avatar de Gabrieel
    Profil pro
    Inscrit en
    juin 2004
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : juin 2004
    Messages : 186
    Points : 176
    Points
    176
    Par défaut
    Merci de reflechir avec moi sur ce sujet

    en fait je cherche a calculer la durée de stockage qu'a passer un véhicule dans un mois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DelaiStkRBLMois(ByVal dDebPer As Date, ByVal dFinPer As Date, ByVal dSTK_TGC As Date, ByVal dDtIn As Date, ByVal dDtOut As Date, Optional ByVal sProprio As String) As Long
    j'ai comme paramètre :
    - la période stockage bornée par les dates récupérés d'un formulaire dDebPer et dFinPer
    - la date d'entrée centre dDtIn
    - la date de sortie centre dDtOut (si il est sortie, sinon par défaut ce sera le 31/12/2999)
    - la date de bascule de l'entité a facturer a cette date le stockage est facturée a une autre entité et du coup la durée de stockage s'arrete donc a la veille

    le problème c'est qu'access cafouille qu'on a des jours ou des mois >10 et du coup mes durées de stockage sont erronées
    et je n'arrive pas a trouver la bonne methode qui lui permettrait de comprendre que le 1/06/2018 c'est le 1er Juin et pas le 6 Janvier par exemple

  9. #9
    Membre habitué Avatar de Gabrieel
    Profil pro
    Inscrit en
    juin 2004
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : juin 2004
    Messages : 186
    Points : 176
    Points
    176
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    bonjour,

    tu as encore une fois oublié de déclarer le type de la fonction DtSL: DtSL(ByVal dDate As Date) As Date sinon tu auras encore du texte en retour, car si tu ne précises pas, cela sera du Variant par défaut.

    As-tu essayé ma solution (post #3) avec tes fonctions corrigées ? Je l'ai testé et cela fonctionne très bien.
    Il faut savoir que dès lors que l'on formate une date dès le début dans VBA il n'y a plus d'ambiguïté par la suite.
    j'avais testé sans succès mais je reteste et te dis quoi

  10. #10
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    novembre 2004
    Messages
    6 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : novembre 2004
    Messages : 6 963
    Points : 11 774
    Points
    11 774
    Par défaut
    Citation Envoyé par Gabrieel Voir le message
    j'avais testé sans succès mais je reteste et te dis quoi
    il faut bien modifier l'appel de la procédure :DelaiStkRBLMois(DtUs(#01/06/2018#), DtUs(#30/06/2018#), DtUs(#16/10/2017#), DtUs(#30/11/2016#), DtUs(#28/06/2018#),"651000517")
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  11. #11
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 219
    Points : 52 609
    Points
    52 609
    Billets dans le blog
    114
    Par défaut
    A quoi sert la fonction suivante?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function DtSL(ByVal dDate As Date)
    DtSL = DateSerial(Year(dDate), Month(dDate), Day(dDate))
    End Function
    A rien. Elle reçoit une date qu'elle transforme en date. Ca ne sert à rien


    Citation Envoyé par tee_grandbois Voir le message
    [...]

    tu as encore une fois oublié de déclarer le type de la fonction DtSL: DtSL(ByVal dDate As Date) As Date sinon tu auras encore du texte en retour, car si tu ne précises pas, cela sera du Variant par défaut.[...]
    Non typée, la fonction renvoie une valeur du type qu'elle reçoit en fin de fonction. Vu qu'elle reçoit une date via DtSL, elle renverra une date. Mettre un As Date derrière pour la typer ne sert à rien non plus, même si c'est plus propre. Elle ne renverra de toute façon jamais un string

    Je pense que le problème vient des dates qui sont passées à la fonction DelaiStkRBLMois qui posent problème.

    Pourrait-on voir le code qui appelle cette fonction avec les lignes qui récupèrent les dates qui sont passées à cette fonction?
    Si tu mets un point d'arrêt à l'entrée de la fonction DelaiStkRBLMois, quelles sont les dates passées à cette fonction? Sont-elles correctes?
    "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...
    ---------------

  12. #12
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    novembre 2004
    Messages
    6 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : novembre 2004
    Messages : 6 963
    Points : 11 774
    Points
    11 774
    Par défaut
    bonsoir Pierre,
    Non typée, la fonction renvoie une valeur du type qu'elle reçoit en fin de fonction. Vu qu'elle reçoit une date via DtSL, elle renverra une date. Mettre un As Date derrière pour la typer ne sert à rien non plus, même si c'est plus propre. Elle ne renverra de toute façon jamais un string
    et pourtant .... le variant retournera une date formatée entre apostrophes, si tu regardes bien les variables locales DtUS, n'a pas la même valeur.

    Déclarée en type date:
    Nom : DateUS1.JPG
Affichages : 109
Taille : 45,9 Ko

    et en variant :

    Nom : DateUS2.JPG
Affichages : 114
Taille : 45,8 Ko
    dans les 2 cas la date retournée est bien 01/06/2018 MAIS en variant VBA va la traiter comme du texte et chercher à la traduire de nouveau ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  13. #13
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 219
    Points : 52 609
    Points
    52 609
    Billets dans le blog
    114
    Par défaut
    Bonsoir tee...

    Il faut comparer ce qui est comparable et bien voir de quoi on parle

    D'abord, je parlais de dtSL et pas de dtUS... et dans cette fonction, on utilisait DateSerial qui renvoie une date

    Dans dtUS non typé, tu utilises FORMAT qui renvoie du texte, donc c'est normal que dtUS renvoie du texte.

    Pour faire les calculs d'écarts de date, il ne faut pas jouer avec Format, mais utiliser les dates telles que saisies dans la table, et alors, on n'a aucun problème de date (si les dates sont bien stockées comme dates dans les tables), et en aucun cas besoin d'utiliser la fonction dtUS qui ne peut que poser des problèmes...

    Le formatage, si besoin de formatage, ne doit intervenir qu'en toute fin de process, mais jamais au début ni durant le traitement des dates.

    La fonction typée Date dtUS suivante va inverser certaines dates. Il ne faut jamais faire ce genre de traitement sur des dates. Jamais!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Function dtUS(ByVal dDate As Date) As Date
      dtUS = Format(dDate, "mm/dd/yyyy")
    End Function
    Et comme je le disais tout à l'heure, dtSL ne sert à rien puisqu'il reçoit une date qu'il convertit en date (la même!).

    Ces deux fonctions doivent être supprimées du projet. Je le répète, on ne formate que si besoin et en toute fin de process. A l'intérieur d'Access, il n'est pas besoin de formater les dates par VBA.
    "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...
    ---------------

  14. #14
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    novembre 2004
    Messages
    6 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : novembre 2004
    Messages : 6 963
    Points : 11 774
    Points
    11 774
    Par défaut
    bonjour Pierre,
    Pour faire les calculs d'écarts de date, il ne faut pas jouer avec Format, mais utiliser les dates telles que saisies dans la table, et alors, on n'a aucun problème de date (si les dates sont bien stockées comme dates dans les tables), et en aucun cas besoin d'utiliser la fonction dtUS qui ne peut que poser des problèmes...
    Mea culpa ! tu as complètement raison.
    Citation Envoyé par Pierre Fauconnier
    Je pense que le problème vient des dates qui sont passées à la fonction DelaiStkRBLMois qui posent problème.
    C'est ce que je viens de constater. Effectivement une date stockée dans une table ne doit pas être formatée et de même si la fonction est utilisée dans une requête.
    Citation Envoyé par Gabrieel
    le problème c'est qu'access cafouille qu'on a des jours ou des mois >10 et du coup mes durées de stockage sont erronées
    et je n'arrive pas a trouver la bonne methode qui lui permettrait de comprendre que le 1/06/2018 c'est le 1er Juin et pas le 6 Janvier par exemple
    Non Access ne cafouille pas, il applique simplement un algorithme quand il reçoit une date formatée, c'est un logiciel US et de ce fait fonctionne par défaut avec le format de date US. Il ne faut pas oublier que dans Access les dates sont stockées sous la forme d'un nombre avec décimales pour les heures mais il propose des formats car c'est plus parlant qu'un nombre: par exemple si tu tapes dans la fenêtre d'exécution ?format(43286,"dd/mm/yyyy") tu obtiendras 05/07/2018. de même que: ?format(#7/5/2018#,"Fixed") donnera: 43286,00

    Donc, si on veut tester dans la fenêtre d'exécution VBA, il fautabsolument saisir les dates au format US (tout du moins celles dont les jours et les mois pourraient être inversés) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ?DelaiStkRBLMois(#06/01/2018#, #30/06/2018#, #16/10/2017#, #30/11/2016#, #28/06/2018#,"651000517")
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  15. #15
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    novembre 2003
    Messages
    18 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

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

    Informations forums :
    Inscription : novembre 2003
    Messages : 18 219
    Points : 52 609
    Points
    52 609
    Billets dans le blog
    114
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    [...]Donc, si on veut tester dans la fenêtre d'exécution VBA, il fautabsolument saisir les dates au format US (tout du moins celles dont les jours et les mois pourraient être inversés) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ?DelaiStkRBLMois(#06/01/2018#, #30/06/2018#, #16/10/2017#, #30/11/2016#, #28/06/2018#,"651000517")
    Exactement.

    Perso, pour éviter toute ambiguïté, je teste cela en créant mes dates avec DateSerial. Ainsi, je ne laisse aucune chance à VBA de comprendre une date autrement que comme j'ai envie qu'il la comprenne...
    "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...
    ---------------

Discussions similaires

  1. Réponses: 13
    Dernier message: 07/08/2008, 10h02
  2. Manipuler des dates...
    Par Ti Jen-tsie dans le forum Langage
    Réponses: 4
    Dernier message: 26/06/2003, 11h46
  3. [MCD] [MCD] Gestion des dates
    Par brionne dans le forum Schéma
    Réponses: 3
    Dernier message: 30/05/2003, 13h01
  4. Réponses: 3
    Dernier message: 19/03/2003, 15h19
  5. Fonctions de manipulation des chaines et des dates
    Par Fares BELHAOUAS dans le forum Débuter
    Réponses: 3
    Dernier message: 09/11/2002, 22h43

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