NUMÉRO DE LA SEMAINE : SANS LES BUGS DE LA SEMAINE 53 ET DU 29/12 (TESTÉ ET VÉRI

Signaler
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
-
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/25113-numero-de-la-semaine-sans-les-bugs-de-la-semaine-53-et-du-29-12-teste-et-verifie

Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
sub
function
...
end function
end sub

ca peut pas etre imbriqué...
jodeciters
Messages postés
7
Date d'inscription
vendredi 26 décembre 2008
Statut
Membre
Dernière intervention
16 mars 2009

Bonjour
je cherche également à obtenir un numéro de semaine dans une suite de dates en colonne.
Je programme ci-dessous que j'ai trouvé à plusieurs reprises dans des forums semble est correct.

Function NOSEM(D As Date) As Long
D = Int(D)
NOSEM = DateSerial(Year(D + (8 - WeekDay(D)) Mod 7 - 3), 1, 1)
NOSEM = ((D - NOSEM - 3 + (WeekDay(NOSEM) + 1) Mod 7)) \ 7 + 1
End Function

Mon souci est que je ne sais pas le mettre en oeuvre. Lorsque je tâche de l'exécuter, j'ai un message d'erreur du type "end sub attendu"

voici le code que j'ai tenté de faire :
Sub sen()

Function num_sem(D As Date) As Long

D = Range("A2").Value 'pour exemple A2 indique une date

num_sem = DateSerial(Year(D + (8 - Weekday(D)) Mod 7 - 3), 1, 1)
num_sem = ((D - num_sem - 3 + (Weekday(num_sem) + 1) Mod 7)) \ 7 + 1
End Function

End Sub

merci de votre aide
cs_orwen
Messages postés
1
Date d'inscription
vendredi 13 janvier 2006
Statut
Membre
Dernière intervention
8 octobre 2008

Merci pour le code Renfield, très utile et testé avec succès.
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
EBartSoft, et moi même avons également déposé des Snippets qui pourraient t'être utile
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
ok, ok,

Gobillot semble avoir prévu ce soucis :
http://www.codyx.org/snippet_recuperer-numero-semaine_61.aspx#401

testé avec mon code, issu du descriptif fournis sur le site wikipedia
http://fr.wikipedia.org/wiki/ISO_8601#Num.C3.A9ro_de_semaine
chatissimus
Messages postés
2
Date d'inscription
dimanche 8 août 2004
Statut
Membre
Dernière intervention
3 janvier 2008

Le soucis ?

prends n'importe quel calendrier avec la numérotation des semaines, tu le verras.

une semaine a un numéro et une année d'appartenance. cette numérotation est unique et normalisée.
la semaine 1 de l'année X est la première semaine comprenant le 4 janvier de l'année X.

si on s'en tient aux fonctions vba la semaine du 31/12/2007 au 6/1/2008 est la semaine 53 de l'année 2007 si on est le 31/12, et la semaine 1 de l'année 2008 si on est après le 1/1/2008.
La même semaine a deux numérotations...
et de toute façon il n'existe pas de semaine 53 dans l'année 2007.

(C'est pas moi qui le décide, c'est la ISO 8601 si tu veux de la lecture ;-) )
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
le dernier jour de l'annnée n'est pas en semaine 1 ...

où est le soucis ?
chatissimus
Messages postés
2
Date d'inscription
dimanche 8 août 2004
Statut
Membre
Dernière intervention
3 janvier 2008

En utilisant
Format(Date, "ww", vbMonday, vbFirstFourDays)
ou
DatePart("ww",Date,vbMonday,vbFirstFourDays)

j'obtiens semaine 53 pour le #31/12/2007# au lieu de semaine 1

le code donné sort bien la semaine 1

(en même temps c'est du vba sous Access 97 ;-) ceci explique peu etre cela )
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
étrange, chez moi c'est correct...

? DatePart("ww",#01/01/05#)
1

à noter que la fonction DatePart possède en outre deux parametres FirstDayOfWeek et FirstWeekOfYear...
blarcheres
Messages postés
2
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
22 juin 2006

Contrairement à ce qu'on dit les autres, les autres, ce code :
Public function NumeroSemaine(ByVal D as Date) As Integer
     NumeroSemaine = DatePart("ww",D)
End Function

est certe bien plus simple mais ne donne pas de bon résultats pour certains jours comme le 01/01/2005 qui tombe la semaine
31 et non pas la semaine 1.
Morricon
Messages postés
41
Date d'inscription
lundi 23 décembre 2002
Statut
Membre
Dernière intervention
1 mars 2007

Oups !

C'est normal que la fonction : NumeroJourJulien renvoi un resultat comme celui-ci : 2453371,5 ?

J'ai moi-même écrit des fonctions de calcul numéro semaine, et je n'obtient pas ce type de résultat !!!??

J'avoue ne pas comprendre !
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
- si on traduit cette source en asm ou C et que l'on en fait une dll appellé par VB...ca sera beaucoup plus rapide que les fonctions de VB (surtout en cas d'appel fréquents...)

c'est valable pour bon nombre de sources, tu sais.....
ShareVB
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
13
salut

c bien de dire que le code a été copier-coller depuis vbfrance et d'ailleurs depuis ma source qui cela dit est effectivement bien compliquée et dont le résultat est le même que la m..tienne lol...
http://www.vbfrance.com/code.aspx?id=5253

pour ceux qui doutent de l'utilité de ce code, deux chose à dire :
- si on traduit cette source en asm ou C et que l'on en fait une dll appellé par VB...ca sera beaucoup plus rapide que les fonctions de VB (surtout en cas d'appel fréquents...)
- et de plus avec la date julienne, on peut calculer les saisons, les quartiers de lune, des éclipses et bien d'autres choses...

ShareVB
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
typename ( DatePart("ww",D) ) -> Integer
typename ( Format(Date, "ww")) -> String
Neo.balastik
Messages postés
797
Date d'inscription
jeudi 17 mai 2001
Statut
Membre
Dernière intervention
5 mai 2009
4
Pour info :
VarType(Format$(Date, "ww"))
retourne 8, cad que Format$ serait de type STRING...

Mais Format sans le signe $ est bien de type Variant.
Neo.balastik
Messages postés
797
Date d'inscription
jeudi 17 mai 2001
Statut
Membre
Dernière intervention
5 mai 2009
4
Moi je parlais d'exactitude dans le n° de semaine retourné...
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
meilleur, je sais pas, je fait part de ma preference....

Format$ renvoyant un String....
Neo.balastik
Messages postés
797
Date d'inscription
jeudi 17 mai 2001
Statut
Membre
Dernière intervention
5 mai 2009
4
Oui mais cela ne me dit pas en quoi DatePart serait meilleur que Format$(Date, "ww").
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
61
j'utiliserai DatePart également, plutot que Format (Date , "WW" )
Neo.balastik
Messages postés
797
Date d'inscription
jeudi 17 mai 2001
Statut
Membre
Dernière intervention
5 mai 2009
4
En ce qui me concerne, j'ai tjs utilisé la façon de faire suivante pour trouver le n° de la semaine selon une date :

MsgBox Format$(Date, "ww")

Est-ce buggé selon des cas bien précis ?
crenaud76
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
19
Tiens !! Je connaissais pas DatePart() !!
Stephle
Messages postés
10
Date d'inscription
lundi 17 mars 2003
Statut
Membre
Dernière intervention
3 août 2004

Encore plus fort, et dans le meme genre que crenaud76:
Public function NumeroSemaine(ByVal D as Date) As Integer
     NumeroSemaine = DatePart("ww",D)
End Function


Faut pas se prendre la tete quand des fonctions comme DateDiff() ou DatePart() existent déjà...
crenaud76
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
19
Pour info : De l'eau chaude + de l'eau froide, ca donne de l'eau tiède !!!
juvamine
Messages postés
468
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
30 août 2007
2
j'ai la meme version que Christophe ^^

tu t'ai bien compliqué la vie je crois !!

a+
juva
crenaud76
Messages postés
4172
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
9 juin 2006
19
Sans voulori être méchant, voici ma version de ton code:
Public Function NumeroSemaine(ByVal D As Date) As Integer
    NumeroSemaine = DateDiff("ww", "01/01/" & CStr(Year(D)), D, vbMonday, vbFirstJan1) + 1
End Function