Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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
223
Réponses
14
Affichages
734
Réponses
5
Affichages
426
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…