Encore un problème de semaine

CyK

XLDnaute Junior
Bonjour le Forum,
Bonjour le Futur Fil,

Pour relancer un des Best Post de tous les forums parlant de programmation sur Windows, je vais vous parler de mon soucis avec le N° ISO de Semaine.

Voilà donc pour récupérer le numéro ISO d'une semaine j'utilise la fonction suivante :
Code:
Public Function NoSem(UneDate As Date) As Integer
' donne le numéro de la semaine selon la norme Européenne (1ère semaine = 1ère semaine de 4 jours)
On Error Resume Next
      NoSem = _
      CInt(Format(UneDate, 'ww', vbMonday, vbFirstFourDays))
End Function

Jusque là tout va bien mais lorsque l'on à travailler sur des analyses glissantes (genre analyse sur les x dernières semaines) il faut inclure une notion d'année pour avoir un classement croissant des semaines et ainsi par exemple avoir :
31/12/2004 = 53 ième semaine de 2004 ie 453
01/01/2005 = 53 ième semaine de 2004 ie 453
03/01/2005 = 1ère semaine 2005 ie 501
31/12/2005 = 52 ième semaine de 2005 ie 552
01/01/2006 = 52 ième semaine de 2005 ie 552
02/01/2006 = 1 ère semaine de 2006 ie 601
ce codage sur 3 chiffres de la semaine à l'avantage en étant numérique d'être simple à gérer et respecte l'ordre des semaines

D'où l'idée de faire quelques chose comme ça :
Code:
Public Function NoAnneeSem(UneDate As Date) As Integer
' donne le numéro de la semaine selon la norme Européenne (1ère semaine = 1ère semaine de 4 jours)
On Error Resume Next
      NoAnneeSem = _
      (CInt(Format(UneDate, 'yyyy', vbMonday, vbFirstFourDays)) - 2000) * 100 _
      + CInt(Format(UneDate, 'ww', vbMonday, vbFirstFourDays))
End Function

Mais évidemment dans ce cas on va avoir une erreur puisque par exemple 01/01/2005 va retourner 553 au lieu de 453.

Un idée ?
D'avance merci.
 

myDearFriend!

XLDnaute Barbatruc
Bonsoir CyK,

Peut-être peux-tu essayer avec ça :
Public Function NoAnneeSem(UneDate As Date) As Integer
Dim
N As Integer
      N = CInt(Format(UneDate, 'ww', vbMonday, vbFirstFourDays))
      NoAnneeSem = (Year(UneDate) - 2000) * 100 _
                        + N - IIf((DatePart('y', UneDate) < 5) And N > 1, 100, 0)
End Function
Cordialement,
 

CyK

XLDnaute Junior
Merci Didier, cela fonctionne, mais je me suis rendu compte d'une chose
Code:
CInt(Format(UneDate, 'ww', vbMonday, vbFirstFourDays))
pour par exemple le 31/12/2008
me donne 1. Effectivement le 1/1/2009 est un jeudi, donc d'après ce que j'ai pu lire concernant la norme ISO sur les N° de semaine la semaine du 29/12/2008 au 04/01/2009 est la première semaine de 2009 , c'est la première semaine contenant un jeudi? Quelqu'un peut me confirmer ? et donc si c'est cela la fonction de Didier devrait me retourner pour le 31/12/2008 le chiffre 901 et là elle me donne 801.
 

myDearFriend!

XLDnaute Barbatruc
Bonsoir CyK,

Tu as tout à fait raison CyK, la semaine du 29/12/2008 au 04/01/2009 est la première semaine de 2009 et je n'avais pas pleinement penser à ce cas de figure dans le code que je te présentais...

Tu peux peut-être tester cette solution cette fois :
Public Function NoAnneeSem(UneDate As Date) As Integer
Dim
NS As Byte, NJ As Integer
        NS = CInt(Format(UneDate, 'ww', vbMonday, vbFirstFourDays))
        NJ = DatePart('y', UneDate)
        NoAnneeSem = (Year(UneDate) - 2000) * 100 _
                                    + NS + IIf(NS > 1, IIf(NJ < 5, -100, 0), IIf(NJ > 362, 100, 0))
End Function
Cordialement,
 

CyK

XLDnaute Junior
Absolument parfait, encore merci Didier, je m'en vais de ce pas l'enregister dans ma petite bibliothèque de fonction ;) . Et me baser sur le principe pour me faire la même chose dans mes bib SQL. Me voilà tranquille jusqu'en 2999 ;)
 

Discussions similaires

Réponses
3
Affichages
901

Statistiques des forums

Discussions
312 337
Messages
2 087 392
Membres
103 534
dernier inscrit
Kalamymustapha