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

crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 - 3 août 2004 à 10:36
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 22 mars 2009 à 23:17
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 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 mars 2009 à 23:17
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
22 mars 2009 à 15:01
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
8 oct. 2008 à 14:48
Merci pour le code Renfield, très utile et testé avec succès.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 janv. 2008 à 10:24
EBartSoft, et moi même avons également déposé des Snippets qui pourraient t'être utile
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 janv. 2008 à 10:21
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
3 janv. 2008 à 19:35
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 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
3 janv. 2008 à 12:03
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
3 janv. 2008 à 11:44
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 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
22 juin 2006 à 16:20
é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
22 juin 2006 à 14:56
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
26 mai 2005 à 14:35
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 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
23 oct. 2004 à 12:13
- 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 26
23 oct. 2004 à 11:10
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 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 août 2004 à 20:02
typename ( DatePart("ww",D) ) -> Integer
typename ( Format(Date, "ww")) -> String
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
4 août 2004 à 18:08
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 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
4 août 2004 à 18:03
Moi je parlais d'exactitude dans le n° de semaine retourné...
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 août 2004 à 16:57
meilleur, je sais pas, je fait part de ma preference....

Format$ renvoyant un String....
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
4 août 2004 à 15:10
Oui mais cela ne me dit pas en quoi DatePart serait meilleur que Format$(Date, "ww").
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 août 2004 à 14:58
j'utiliserai DatePart également, plutot que Format (Date , "WW" )
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
4 août 2004 à 14:51
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 28
3 août 2004 à 15:06
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
3 août 2004 à 14:35
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 28
3 août 2004 à 11:47
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
3 août 2004 à 11:35
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 28
3 août 2004 à 10:36
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
Rejoignez-nous