OVH Cloud OVH Cloud

Fonction numéro de semaine (pas classique)

6 réponses
Avatar
pierref
Bonjour,

Je voudrai mettre en place une fonction un peu spéciale.

Paramètre reçue : numéro de semaine
Renvoie : date de début et date de fin de la semaine.

Là où ça se corse, c'est que les semaines vont du vendredi au jeudi...
En sachant que les 1ere et dernière semaines de l'année peuvent être plus
courtes ou plus longues que les autres.
Par exemple pour 2006 :
- 1ere semaine, du lundi 2 au jeudi 5 janvier.
- derniere semaine, du vendredi 22 au dimanche 31.

Si par hasard quelqu'un a déjà fait une fonction de ce genre, je suis
intéressé.
N'hésitez pas également à me donner des pistes.

Merci d'avance

Pierref

6 réponses

Avatar
Pierre CFI [mvp]
bonjour
tu pourrais faire une table de correspondance
à la limite tu fais sous excel plus facile en recopie, puis export sous access

--
Pierre CFI
MVP Microsoft Access

Site pour bien commencer
Access http://www.mpfa.info

"pierref" a écrit dans le message de news:
Bonjour,

Je voudrai mettre en place une fonction un peu spéciale.

Paramètre reçue : numéro de semaine
Renvoie : date de début et date de fin de la semaine.

Là où ça se corse, c'est que les semaines vont du vendredi au jeudi...
En sachant que les 1ere et dernière semaines de l'année peuvent être plus
courtes ou plus longues que les autres.
Par exemple pour 2006 :
- 1ere semaine, du lundi 2 au jeudi 5 janvier.
- derniere semaine, du vendredi 22 au dimanche 31.

Si par hasard quelqu'un a déjà fait une fonction de ce genre, je suis
intéressé.
N'hésitez pas également à me donner des pistes.

Merci d'avance

Pierref


Avatar
pierref
Bonjour,

Merci pour l'idée.
Je viens d'en avoir une moi aussi.
Je vais créer un formulaire dans lequel on saisit la date du premier
vendredi de l'année.
Su récupération de ce paramètres ma fonction va :
Créer la semaine du 01/01/xxxx à la date saisie
Générer les numéros de semaine en inplémentant cette date de 7 en 7.
Arreter la boucle s'il reste moins de 14 jours avant la fin de l'année et
attribuer aux jours restants un numéro de dernière semaine.

Ca devrait le faire :-)

A bientot

Pierref



bonjour
tu pourrais faire une table de correspondance
à la limite tu fais sous excel plus facile en recopie, puis export sous access

--
Pierre CFI
MVP Microsoft Access

Site pour bien commencer
Access http://www.mpfa.info

"pierref" a écrit dans le message de news:
Bonjour,

Je voudrai mettre en place une fonction un peu spéciale.

Paramètre reçue : numéro de semaine
Renvoie : date de début et date de fin de la semaine.

Là où ça se corse, c'est que les semaines vont du vendredi au jeudi...
En sachant que les 1ere et dernière semaines de l'année peuvent être plus
courtes ou plus longues que les autres.
Par exemple pour 2006 :
- 1ere semaine, du lundi 2 au jeudi 5 janvier.
- derniere semaine, du vendredi 22 au dimanche 31.

Si par hasard quelqu'un a déjà fait une fonction de ce genre, je suis
intéressé.
N'hésitez pas également à me donner des pistes.

Merci d'avance

Pierref







Avatar
david
salut,

il faut faire une fonction publique VBA dans un module pour pouvoir y
accéder dans tes formules de requêtes par exemple.
Voici un exemple de code :

Public Function myWeekLimits(ByVal numWeek As Byte) As String
Dim firstFri As Date
Dim strDt As Date, endDt As Date
Dim n As Byte

firstFri = DateSerial(Year(Date), 1, 1) 'Prendre le 01/01
de l'année
firstFri = firstFri - Weekday(firstFri) + 6 'Y enlever le
numéro du jour puis y ajouter le n° de vendredi
If Year(firstFri) < Year(Date) Then firstFri = firstFri + 7 'Si
on a changer d'année, ajouter une semaine
'maintenant firstFri vaut le 1° vendredi de l'année en cours

strDt = DateSerial(Year(Date), 1, 1) '1° semaine =>
commence toujours au 1° janvier
endDt = firstFri - 1 '1° semaine => se
termine toujours au 1° jeudi
n = numWeek 'On commence avec le
numWeek demandé
Do Until n = 1 'On arrête à 1
n = n - 1 'Il reste une
semaine de moins
If Weekday(strDt) <> vbFriday Then 'Si on commence
(1° jour pas forcément un vendredi)
strDt = firstFri 'Passer au 1°
vendredi
Else 'Sinon
strDt = strDt + 7 'Passer au vendredi
suivant
End If
endDt = strDt + 6 'Calculer le jeudi
suivant
Loop
If numWeek = 52 Then endDt = DateSerial(Year(Date), 12, 31) 'On
prend la dernière semaine => 31/12
myWeekLimits = Format(strDt, "dd/mm/yyyy") + " " + Format(endDt,
"dd/mm/yyyy")
End Function

david, a+
Avatar
Synopsis
Le plus simple est de créer une table calendrier

un article très très interessant sur :
http://sqlpro.developpez.com/cours/gestiontemps/

Sans rentrer dans une modélisation aussi complexe, avec une table à plat
tout simplement (dérnormalisée)

Un exemple qui gère trois calendriers :
- calendrier dit grégorien (= calendrier courant)
- calendrier dit entreprise
- calendrier dit facturation

Les cycles temporels entreprises et facturation ne correspondent toujours
pas à la réalité calendaire.
A titre personnel, en calendrier facturation je suis toujours en 2005
jusqu'à mi-janvier 2006 !!!

Calendrier :
- jour (= clef primaire)
- ferie (oui / non)
- annee_gregorien
- mois_gregorien
- semaine_gregorien
- annee_entreprise
- mois_entreprise
- semaine_entreprise
- annee_facturation
- mois_facturation
- semaine_facturation

Avec cette requête ci-dessous :

select
annee_entreprise
, mois_entreprise
, semaine_entreprise
, min(jour) jour_debut
, max(jour) jour_fin
, count(*) n
from calendrier
annee_entreprise
, mois_entreprise
, semaine_entreprise
Group by
annee_entreprise
, mois_entreprise
, semaine_entreprise

Vous obtenez la date début et la date de fin et le nombre de jours...

Reste à écrire le script pour charger la table.


Il vaut mieux "perdre" 1-2 jours à modéliser, écrire le script et charger la
table.
Vous gagnerez après en simplicité de développement.


P.S. : Vvous pouvez complexifier en distinguant le numéro
de la semaine dans le mois ou dans l'année pour chacun des calendriers

Idem avec le numero du jour dans la semaine, dans le mois, dans l'année.




"pierref" a écrit dans le message de
news:
Bonjour,

Je voudrai mettre en place une fonction un peu spéciale.

Paramètre reçue : numéro de semaine
Renvoie : date de début et date de fin de la semaine.

Là où ça se corse, c'est que les semaines vont du vendredi au jeudi...
En sachant que les 1ere et dernière semaines de l'année peuvent être plus
courtes ou plus longues que les autres.
Par exemple pour 2006 :
- 1ere semaine, du lundi 2 au jeudi 5 janvier.
- derniere semaine, du vendredi 22 au dimanche 31.

Si par hasard quelqu'un a déjà fait une fonction de ce genre, je suis
intéressé.
N'hésitez pas également à me donner des pistes.

Merci d'avance

Pierref


Avatar
Gilbert
Bonjour,

Essaye avec cette fonction
Je n'ai pas traité les début et fin d'année.

Sub essai()
Dim Ladate As Date
Dim semaine As Integer
For semaine = 1 To 57
Ladate = fPremierJourSemaine(semaine, year(Date))
Debug.Print Ladate, fStrSemaineVendredi(Ladate)
Next semaine
End Sub


Function fStrSemaineVendredi(Ladate As Date) As String
'Adaptation de la formule de Laurent Longre
'd'après http://disciplus.simplex.free.fr/xl/calendriers.htm#numerosemaine

Dim PremierJourSemaine As Date
Dim DernierJourSemaine As Date

PremierJourSemaine = IIf(Weekday(Ladate) < vbFriday, Ladate -
Weekday(Ladate) - 1, Ladate - Weekday(Ladate) + 6)
DernierJourSemaine = IIf(Weekday(Ladate) < vbFriday, Ladate -
Weekday(Ladate) + 5, Ladate - Weekday(Ladate) + 12)
fStrSemaineVendredi = "Semaine du " _
& Format(PremierJourSemaine, "dddd dd mmmm") _
& " au " _
& Format(DernierJourSemaine, "dddd dd mmmm yyyy")
End Function

Function fPremierJourSemaine(semaine As Integer, annee As Integer) As Date
Dim Datetemp As Date
Datetemp = DateSerial(annee, 1, 1) + (semaine - 1) * 7
fPremierJourSemaine = Datetemp - (Weekday(Datetemp) - vbMonday)
End Function


Gilbert



"pierref" a écrit dans le message de
news:
Bonjour,

Merci pour l'idée.
Je viens d'en avoir une moi aussi.
Je vais créer un formulaire dans lequel on saisit la date du premier
vendredi de l'année.
Su récupération de ce paramètres ma fonction va :
Créer la semaine du 01/01/xxxx à la date saisie
Générer les numéros de semaine en inplémentant cette date de 7 en 7.
Arreter la boucle s'il reste moins de 14 jours avant la fin de l'année et
attribuer aux jours restants un numéro de dernière semaine.

Ca devrait le faire :-)

A bientot

Pierref



bonjour
tu pourrais faire une table de correspondance
à la limite tu fais sous excel plus facile en recopie, puis export sous
access



--
Pierre CFI
MVP Microsoft Access

Site pour bien commencer
Access http://www.mpfa.info

"pierref" a écrit dans le message de
news:


Bonjour,

Je voudrai mettre en place une fonction un peu spéciale.

Paramètre reçue : numéro de semaine
Renvoie : date de début et date de fin de la semaine.

Là où ça se corse, c'est que les semaines vont du vendredi au jeudi...
En sachant que les 1ere et dernière semaines de l'année peuvent être
plus



courtes ou plus longues que les autres.
Par exemple pour 2006 :
- 1ere semaine, du lundi 2 au jeudi 5 janvier.
- derniere semaine, du vendredi 22 au dimanche 31.

Si par hasard quelqu'un a déjà fait une fonction de ce genre, je suis
intéressé.
N'hésitez pas également à me donner des pistes.

Merci d'avance

Pierref









Avatar
pierref
Bonjour à tous,

Merci pour votre aide !
Finalement, j'ai pris un peu des idées de chacun.

Mon besoin ayant plus ou moins évolué :
j'ai créé un formulaire où l'on saisit la date du 1er vendredi de l'année.
Puis un bouton me génère 2 tables différentes : une contenant les semaines
et leurs bornes respectives, l'autre contenant chaque date de l'année avec le
numéro de semaine associé.

Pour info voici mon code :

Private Sub CmdGenererSemaines_Click()

Dim DateDebSemaine As Date
Dim DateFinSemaine As Date

Dim DateCourante As Date

Dim NumSemaine As Integer

On Error GoTo erreur

If IsNull(TxtDateVend) Then
MsgBox "Veuillez saisir une date...", vbCritical
Exit Sub
End If

'Efface les enregistrements de la table T_Semaines
CurrentDb.Execute ("delete * from T_Semaines")
CurrentDb.Execute ("delete * from T_Semaines_Complet")

'Création de la semaine 1

NumSemaine = 1

If Day(TxtDateVend) <> 1 Then
DateDebSemaine = CDate("01/01/" & Year(TxtDateVend))
DateFinSemaine = DateAdd("d", -1, TxtDateVend)
Else
DateDebSemaine = TxtDateVend
DateFinSemaine = DateAdd("d", 3, DateDebSemaine)
End If

CurrentDb.Execute ("Insert Into T_Semaines Values" & _
"(1, #" & _
Format(DateDebSemaine, "mm/dd/yyyy") & "#, #" & _
Format(DateFinSemaine, "mm/dd/yyyy") & "#)")

'Génération des numéros de semaine pour chaque jour de l'année

DateCourante = DateDebSemaine

Do
CurrentDb.Execute ("Insert Into T_Semaines_Complet (Semaine,
DateCourante) Values" & _
"(" & NumSemaine & ", #" & _
Format(DateCourante, "mm/dd/yyyy") & "#)")

DateCourante = DateAdd("d", 1, DateCourante)

Loop Until DateCourante > DateFinSemaine

'On boucle pour générer toutes les semaines

NumSemaine = 2

Do

DateDebSemaine = DateAdd("d", 1, DateFinSemaine)
DateFinSemaine = DateAdd("d", 6, DateDebSemaine)

CurrentDb.Execute ("Insert Into T_Semaines Values" & _
"(" & NumSemaine & ", #" & _
Format(DateDebSemaine, "mm/dd/yyyy") & "#, #" & _
Format(DateFinSemaine, "mm/dd/yyyy") & "#)")

'Génération des numéros de semaine pour chaque jour de l'année

DateCourante = DateDebSemaine

Do
CurrentDb.Execute ("Insert Into T_Semaines_Complet (Semaine,
DateCourante) Values" & _
"(" & NumSemaine & ", #" & _
Format(DateCourante, "mm/dd/yyyy") & "#)")

DateCourante = DateAdd("d", 1, DateCourante)

Loop Until DateCourante > DateFinSemaine

NumSemaine = NumSemaine + 1

Loop Until Year(DateAdd("d", 13, DateFinSemaine)) > Year(TxtDateVend)

'Création de la dernière semaine
DateDebSemaine = DateAdd("d", 1, DateFinSemaine)
DateFinSemaine = CDate("31/12/" & Year(TxtDateVend))

CurrentDb.Execute ("Insert Into T_Semaines Values" & _
"(" & NumSemaine & ", #" & _
Format(DateDebSemaine, "mm/dd/yyyy") & "#, #" & _
Format(DateFinSemaine, "mm/dd/yyyy") & "#)")

'Génération des numéros de semaine pour chaque jour de l'année

DateCourante = DateDebSemaine

Do
CurrentDb.Execute ("Insert Into T_Semaines_Complet (Semaine,
DateCourante) Values" & _
"(" & NumSemaine & ", #" & _
Format(DateCourante, "mm/dd/yyyy") & "#)")

DateCourante = DateAdd("d", 1, DateCourante)

Loop Until DateCourante > DateFinSemaine

MsgBox "Génération des semaines terminée"

DoCmd.OpenTable "T_Semaines"
DoCmd.Maximize

Exit Sub

erreur:
MsgBox "Erreur : " & Err.Description, vbCritical

End Sub


Bonjour,

Je voudrai mettre en place une fonction un peu spéciale.

Paramètre reçue : numéro de semaine
Renvoie : date de début et date de fin de la semaine.

Là où ça se corse, c'est que les semaines vont du vendredi au jeudi...
En sachant que les 1ere et dernière semaines de l'année peuvent être plus
courtes ou plus longues que les autres.
Par exemple pour 2006 :
- 1ere semaine, du lundi 2 au jeudi 5 janvier.
- derniere semaine, du vendredi 22 au dimanche 31.

Si par hasard quelqu'un a déjà fait une fonction de ce genre, je suis
intéressé.
N'hésitez pas également à me donner des pistes.

Merci d'avance

Pierref