OBTENIR LE NUMERO DE SEMAINE SANS LE BOGUE DU 29 JANVIER COMPTÉ EN SEMEINE 53
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 juin 2015
-
5 févr. 2004 à 18:05
palm56
Messages postés8Date d'inscriptionmercredi 26 février 2003StatutMembreDernière intervention20 juin 2007
-
20 juin 2007 à 10:00
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
palm56
Messages postés8Date d'inscriptionmercredi 26 février 2003StatutMembreDernière intervention20 juin 20072 20 juin 2007 à 10:00
Si ça peut interesser, la fonction inverse
'Calcul la date de début de semaine en fonction d'un numéro de semaine et d'une année
Function DateSemaine(semaine, année)
Dim JourDeLAn, MonJourSem, NbresJours
JourDeLAn = CDate("01/01/" & année)
MonJourSem = Weekday(JourDeLAn, 2)
Select Case MonJourSem
Case 1
NbresJours = ((Val(semaine) - 1) * 7) + 2
Case 2
NbresJours = ((Val(semaine) - 1) * 7) + 1
Case 3
NbresJours = ((Val(semaine) - 1) * 7) + 0
Case 4
NbresJours = ((Val(semaine) - 1) * 7) + 6
Case 5
NbresJours = ((Val(semaine) - 1) * 7) + 5
Case 6
NbresJours = ((Val(semaine) - 1) * 7) + 4
Case 7
NbresJours = ((Val(semaine) - 1) * 7) + 3
End Select
DateSemaine = CDate(Day(NbresJours) & "/" & Month(NbresJours) & "/" & année)
End Function
palm56
Messages postés8Date d'inscriptionmercredi 26 février 2003StatutMembreDernière intervention20 juin 20072 20 juin 2007 à 09:56
Ceci marche nickel et est beaucoup plus clean (moins usine à gaz):
Function NumeroSemaine(Optional ByVal vDate As Variant) As Integer
NumeroSemaine = Format(vDate, "ww", vbMonday, vbFirstFourDays)
End Function
nycos62
Messages postés11Date d'inscriptionvendredi 7 mars 2003StatutMembreDernière intervention30 juillet 2007 3 sept. 2004 à 17:12
qu'elqu'un a t-il fait la fonction inverse ?
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 juin 2015 6 févr. 2004 à 16:34
exact
voici une autre correction
dat = dat.adddays((8-semain) mod 7)
n'oublie pas d'updater ton code
cs_john42
Messages postés7Date d'inscriptionlundi 5 janvier 2004StatutMembreDernière intervention 6 février 2004 6 févr. 2004 à 16:30
désolé Warny mais ton code est bogué!!!!!
si si
en fait le dimanche 4 janvier ainsi que tout les autres dimanche avec ton code sont ecalé d'une semaine!!!
ainsi le dimanche 4 janvier normalement compté en semaine 1 passe en semaine 2!!!
voici le correctif:
if semain <>1 then
dat=dat.adddays(8-semain)
else
dat=dat
end if
voila c tout bon
cs_john42
Messages postés7Date d'inscriptionlundi 5 janvier 2004StatutMembreDernière intervention 6 février 2004 6 févr. 2004 à 16:29
désolé Warny mais ton code est bogué!!!!!
si si
en fait le dimanche 4 janvier ainsi que tout les autres dimanche avec ton code sont ecalé d'une semaine!!!
ainsi le dimanche 4 janvier normalement compté en semaine 1 passe en semaine 2!!!
voici le correctif:
if semain <>1 then
dat=dat.adddays(8-semain)
else
dat=dat
end if
voila c tout bon
VBbigineure
Messages postés169Date d'inscriptionvendredi 27 septembre 2002StatutMembreDernière intervention27 février 20091 6 févr. 2004 à 15:45
Oui,
dans le titre tu parlais du 29 janvier en semaine (semeine ?) 53... ca aurait été un fameux bogue...
Mais non, c'est configurable comme l'explique bedelaitre, mais par défaut, c'est toujours le système ricain... Arg...
Y'a bien d'autres soucis pour la gestion date et heure en VB, s'en méfier surtout si son appli va être utilisée sur différents standards date et format de dates.
bedelaitre
Messages postés3Date d'inscriptionjeudi 2 octobre 2003StatutMembreDernière intervention 6 février 2004 6 févr. 2004 à 13:49
Oups me suis emmelé ... le lundi 29/12/2003 est bien en semaine 01.
par contre, dans VB, quand on récupère le numéro de semaine lié à un jour de l'année, on peut préciser la règle de calcul à appliquer.
Voir l'aide en ligne de la méthode DatePart, il existe un dernier paramètre optionnel "FirstWeekOfYearValue"
------------------------------
The FirstWeekOfYearValue argument can have one of the following settings.
Enumeration value Value Description
FirstWeekOfYear.System 0 First week of year specified in system settings
FirstWeekOfYear.Jan1 1 Week in which January 1 occurs (default)
FirstWeekOfYear.FirstFourDays 2 Week that has at least four days in the new year (complies with ISO standard 8601, section 3.17)
FirstWeekOfYear.FirstFullWeek 3 First full week in new year
------------------------
Cordialement,
Bertrand
bedelaitre
Messages postés3Date d'inscriptionjeudi 2 octobre 2003StatutMembreDernière intervention 6 février 2004 6 févr. 2004 à 13:27
Pour information,
il n'y a pas de bug du lundi 29 ....
Il existe au moins trois règles officielles pour calculer les numéros de semaine :
1/ La première semaine commence le 1er janvier
2/ La première semaine est celle qui contient le premier jeudi de l'année
3/ La première semaine commence le premier lundi (ou dimanche, je sais plus) de l'année.
La règle la plus utilisée est celle du Jeudi (c'est une règle ISO, si, si ...). Ainsi, le Lundi 29 est en semaine 53 de l'année 2003 et le Jeudi 1 est en semaine 01 de l'année 2004
Cordialement
Bertrand
cs_john42
Messages postés7Date d'inscriptionlundi 5 janvier 2004StatutMembreDernière intervention 6 février 2004 6 févr. 2004 à 10:24
Oui tu as parfaitement raison. Il faut remplacer tout le bloc if end if par dat=dat.adddays(8-weekday(dat))
Merci beaucoup Warny
cs_Warny
Messages postés473Date d'inscriptionmercredi 7 août 2002StatutMembreDernière intervention10 juin 2015 5 févr. 2004 à 18:05
pourquoi tu fait pas
dat = dat.adddays(8-weekday(dat))
il existe probablement des fonctions de la classe date pour remplacer les fonctions du vb WeekDay et DatePart
20 juin 2007 à 10:00
'Calcul la date de début de semaine en fonction d'un numéro de semaine et d'une année
Function DateSemaine(semaine, année)
Dim JourDeLAn, MonJourSem, NbresJours
JourDeLAn = CDate("01/01/" & année)
MonJourSem = Weekday(JourDeLAn, 2)
Select Case MonJourSem
Case 1
NbresJours = ((Val(semaine) - 1) * 7) + 2
Case 2
NbresJours = ((Val(semaine) - 1) * 7) + 1
Case 3
NbresJours = ((Val(semaine) - 1) * 7) + 0
Case 4
NbresJours = ((Val(semaine) - 1) * 7) + 6
Case 5
NbresJours = ((Val(semaine) - 1) * 7) + 5
Case 6
NbresJours = ((Val(semaine) - 1) * 7) + 4
Case 7
NbresJours = ((Val(semaine) - 1) * 7) + 3
End Select
DateSemaine = CDate(Day(NbresJours) & "/" & Month(NbresJours) & "/" & année)
End Function
20 juin 2007 à 09:56
Function NumeroSemaine(Optional ByVal vDate As Variant) As Integer
NumeroSemaine = Format(vDate, "ww", vbMonday, vbFirstFourDays)
End Function
3 sept. 2004 à 17:12
6 févr. 2004 à 16:34
voici une autre correction
dat = dat.adddays((8-semain) mod 7)
n'oublie pas d'updater ton code
6 févr. 2004 à 16:30
si si
en fait le dimanche 4 janvier ainsi que tout les autres dimanche avec ton code sont ecalé d'une semaine!!!
ainsi le dimanche 4 janvier normalement compté en semaine 1 passe en semaine 2!!!
voici le correctif:
if semain <>1 then
dat=dat.adddays(8-semain)
else
dat=dat
end if
voila c tout bon
6 févr. 2004 à 16:29
si si
en fait le dimanche 4 janvier ainsi que tout les autres dimanche avec ton code sont ecalé d'une semaine!!!
ainsi le dimanche 4 janvier normalement compté en semaine 1 passe en semaine 2!!!
voici le correctif:
if semain <>1 then
dat=dat.adddays(8-semain)
else
dat=dat
end if
voila c tout bon
6 févr. 2004 à 15:45
dans le titre tu parlais du 29 janvier en semaine (semeine ?) 53... ca aurait été un fameux bogue...
Mais non, c'est configurable comme l'explique bedelaitre, mais par défaut, c'est toujours le système ricain... Arg...
Y'a bien d'autres soucis pour la gestion date et heure en VB, s'en méfier surtout si son appli va être utilisée sur différents standards date et format de dates.
6 févr. 2004 à 13:49
par contre, dans VB, quand on récupère le numéro de semaine lié à un jour de l'année, on peut préciser la règle de calcul à appliquer.
Voir l'aide en ligne de la méthode DatePart, il existe un dernier paramètre optionnel "FirstWeekOfYearValue"
------------------------------
The FirstWeekOfYearValue argument can have one of the following settings.
Enumeration value Value Description
FirstWeekOfYear.System 0 First week of year specified in system settings
FirstWeekOfYear.Jan1 1 Week in which January 1 occurs (default)
FirstWeekOfYear.FirstFourDays 2 Week that has at least four days in the new year (complies with ISO standard 8601, section 3.17)
FirstWeekOfYear.FirstFullWeek 3 First full week in new year
------------------------
Cordialement,
Bertrand
6 févr. 2004 à 13:27
il n'y a pas de bug du lundi 29 ....
Il existe au moins trois règles officielles pour calculer les numéros de semaine :
1/ La première semaine commence le 1er janvier
2/ La première semaine est celle qui contient le premier jeudi de l'année
3/ La première semaine commence le premier lundi (ou dimanche, je sais plus) de l'année.
La règle la plus utilisée est celle du Jeudi (c'est une règle ISO, si, si ...). Ainsi, le Lundi 29 est en semaine 53 de l'année 2003 et le Jeudi 1 est en semaine 01 de l'année 2004
Cordialement
Bertrand
6 févr. 2004 à 10:24
Merci beaucoup Warny
5 févr. 2004 à 18:05
dat = dat.adddays(8-weekday(dat))
il existe probablement des fonctions de la classe date pour remplacer les fonctions du vb WeekDay et DatePart