Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/01/2012, 09h14   #1
Membre du Club
 
Inscription : février 2005
Messages : 358
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 358
Points : 61
Points : 61
Envoyer un message via MSN à Zebulon777
Par défaut Récupérer le premier lundi avant une date ?

Bonjour tout le monde,

Code :
1
2
3
4
5
6
 
    WDate = P_Jour & "/" & P_Mois & "/" & P_Annee
    WDate = CDate(WDate) - 7 'On enlève 7 jours puis on cherche le premier lundi.
 
    WNumSem = DatePart("ww", WDate, vbMonday, vbFirstFourDays)
    WDateLundi = DateAdd("ww", WNumSem, CDate("01/01/" & P_Annee)) - Weekday(CDate("01/01/" & P_Annee)) + 2
Voici donc le code que j'utilise pour récupérer la date du premier lundi avant la date saisie en fonction du numéro de semaine.
Toute l'année dernière, ça a bien fonctionné, mais en ce début d'année, plus rien ne fonctionne.
En effet, lorsque j'entre le "08/01/2012", je me retrouve avec WDateLundi = "31/12/2012" alors que je voudrai qu'il me renvoie le "26/12/2011" puisque j'enlève 7 jours.
En fait, je détermine le numéro de semaine et son lundi et il faut que je trouve le lundi correspondant pour la même semaine de l'année précédente.

Qu'est-ce que je fais de mal ?
Où est-ce que ça bug ?
__________________
Zeb'...
Zebulon777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 10h25   #2
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 921
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 921
Points : 7 241
Points : 7 241
Bonjour,

Le code ci dessous devrait faire ce que tu souhaites

Code :
1
2
3
4
5
6
Dim Madate As Date
'on enleve 7 jours
Madate = DateAdd("d", -7, DateSerial(2012, 1, 8))
 
'On retourne la date du lundi précédent
MsgBox DateAdd("d", -Weekday(Madate, vbMonday) + 1, Madate)
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 14h56   #3
Membre du Club
 
Inscription : février 2005
Messages : 358
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 358
Points : 61
Points : 61
Envoyer un message via MSN à Zebulon777
Code :
1
2
3
4
5
 
dim MaDate As Date
MaDate = DateAdd("d", -7, DateSerial(P_Annee, P_Mois, P_Jour))
'On retourne la date du lundi précédent
Mdate2 = DateAdd("d", -Weekday(MaDate, vbMonday) + 1, MaDate)
Nan, ça fonctionne pas.
Lorsque le fais pour le 08/01/2012, ça fonctionne, mais si j'entre le 09/01/2012, ça ne fonctionne plus.

Pour le 08/01/2012, j'ai :
MaDate = 01/01/2012
Madet2 = 26/12/2011

Pour le 09/01/2012, j'ai :
MaDate = 02/01/2012
Madet2 = 02/01/2012
__________________
Zeb'...
Zebulon777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 15h04   #4
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 921
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 921
Points : 7 241
Points : 7 241
En effet il y a une spécificité si Date - 7 = lundi

Une petite adaptation
Code :
1
2
3
4
5
6
7
8
9
Dim MaDate As Date
MaDate = DateAdd("d", -7, DateSerial(P_Annee, P_Mois, P_Jour))
 
'On retourne la date du lundi précédent
If Weekday(MaDate, vbMonday) > 1 Then
    Mdate2 = DateAdd("d", -Weekday(MaDate, vbMonday) + 1, MaDate)
Else
    Mdate2 = DateAdd("d", -7, MaDate)
End If
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 14h58   #5
Membre du Club
 
Inscription : février 2005
Messages : 358
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 358
Points : 61
Points : 61
Envoyer un message via MSN à Zebulon777
Ca fonctionne.
Merci beaucoup.
__________________
Zeb'...
Zebulon777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 10h04   #6
Membre du Club
 
Inscription : février 2005
Messages : 358
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 358
Points : 61
Points : 61
Envoyer un message via MSN à Zebulon777
Bon, je relance car en fin de compte ça ne fonctionne pas.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
Dim MaDate As Date
MaDate = DateAdd("d", -7, DateSerial(P_Annee, P_Mois, P_Jour))
'On retourne la date du lundi précédent
 
toto = Weekday(MaDate, vbMonday)
 
If Weekday(MaDate, vbMonday) > 1 Then
    WDateLundi = DateAdd("d", -Weekday(MaDate, vbMonday) + 1, MaDate)
Else
    WDateLundi = DateAdd("d", -7, MaDate)
End If
Dim MaDate2 As Date
MaDate2 = DateAdd("d", -7, DateSerial(G_ANNEEPREC, P_Mois, P_Jour))
'On retourne la date du lundi précédent
If Weekday(MaDate2, vbMonday) > 1 Then
    WDateLundiPREC = DateAdd("d", -Weekday(MaDate2, vbMonday) + 1, MaDate2)
Else
    WDateLundiPREC = DateAdd("d", -7, MaDate2)
End If
Date saisie : 09/01/2012 (lundi)
WDateLundi : 26/12/2011 (lundi)
WDateLundiPREC : 27/12/2010 (lundi)

Mais normalement, j'aurai du avoir :
Date saisie : 09/01/2012 (lundi)
WDateLundi : 02/01/2012 (lundi)
WDateLundiPREC : 03/01/2011 (lundi)

En fait, je dois absolument me positionner sur l'année précédente en fonction du numéro de semaine qui correspond à la date saisie.

A noter que TOTO renvoi 1 alors qu'il aurait du renvoyer 2 puisque la date saisie EST un lundi.

AU SECOURS !
__________________
Zeb'...
Zebulon777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 10h39   #7
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Code :
1
2
3
4
5
6
7
Function LPAP(ByVal Dte As Date) As Date
Dim MaDate As Date
 
MaDate = DateAdd("yyyy", -1, Dte)
MaDate = DateAdd("d", 1 - Weekday(MaDate, vbMonday), MaDate)
LPAP = MaDate
End Function
LPAP(09/01/2012)=03/01/2011
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 11h31   #8
Membre du Club
 
Inscription : février 2005
Messages : 358
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 358
Points : 61
Points : 61
Envoyer un message via MSN à Zebulon777
On approche, mais ça ne fonctionne pas à tous les coups :

Code :
1
2
3
4
5
 
Dim dte As Date
dte = "10/01/2012"
MaDate2 = DateAdd("yyyy", -1, dte)
MaDate2 = DateAdd("d", 1 - Weekday(MaDate2, vbMonday), MaDate2)
MDate2 = 10/01/2011 !

En résumé voila ce que je dois avoir :
08/01/2012 -> 27/12/2010
09/01/2012 -> 03/01/2011
10/01/2012 -> 03/01/2011

Ceci s'explique pas le fait qu'on enlève 7 jours à la date saisie pour travailler sur le semaine précédente et qu'on ne prend en compte que les lundi donc :
10/01/2012 (mardi) -7j = 03/01/2012 (mardi) -> 02/01/2012 (lundi, semaine 1) => 03/01/2011 (lundi, semaine 1, année précédente)
09/01/2012 (lundi) -7j = 02/01/2012 (lundi) -> 02/01/2012 02/01/2012 (lundi, semaine 1) => 03/01/2011 (lundi, semaine 1, année précédente)
08/01/2012 (dimanche) - 7j = 01/01/2012 (dimanche) -> 26/12/2011 (lundi, semaine 52) => 27/12/2010 (lundi, semaine 52, année précédente)

C'est super compliqué, ce bordel-là.
Est-ce que je suis clair ?
__________________
Zeb'...
Zebulon777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 11h43   #9
Expert Confirmé Sénior
 
Avatar de mercatog
 
Inscription : juillet 2008
Messages : 5 848
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 5 848
Points : 13 907
Points : 13 907
Code :
1
2
3
4
5
6
7
8
Function LPAP(ByVal Dte As Date) As Date
Dim MaDate As Date
 
MaDate = DateAdd("ww", -1, Dte)                  'on enlève une semaine
MaDate = DateAdd("d", 1 - Weekday(MaDate, vbMonday), MaDate)    'on va vers le lundi de cette semaine
MaDate = DateAdd("yyyy", -1, MaDate) + 1           'on enlève une année
LPAP = MaDate
End Function
__________________
Cordialement.
mercatog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/01/2012, 13h38   #10
Membre du Club
 
Inscription : février 2005
Messages : 358
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 358
Points : 61
Points : 61
Envoyer un message via MSN à Zebulon777
Au premier abord, ça à l'air d'être bon, mais je vais pousser les tests.

Par contre, est-ce que tu me confirmes que ça fonctionnera aussi avec le problème des années bissextiles ?

Ca y est, tous mes tests sont bons.
J'espère ne pas avoir d'autres suprises sur des cas particuliers à la noix.

Mais je ne peux pas tester pour les années bissextiles pour le moment.
J'espère que 'il n'y aura pas de problèmes.

Merci encore pour l'aide et surtout la patience.
__________________
Zeb'...
Zebulon777 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2012, 14h06   #11
Expert Confirmé Sénior
 
Avatar de jfontaine
 
Homme Jérôme FONTAINE
Contrôleur de Gestion
Inscription : juin 2006
Messages : 3 921
Détails du profil
Informations personnelles :
Nom : Homme Jérôme FONTAINE
Âge : 38
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Contrôleur de Gestion

Informations forums :
Inscription : juin 2006
Messages : 3 921
Points : 7 241
Points : 7 241
Citation:
Mais je ne peux pas tester pour les années bissextiles pour le moment.
2012 est bissextile
__________________
Jérôme

Citation:
"Ils ne savaient pas que c'était impossible, alors ils l'ont fait" - Marc Twain
Si la réponse répond à votre besoin, votre vote nous encouragera.
Dans le cas ou la réponse mérite, à vos yeux, un , nous faire partager la raison de ce vote, pourrait nous permettre de nous améliorer.
jfontaine est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h26.


 
 
 
 
Partenaires

Hébergement Web