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

Excel Discussion :

Bug Fonction Datepart Semaine 53-2019 [XL-2010]


Sujet :

Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Bug Fonction Datepart Semaine 53-2019
    Bonjour,

    A priori, je viens de tomber sur un bug dans la fonction Datepart : pour la date du 30/12/2019, elle nous affiche un beau Semaine 53 !
    Elle reprend ensuite son fonctionnement normal.

    A moins que je ne me trompe ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Sub test()
        dtDebut = #12/25/2019#
        For j = 1 To 10
            dtJour = DateAdd("d", j, dtDebut)
            Debug.Print dtJour & " - Jour : " & DatePart("w", dtJour, vbMonday, vbFirstFourDays); " - Semaine : " & DatePart("ww", dtJour, vbMonday, vbFirstFourDays)
        Next j
    End Sub
    Quelqu'un pour confirmer le bug ? ou m'indiquer où je me trompe ?
    MFM

  2. #2
    Expert éminent sénior

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

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

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

    Ce sera à la fois la semaine 53 de 2019 et la semaine 1 de 2020.

    Selon le mode de calcul utilisé, Excel privilégie l'une ou l'autre option

  3. #3
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selon le mode de calcul utilisé, Excel privilégie l'une ou l'autre option
    Si je peux me permettre, Excel ne privilégie ni 2019 ni 2020 puisque il donne les 2, il n'attribue la semaine 53 que sur 1 seul jour au lieu de la semaine complète, d'autant plus que la semaine 53 en 2019 n'existe pas.

    Cdlt

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Les parametres détermienent le type de calcul.
    Merci pour vos remarques.

    78chris : Les paramètres vbMonday et vfFirstFourdays déterminent complètement le mode de calcul : ils correspondent aux No semaine du système ISO.

    En plus, un seul jour en S-53, ce serait plutôt louche comme le dit Arturo83.

    Cdt

  5. #5
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Février 2010
    Messages : 8 495
    Points : 16 407
    Points
    16 407
    Par défaut
    RE

    Effectivement le 31/12 devrait aussi être en S53 mais la semaine 52 se terminant le 29/12, il y a bien une semaine 53 en 2019 (légalement on n'arrête pas l'année avant le 31/12)

    Quand je parlais des modes de calcul , je parlais des diverses solutions Excel pour calculer la semaine par seulement de la fonction VBA DatePart...

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    J'ai fait le test depuis l'année 1900 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Sub tagada2()
        Dim Dte     As Date
        Dim i       As Integer
        Dim i2      As Integer
     
        i2 = 1900
        For i = 1900 To 2050
            Dte = DateSerial(i, 12, 30)
            If DatePart("ww", Dte, vbMonday, vbFirstFourDays) = 53 Then
                Debug.Print Dte & " - " & DatePart("ww", Dte, vbMonday, vbFirstFourDays) & " - " & DatePart("w", Dte, vbMonday, vbFirstFourDays) & " - Delta=" & i - i2
                i2 = i
            End If
        Next
    End Sub
    Ce phénomène arrive avec un cycle de 6 ans, 6 ans, 5 ans, 6 ans, 4 ans, 1 an, etc...

    Vincent.

  7. #7
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Tant qu'on y est, je crois avoir trouvé un autre bug dans excel

    le 1 janv 1900 commence un lundi (d'après certains sites, j'étais pas là pour le vérifier) or avec la formule Excel "=TEXTE("01/01/1900";"jjjj") renvoie "dimanche"

    De plus Excel considère 1900 comme une année bissextile donc avec le 29 fev 1900, date qui n'existe pas puisque 1900 n'est pas bissextile (pas divisible par 400).

    Bizarre

  8. #8
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Février 2010
    Messages : 8 495
    Points : 16 407
    Points
    16 407
    Par défaut
    RE tous

    Oui le bug de 1900 est connu.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Bonjour à tous.

    Apparemment, pas d'erreur de ma part : c'est bien un bug qui se produit tous les 4 ou 12 ans et systématiquement pour le lundi.

    En prenant la norme ISO, j'ai testé pour les années 1900 à 2100 comme STRprog les conditions suivantes :
    - le jour est soit le 29/12, soit le 30/12, soit le 31/12
    - le jour est soit un lundi pour le 29/12, soit un lundi ou un mardi pour le 30/12, soit un lundi ou un mardi ou un mercredi pour le 30/12
    - le no de semaine pour ce jour est le 53

    Si je résume : DatePart("ww", Dte, vbMonday, vbFirstFourDays) renvoie comme no de semaine 53 au lieu de 1 pour les dates suivantes :
    1907/12/30
    1919/12/29
    1923/12/31
    1935/12/30
    1947/12/29
    1951/12/31
    1963/12/30
    1975/12/29
    1979/12/31
    1991/12/30
    2003/12/29
    2007/12/31
    2019/12/30
    2031/12/29
    2035/12/31
    2047/12/30
    2059/12/29
    2063/12/31
    2075/12/30
    2087/12/29
    2091/12/31

    Le code utilisé :

    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
     
     
    Public Sub Test4()
        i2 = 1900
        For i = 1900 To 2100 'années
            For k = 29 To 31 '29, 30 ou 31 décembre
                Dte = DateSerial(i, 12, k)
                intNoSem = DatePart("ww", Dte, vbMonday, vbFirstFourDays)
                intNoJour = DatePart("w", Dte, vbMonday, vbFirstFourDays)
                If intNoSem = 53 Then
                    If (k = 29 And intNoJour = 1) _
                        Or (k = 30 And (intNoJour = 1 Or intNoJour = 2)) _
                        Or (k = 31 And (intNoJour = 1 Or intNoJour = 2 Or intNoJour = 3)) Then
     
                        'Debug.Print Dte & " - " & DatePart("ww", Dte, vbMonday, vbFirstFourDays) & " - " & DatePart("w", Dte, vbMonday, vbFirstFourDays) & " - Delta=" & i - i2
                        Debug.Print Format(Dte, "yyyy/mm/dd") & " - " & DatePart("ww", Dte, vbMonday, vbFirstFourDays) & " - " & DatePart("w", Dte, vbMonday, vbFirstFourDays) & " - Delta=" & i - i2
     
                        i2 = i
                    End If
                End If
            Next k
        Next i
    End Sub
    Merci pour votre participation.

  10. #10
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Février 2010
    Messages : 8 495
    Points : 16 407
    Points
    16 407
    Par défaut
    RE

    Il n'y a pas d'erreur de ta part mais la semaine 53 existe bien certaines années (24 cas de 1903 à 2015).

    Mais datepart devrait l'attribuer à plusieurs jours et non à un seul si ce n'est pas le 31/12

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Tout à fait 78chris : certaines années, il y a bien des semaines 53.

    Elles sont légitimes compte tenu de la norme ISO (elles contiennent moins de 4 jours de la nouvelle année) et Datepart les calcule bien.

    Le bug de 2019 tombe mal car, pour un client, j'utilise les dates des lundi et Datepart pour calculer les No des semaines ...
    Il va falloir que je patche mon code pour cette année ...

    Cordialement
    Marc

  12. #12
    Expert confirmé
    Homme Profil pro
    Electrotechnicien
    Inscrit en
    Juillet 2016
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Electrotechnicien

    Informations forums :
    Inscription : Juillet 2016
    Messages : 3 240
    Points : 5 655
    Points
    5 655
    Par défaut
    Bonjour,

    Utilisez une autre fonction

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function N°Sem(d As Date) As Long
        Application.Volatile True
        d = Int(d)
        N°Sem = DateSerial(Year(d + (8 - Weekday(d)) Mod 7 - 3), 1, 1)
        N°Sem = ((d - N°Sem - 3 + (Weekday(N°Sem) + 1) Mod 7)) \ 7 + 1
    End Function
    Cdlt

  13. #13
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Février 2010
    Messages : 8 495
    Points : 16 407
    Points
    16 407
    Par défaut
    RE

    En formule j'utilise NO.SEMAINE avec second paramètre à 21 ou NO.SEMAINE.ISO et cela donne correctement 53 sur tous les jours au delà de la semaine 52 seulement si le 31/12 est un jeudi ou plus, sinon 1

    Vérification faite, selon Wikipedia, la norme ISO numérote des semaines entières et Excel semble effectivement l'appliquer sur ces formules, que tu peux donc utiliser avec WorksheetFunction.

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci pour les solutions proposées.

    je viens de tester WorksheetFunction.WeekNum(...., 21) dans le code de Test4 ci-dessus et le bug ne se produit pas.

    J'étais pourtant persuadé depuis longtemps que No.Semaine était une version arrangée et compilée de Datepart !
    Comme quoi, on en apprend tous les jours, même après 20 ans d'Excel !

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

Discussions similaires

  1. [E-07] Fonction NO.SEMAINE (WEEKNUM en 2003)
    Par ALINE85 dans le forum Excel
    Réponses: 2
    Dernier message: 14/01/2009, 11h51
  2. [Dates] Bug fonction date()
    Par BlacKou dans le forum Langage
    Réponses: 3
    Dernier message: 30/11/2007, 11h50
  3. [bug] fonction displayArray
    Par Dunstan dans le forum C++
    Réponses: 4
    Dernier message: 02/09/2007, 10h34
  4. Support sur fonction DatePart
    Par Mendes dans le forum Access
    Réponses: 2
    Dernier message: 24/07/2006, 13h35
  5. Fonction DatePart() buggée au 01/01/2006 ?
    Par infosorome dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 28/11/2005, 18h10

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