Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

victorien31

XLDnaute Nouveau
Bonjour,

débutant sur VBA, je me tourne vers vous pour demander de l'aide.

je souhaiterai créer une fonction sous VBA pour calculer le n° de semaine par rapport à une date donnée.

n° semaine à afficher = date donnée - 4 semaines

mes dates données sont dans un colonne X et je souhaiterai afficher le résultat du calcul dans une colonne Y.

Le résultat à afficher devrait est de ce format: "année" W "semaine"

J'ai essayé plusierus choses mais sans succés, je coince pour appliquer mes -4semaines à mes dates.

Merci par avance pour votre aide.
 
Re : calcul semaine VBA

Salut victorien31 et le forum
n° semaine à afficher = date donnée - 4 semaines
Si tu essaies de calculer le nombre de la semaine, puis lui ôter 4, tu vas être obliger d'établir une formule à rallonge (pour tenir compte des 4 première semaine)

Une plus simple, c'est de soustraire 28 (4×7 jours) à la date et de calculer sa semaine : Format(X - 28, "ww")
Ce qui nous donne un truc du style
Code:
range("Y1")=format(range("X1")-28,"ww")
A+
 
Re : calcul semaine VBA

Bonjour à tous
Cette fonction peut être utilisée :
Code:
[COLOR=DarkSlateGray][B]Function ISO(r, Optional x As Boolean = False) [COLOR=DarkOrange]'Transcription ISO d'une date grégorienne.[/COLOR]
Application.Volatile
Dim d2&, d3&, d4&
  r = CDate(r)
  d2 = r + 1 - Weekday(r, vbMonday)
  d3 = DateSerial(Year(d2 + 3), 1, 1)
  d4 = d3 + 1 - Weekday(d3, vbMonday) - (Weekday(d3, vbMonday) > 4) * 7
  ISO = Year(d3) & "-W" & Format((d2 - d4) \ 7 + 1, "00") & IIf(x, "", "-" & Weekday(r, vbMonday))
End Function[/B][/COLOR]
Avec 17/11/2010 en A1 :
=ISO(A1) renvoie 2010-W46-3 (date ISO complète)
=ISO(A1;1) renvoie 2010-W46 (semaine ISO)
=ISO(A1-28;1) renvoie 2010-W42 (semaine ISO décalée de 28 (4x7) jours vers le passé)
ROGER2327
#4552


Dimanche 15 As 138 (Navigation du Dr Faustroll, SPs)
27 Brumaire An CCXIX
2010-W46-3T17:06:31Z
 
Re : calcul semaine VBA

Suite…
Vous pouvez évidemment simplifier la fonction pour avoir le résultat souhaité sans paramétrage :
Code:
[COLOR=DarkSlateGray][B]Function ISOspec(r)
Application.Volatile
Dim d2&, d3&, d4&
  r = CDate(r [COLOR=Red]- 28[/COLOR])
  d2 = r + 1 - Weekday(r, vbMonday)
  d3 = DateSerial(Year(d2 + 3), 1, 1)
  d4 = d3 + 1 - Weekday(d3, vbMonday) - (Weekday(d3, vbMonday) > 4) * 7
  ISOspec = Year(d3) & "-W" & Format((d2 - d4) \ 7 + 1, "00")
End Function[/B][/COLOR]
Avec 17/11/2010 en A1 :
=ISOspec(A1) renvoie 2010-W42.
ROGER2327
#4553


Dimanche 15 As 138 (Navigation du Dr Faustroll, SPs)
27 Brumaire An CCXIX
2010-W46-3T17:30:45Z
 
Re : calcul semaine VBA

Bonjour à tous,

J'ai appliqué la formule donnée par ROGER2327 dans mon fichier, j'ai un décalage de -5 semaines et non de -4 semaines.

Erreur de ma part en retranscrivant la formule?
D'où vient l'erreur?

je vous joins le fichier pour voir ce que j'ai fait.

Hormis ce décalage, c'est exactement ce que je voulais.
 

Pièces jointes

Re : calcul semaine VBA

Bonjour a tous,

Une petite solution sans macro, si ça peut aider.

Alors dans une cellule "X" =MAINTENANT() .Puis dans une cellule désiré

=ENT(("X"-DATE(ANNEE("X");1;1)+SI(JOURSEM(DATE(ANNEE("X");1;1))>1;JOURSEM(DATE(ANNEE("X");1;1))-2;JOURSEM(DATE(ANNEE("X");1;1))+5))/7)

Ceci pour avoir le numéro de la semaine en cours. Il ne reste plus qu'à rajouter -4 à la fin. ...;JOURSEM(DATE(ANNEE("X");1;1))+5))/7)-4

Avec celà, tu changes les donnés en fonction de tes besoins.🙄
 
Re : calcul semaine VBA

Salut EDfun et le forum
J'avoue ne pas avoir testé ta solution, mais "Ceci pour avoir le numéro de la semaine en cours. Il ne reste plus qu'à rajouter -4". Donc, si maintenant() (perso, dans ce cas, je préfère aujourdhui()) tombe le 2 janvier, j'ai...
A+
Nota : je me moque, mais c'est gentiment, ne jamais hésiter à me faire pareil 😉
 
Re : calcul semaine VBA

Tu as raison Gorfael...., aujourd'hui() est correct.
Et la moquerie sympa , Y'a pas de mal. C'est même un petit +.
Je me reprend :

EN FAIT: ................JOURSEM(DATE(ANNEE("X");1;1))+5))/7)

Ceci pour avoir le numéro de la semaine en cours.
Dans le cas demandé il suffit de rajouter -4 à la fin..
 
Re : calcul semaine VBA

Bonsoir à tous
Les formules ISOspec et cw que propose MJ13 dans son classeur de démonstration et qu'il semble m'attribuer en indiquant Roger en tête de colonnes n'ont rien à voir avec celles que j'ai proposées plus haut.
Je donne les résultats que j'obtiens réellement dans le classeur joint.

Quant à sa solution
"avec un petite fonction et 1formule simple", je m'en méfie un peu : j'ai du mal à croire que le jeudi 10 décembre 2009 (28 jours avant le jeudi 7 janvier 2010) appartienne à la semaine -3 de l'année 2010
Même la formule =ANNEE(A5)&"-W"&numsem(A5) est bizarre : le lundi 31 décembre 2007 ne peut appartenir à la semaine 53 de 2007, laquelle semaine n'a jamais existé.
ROGER2327
#4555


Lundi 16 As 138 (Saint Cap, captain, SQ)
28 Brumaire An CCXIX
2010-W46-4T21:54:20Z
 

Pièces jointes

Re : calcul semaine VBA

Salut à tous

Je commence à m'y perdre un peu, avec tous ces postes.

En synthétisant : on semble tous d'accord (j'espère) sur le fait que calculer le numéro de la semaine, 4 semaines avant une date donnée n'est pas des plus simple.
Alors que calculer le numéro de la semaine 28 jours avant est plus facile.

Calculer un numéro de semaine à partir d'une date demande 2 paramètres :
- Le jour où débute la semaine (pour faire simple, dimanche ou lundi)
- Comment on détermine la semaine numéro 1 : 3 possibilités
-- La semaine contenant le premier janvier
-- La première semaine qui contient 4 jours dans l'année
-- La première semaine totalement dans l'année

Personnellement, je ne m'embête pas : l'instruction Format exploite ces paramètres et me suffit.
Mais je vais au plus simple : lundi premier jour de la semaine et la première semaine qui a 4 jours dans l'année est la n°1 (parce que j'ai un agenda qui fonctionne comme ça). Ce qui me donne en VBA
Code:
Dim X As Integer
X = Format(Date, "ww", vbMonday, vbFirstFourDays)
Mais je ne suis pas puriste, juste pragmatique, et le n°de semaine retourné et celui que je retrouve dans mon agenda.
A+

Edit : dans les possibilités, j'ai omis la première semaine que détermine mon système d'exploitation, et idem pour le premier jour de la semaine
 
Dernière édition:
Re : calcul semaine VBA

Re…
Je crois que le problème posé est un peu différent :
(…) Le résultat à afficher devrait est de ce format: "année" W "semaine" (…)
Votre formule (a priori valable) renvoie 52 aussi bien pour le 1/01/2011 que pour le 31/12/2011. Notre ami aimerait récupérer 2010-W52 dans le premier cas et 2011-W52 dans le second, ce qui complique un peu la chose…
ROGER2327
#4556


Mardi 17 As 138 (Saint Pangloss, humoriste passif, SQ)
29 Brumaire An CCXIX
2010-W46-5T00:27:42Z
 
Dernière édition:
Re : calcul semaine VBA

Salut ROGER2327 et le forum
Ce n'est que de l'habillage, et je ne pense pas que ça puisse poser problème : Si on admet que X soit la date, et Y le résultat, on aura :
Code:
Y=format(X-28,"yyyy") & "-W" & Format(X-28, "ww", vbMonday, vbFirstFourDays)
Avec X et Y pouvant être des range (cellule). Après, ce n'est que du détails, que lui seul peut régler, en prenant des cas extrêmes Lundi ou dimanche de la 3ème ou 4ème semaine, calculés à la main sur un calendrier, en vérifiant laquelle de nos formules lui convient le mieux.
Mais c'est pareil, j'enlève 28 jours, mais suivant comment on considère le jour de départ, ça ne peut être que 27 jours ou 29, à enlever. Mais ça n'a rien avoir avec la difficulté du calcul, plutôt avec la manière de calculer, et surtout, le but réel à atteindre.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
308
Réponses
8
Affichages
596
Retour