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

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 !

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

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

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

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

Dernière édition:
- 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
0
Affichages
582
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…