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

Contribuez Discussion :

Calcul du numéro de semaine d'une date


Sujet :

Contribuez

  1. #1
    Membre éprouvé
    Inscrit en
    Août 2008
    Messages
    740
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 740
    Points : 1 045
    Points
    1 045
    Par défaut Calcul du numéro de semaine d'une date
    Bonjour,

    cette contribution est relative au calcul de la semaine pour une date donnée, cette fonction n'est pas disponible en standard dans access, en particulier dans les macro

    la norme ISO indique que la semaine 1 d'une année commence le premier lundi de l'année (ou le dimanche pour le moyen orient)
    ainsi, le dimanche 1er janvier 2017, est en fait dans la semaine 52 de l'année 2016, c'est un peu ambigu mais c'est comme ça

    donc pour calculer un numéro de semaine il y a
    - 2 paramètres: la date (bien sûr), et le premier jour de la semaine (1=dim, 2=lun, 3=mar...), en France on aura 2 par défaut
    - 2 résultats: calcul du numéro de la semaine et de l'année de la semaine

    la base ci joint propose 2 fonctions VBA (calcul de la semaine et de l'année de la semaine) et la même chose en datamacro (voir After Insert de la table)

    CalculSemaine.zip

    pour 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Public Function MS_NbWeek(prmDate As Date, Optional PremierJourSemaine As Long = 2) As Long
     
    Dim PremierJour As Date
    Dim ecart As Integer
    Dim PremierLundi As Date
    Dim PremierLundi2 As Date
     
        ' Date du 1er jour de l'année
        PremierJour = DateSerial(Year(prmDate), 1, 1)
     
        ' Ecart en jours entre le 1er lundi de l'année et le 1er janvier
        ecart = IIf(Weekday(PremierJour, PremierJourSemaine) = 1, 0, 8 - Weekday(PremierJour, PremierJourSemaine))
     
        ' Date du 1er Lundi de l'année
        PremierLundi = DateAdd("d", ecart, PremierJour)
     
        ' Calcule la semaine
        If prmDate >= PremierLundi Then
            MS_NbWeek = Int((prmDate - PremierLundi) / 7) + 1
        Else
            PremierJour = DateSerial(Year(prmDate) - 1, 1, 1)
            ecart = IIf(Weekday(PremierJour, PremierJourSemaine) = 1, 0, 8 - Weekday(PremierJour, PremierJourSemaine))
            PremierLundi2 = DateAdd("d", ecart, PremierJour)
            MS_NbWeek = Int((prmDate - PremierLundi2) / 7) + 1
        End If
    End Function
     
     
     
    Public Function MS_NbWeekYear(prmDate As Date, Optional PremierJourSemaine As Long = 2) As Long
     
    Dim PremierJour As Date
    Dim ecart As Integer
    Dim PremierLundi As Date
    Dim PremierLundi2 As Date
     
        ' Date du 1er jour de l'année
        PremierJour = DateSerial(Year(prmDate), 1, 1)
     
        ' Ecart en jours entre le 1er lundi de l'année
        ' et le 1er janvier
        ecart = IIf(Weekday(PremierJour, PremierJourSemaine) = 1, 0, 8 - Weekday(PremierJour, PremierJourSemaine))
     
        ' Date du 1er Lundi de l'année
        PremierLundi = DateAdd("d", ecart, PremierJour)
     
        ' Calcule la semaine
        If prmDate >= PremierLundi Then
            MS_NbWeekYear = Year(prmDate)
        Else
            MS_NbWeekYear = Year(prmDate) - 1
        End If
    End Function

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Et merci de ta contribution.

    On peut aussi utiliser la fonction val(format(#2017-01-01#, "ww", vbMonday, vbFirstJan1)).

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

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

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 630
    Points : 14 599
    Points
    14 599
    Par défaut
    Bonsoir marot_r,
    On peut aussi utiliser la fonction val(format(#2017-01-01#, "ww", vbMonday, vbFirstJan1)).
    le souci avec cette fonction, est qu'elle renvoie 1 alors que d'après la norme ISO citée par accessisgood (il faudrait,d'ailleurs, qu'il nous précise laquelle) on devrait avoir 52 :
    la norme ISO indique que la semaine 1 d'une année commence le premier lundi de l'année (ou le dimanche pour le moyen orient)
    ainsi, le dimanche 1er janvier 2017, est en fait dans la semaine 52 de l'année 2016, c'est un peu ambigu mais c'est comme ça
    comme le montre le debug ci-dessous, les résultats sont différents :
    ?val(format(#2017-01-01#, "ww", vbMonday, vbFirstJan1))
    1
    ?MS_NbWeek(#2017-01-01#,2)
    52
    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
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    OK, j'avais raté ce détail.

    format(#2017-01-01#, "ww", vbMonday, vbFirstFullWeek). donne 52.

    Mais attention format(#2017-01-01#, "yyyy", vbMonday, vbFirstFullWeek) donne 2017
    et format(#2017-12-31#, "ww", vbMonday, vbFirstFullWeek) donne aussi 52 !

    ... bonjour la confusion :-(.

    ISO ou pas, je m'imagine mal dire à mon client que le 1er janvier est dans la 52 semaine :-).

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 630
    Points : 14 599
    Points
    14 599
    Par défaut
    ISO ou pas, je m'imagine mal dire à mon client que le 1er janvier est dans la 52 semaine :-).
    je suis complètement d'accord avec toi, surtout que je m'imagine mal le client (et l'informaticien) être au courant de toutes les normes ISO en vigueur.
    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 ?

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Animateur Qualité
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Animateur Qualité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    Est-ce qu'il est possible d'avoir le numéro de semaine français dans un champ calculé d'une table ?
    J'ai essayé différentes solutions mais apparemment access ne comprend pas les formules genre "Partdate"

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

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 630
    Points : 14 599
    Points
    14 599
    Par défaut
    Citation Envoyé par pepel64 Voir le message
    Bonjour,
    Est-ce qu'il est possible d'avoir le numéro de semaine français dans un champ calculé d'une table ?
    J'ai essayé différentes solutions mais apparemment access ne comprend pas les formules genre "Partdate"
    Bonjour,
    les champs calculés ne sont pas la panacée. Si une fonction n'apparait pas dans la liste proposée, c'est qu'elle n'est pas accessible pour ce type de champ.
    Ensuite, il faut garder à l'esprit que les tables stockent des données et qu'en principe, elle n'ont pas vocation à renvoyer des calculs, les requêtes sont faites pour cela et le font très bien. Sinon utilise Excel.

    Pour finir, le forum "Contribuez" n'est pas le bon forum pour poser une question technique mais plutôt pour proposer des solutions ou des astuces.
    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
    Futur Membre du Club
    Homme Profil pro
    Animateur Qualité
    Inscrit en
    Novembre 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Animateur Qualité
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Merci pour la réponse, je pense effectivement que je ferais le calcul dans excel, les données de la base sont destinées à y être exportées.
    Avec mes excuses pour l'erreur de rubrique.

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 630
    Points : 14 599
    Points
    14 599
    Par défaut
    Bonsoir,
    pour ceux qui se sont intéressés à la discussion et la fameuse norme ISO, il s'agit de la 8601 (sources Wikipédia) :
    https://fr.wikipedia.org/wiki/ISO_8601
    et une partie consacrée au numéro de semaine :
    https://fr.wikipedia.org/wiki/Num%C3...O_des_semaines
    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 ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    aucune des fonctions proposées dans ce fil n'est exacte, voici un algorithme conforme de Daniel Maher :
    https://blogs.office.com/en-us/2009/...bers-in-excel/

    cordialement

Discussions similaires

  1. [C#] Comment récupérer le numéro de semaine d'une date ?
    Par farfadet dans le forum Windows Forms
    Réponses: 9
    Dernier message: 17/07/2013, 16h33
  2. [AC-2003] Récupérer le numéro de semaine sur une date
    Par Snow06 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/09/2010, 16h18
  3. obtenir le numéro de semaine d'une date et vis-et-versa ?
    Par clavier12AZQSWX dans le forum Flash/Flex
    Réponses: 1
    Dernier message: 18/08/2009, 18h16
  4. Trouver le numéro de semaine d'une date
    Par sat83 dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/05/2008, 11h05
  5. Calculer le numéro de semaine d'une date
    Par chandlerbing77 dans le forum Access
    Réponses: 2
    Dernier message: 09/06/2006, 12h26

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