XL 2010 automatisation des dates dans un planning

shitoryu

XLDnaute Occasionnel
Bonjour,
je cherche à automatiser l'inscription des dates en fonction de l'année, du n° de la semaine et du jour :

si en A1 = 2019
si en A3 = semaine "37"
si en B3 = "lundi"

alors en C3 = 9 septembre

J'ai placé un fichier en copie
Merci à vous !
B.
 

Pièces jointes

  • Calendrier des activités (2019-20).xlsm
    22.4 KB · Affichages: 9

job75

XLDnaute Barbatruc
Bonjour shitoryu,

Voyez le fichier joint et cette fonction VBA à placer impérativement dans un module standard :
VB:
Function DatSem(an%, sem%, jour$) As Variant
Dim i%, dat As Date
jour = LCase(jour) 'minuscules
DatSem = ""
For i = 1 To 365 - IsDate("29/2/" & an)
    dat = DateSerial(an, 1, i)
    If Application.IsoWeekNum(dat) = sem And Format(dat, "dddd") = jour Then DatSem = dat: Exit Function
Next
End Function
Elle est utilisée dans la formule en C3, à tirer vers le bas :
Code:
=DatSem(A$1;A3;B3)
A+
 

Pièces jointes

  • Calendrier des activités (2019-20)(1).xlsm
    47 KB · Affichages: 10

shitoryu

XLDnaute Occasionnel
merci !
la formule fonctionne dans votre tableau mais quand je la recopie dans ma version cela plante. J'ai pourtant l'impression de tout reprendre à l'identique.
vous pourriez jeter un œil et m'expliquer la raison de mon erreur ?
Merci encore,
B.
 

Pièces jointes

  • Calendrier des activités (2019-20)v2.xlsm
    33.2 KB · Affichages: 3

job75

XLDnaute Barbatruc
Le code précédent utilise la fonction Excel NO.SEMAINE.ISO (IsoWeekNum).

Et en effet je crois que cette fonction n'est pas reconnue sur Excel 2010.

Utilisez alors ce code :
VB:
Function DatSem(an%, sem%, jour$) As Variant
Dim i%, dat As Date, t As Date
jour = LCase(jour) 'minuscules
DatSem = ""
For i = 1 To 365 - IsDate("29/2/" & an)
    dat = DateSerial(an, 1, i)
    t = DateSerial(Year(dat + (8 - Weekday(dat)) Mod 7 - 3), 1, 1)
    If ((dat - t - 3 + (Weekday(t) + 1) Mod 7)) \ 7 + 1 = sem And Format(dat, "dddd") = jour Then DatSem = dat: Exit Function
Next
End Function
 

Pièces jointes

  • Calendrier des activités (2019-20)v2.xlsm
    39.7 KB · Affichages: 6

job75

XLDnaute Barbatruc
Je me rends compte qu'une boucle est tout à fait inutile.

Dans ce fichier (3) ce code paraît convenir :
VB:
Function DatSem(an%, sem%, jour$) As Variant
Dim a, n As Variant, premier As Date, lundi As Date
jour = LCase(jour) 'minuscules
a = Array("lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche")
DatSem = ""
n = Application.Match(jour, a, 0)
If sem < 1 Or IsError(n) Then Exit Function
premier = DateSerial(an, 1, 1) '1er de l'an
lundi = 7 * sem + premier - Weekday(premier) - 5 'lundi de la semaine
If Weekday(premier) > 5 Then lundi = lundi + 7 'semaine ISO
If Year(lundi) <= an Then DatSem = lundi + n - 1 'avec limitation du numéro de semaine
End Function
Edit : ajouté la limitation du numéro de semaine.
 

Pièces jointes

  • Calendrier des activités (2019-20)(3).xlsm
    40.4 KB · Affichages: 12
Dernière édition:

Discussions similaires

Réponses
0
Affichages
141
Réponses
14
Affichages
639
Réponses
5
Affichages
397

Statistiques des forums

Discussions
311 724
Messages
2 081 937
Membres
101 844
dernier inscrit
pktla