Bonjour.

Voici un code qui se propose de déterminer la numérotation de semaine d'une date, suivant la norme ISO 8601 et complète : semaine, année, numéro du jour dans la semaine.

A la suite d'une discussion de ce jour, il semblerait qu'on n'ait pas su trouver déjà fait et satisfaisant.

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
Sub subSemaine(ByVal LaDate As Date, ByRef An As Integer, ByRef Semaine As Integer, ByRef Jour As Integer)
'calcule année, semaine et jour d'une date, suivant norme ISO 8601
 
Dim Jour4Janv   As Integer  'jour de la semaine du 4 janvier, ce jour est en semaine 1 de l'année
Dim Jour28Dec   As Integer  'jour de la semaine du 28 dec, ce jour est en dernière semaine de l'année
Dim DateJour1   As Date     'date du 1er X de l'année, X = le jour de semaine de la date
Dim DateJourZ   As Date     'date du dernier X de l'année, X = le jour de semaine de la date
Dim i           As Integer
 
Jour = Weekday(LaDate, vbMonday)
 
Jour4Janv = Weekday(DateSerial(Year(LaDate), 1, 4), vbMonday)
DateJour1 = DateSerial(Year(LaDate), 1, 4) + Jour - Jour4Janv
 
 
Jour28Dec = Weekday(DateSerial(Year(LaDate), 12, 28), vbMonday)
DateJourZ = DateSerial(Year(LaDate), 12, 28) + Jour - Jour28Dec
 
 
'si LaDate est > DateJourZ, c'est en semaine 1 de l'année suivante
If LaDate > DateJourZ Then
    An = Year(LaDate) + 1
    Semaine = 1
 
'si LaDate est < DateJour1, c'est en dernière semaine de l'année précédente, soit la semaine du 28/12/A-1
ElseIf LaDate < DateJour1 Then
    Call subSemaine(DateSerial(Year(LaDate) - 1, 12, 28), An, Semaine, i)
 
'sinon c'est une semaine de l'année
Else
    An = Year(LaDate)
    Semaine = 1 + (LaDate - DateJour1) / 7
End If
 
End Sub
Comme toujours le point délicat est celui du test. Voici ceux que j'ai faits et leurs résultats:
'2006-01-01 correspond à 2005-W52-7
'2006-01-02 correspond à 2006-W01-1
'2006-12-31 correspond à 2006-W52-7
'2007-01-01 correspond à 2007-W01-1
'2007-12-30 correspond à 2007-W52-7
'2007-12-31 correspond à 2008-W01-1
'2008-01-01 correspond à 2008-W01-2
'2008-12-29 correspond à 2009-W01-1
'2008-12-31 correspond à 2009-W01-3
'2009-01-01 correspond à 2009-W01-4
'2009-12-31 correspond à 2009-W53-4
'2010-01-03 correspond à 2009-W53-7

SI vous trouvez des erreurs, merci de les signaler.

PGZ