Fonction qui coince pour obtenir la date du dernier dimanche du mois

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 !

Magic_Doctor

XLDnaute Barbatruc
Bonsoir à tous,

J'ai essayé de réaliser une fonction permettant de connaître la date d'un jour quelconque de la semaine quelle que soit sa position dans un mois donné (par exemple : 3ème lundi du mois de mars 2009). Si cette position va au-delà du mois en question, on obtiendra la date correspondante (par exemple 63ème dimanche après le début du mois choisi comme paramètre de la fonction).
La fonction a l'air de bien marcher, sauf concernant l'option de trouver la date du dernier dimanche (par exemple) d'un mois donné. Suivant les années elle peut se tromper d'une semaine.
Cette fonction est prévue pour fonctionner en français, anglais et espagnol. Afin d'éviter les erreurs, elle fait appel à une autre fonction (de Ti) qui supprime tous les accents. Mercredi en espagnol s'écrit miércoles, on peut très facilement oublier l'accent sur le e. Idem pour février en français.

Merci pour toute aide au sujet de cette fonction.
 

Pièces jointes

Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

Bonsoir Magic Doctor,

Ci-joint mon fichier.

Entrer en A2 (mise au format "jjjj") une date quelconque du mois étudié.

Puis en B2 la formule matricielle (ouf !) :

Code:
=GRANDE.VALEUR(SI(JOURSEM(SI(ESTNUM(DATE(ANNEE(A2);MOIS(A2);LIGNE($1:$31)));DATE(ANNEE(A2);MOIS(A2);LIGNE($1:$31))))=[SIZE="3"][B]1[/B][/SIZE];DATE(ANNEE(A2);MOIS(A2);LIGNE($1:$31)));[SIZE="3"][COLOR="Red"]1[/COLOR][/SIZE])

Edit : on peut utiliser cette formule pour déterminer la position d'un jour quelconque. Il faut alors remplacer GRANDE.VALEUR par PETITE.VALEUR et jouer sur les 2 paramètres (en gras pour le jour, en rouge pour la position).

Bonne fin de soirée.
 

Pièces jointes

Dernière édition:
Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

Re,

Ah mais non, j'oubliais que ça ne peut pas marcher avec la fonction DATE. En effet, DATE(2009;2;31) renvoie 03/03/2009 et non pas une erreur...

Utiliser donc, sur le même principe, la formule matricielle suivante :

Code:
=GRANDE.VALEUR(SI(JOURSEM(SI(ESTNUM(1*(LIGNE($1:$31)&"/"&MOIS(A2)&"/"&ANNEE(A2)));1*(LIGNE($1:$31)&"/"&MOIS(A2)&"/"&ANNEE(A2))))=[B][SIZE="3"]1[/SIZE][/B];1*(LIGNE($1:$31)&"/"&MOIS(A2)&"/"&ANNEE(A2)));[COLOR="Red"][SIZE="3"]1[/SIZE][/COLOR])

A+
 

Pièces jointes

Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

Merci Job pour ta réponse que je conserve en cas de besoin.
Mais, pour des raisons techniques, je voulais résoudre le problème grâce à une fonction.

Bonne fin de soirée.
 
Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

Bonsoir à tous
Cette formule donne le dernier dimanche du mois :
Code:
=DATE(année;mois+1;1)-1-MOD(JOURSEM(DATE(année;mois+1;1)-1;2);7)
Bonne nuit !
ROGER2327
 
Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

RE...
J'oubliais : en remplaçant k par 3 (respectivement 2, 1, 0, -1, -2, -3) dans
Code:
=DATE(année;mois+1;1)-1-MOD(JOURSEM(DATE(année;mois+1;1)+[COLOR="Red"][B]k[/B][/COLOR];2);7)
on obtient le dernier mercredi (respectivement jeudi, vendredi, samedi, dimanche, lundi, mardi) du mois.​
ROGER2327
 
Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

Bonjour à tous
Personne n'ayant proposé de fonction à notre ami Magic_Doctor, je m'y colle. Le code original est assez obscur, faisant notamment appel à une multitude de variables intermédiaires parfaitement inutiles et à une boucle Do ... Loop hors de propos dans un calcul ne laissant aucune place au tâtonnement. Je l'ai donc réécrit sur une base raisonnée. (Mon principe est que la réflexion précède l'action. En programmation, il se traduit ainsi : Commençons par réfléchir avant de nous précipiter sur le clavier. Ce faisant, le code ne pourra que gagner en clarté.) Le code de la fonction DateJourSemaine devient :
Code:
Function DateJourSemaine(Année As Integer, Mois As String, JourSemaine As String, RangJourSemaine As Integer, AuDelaMois) As String
'Révision : ROGER2327 - 5 Germinal CCXVII

Dim mes As Byte, dia As Byte
Dim DateCherchée, DerDuMois [COLOR="SeaGreen"]'DerDuMois renvoie la date de la dernière occurence du jour
                            'cherché dans le mois passé en paramètre.[/COLOR]

    Select Case MajMinSansAccent(Mois, 0)
    Case "janvier", "january", "enero": mes = 1
    Case "fevrier", "february", "febrero": mes = 2
    Case "mars", "march", "marzo": mes = 3
    Case "avril", "april", "abril": mes = 4
    Case "mai", "may", "mayo": mes = 5
    Case "juin", "june", "junio": mes = 6
    Case "juillet", "july", "julio": mes = 7
    Case "aout", "august", "agosto": mes = 8
    Case "septembre", "september", "septiembre", "setiembre": mes = 9
    Case "octobre", "october", "octubre": mes = 10
    Case "novembre", "november", "noviembre": mes = 11
    Case "decembre", "december", "diciembre": mes = 12
    Case Else: DateCherchée = "?": GoTo fin
    End Select

    Select Case MajMinSansAccent(JourSemaine, 0)
    Case "lundi", "monday", "lunes": dia = 1
    Case "mardi", "tuesday", "martes": dia = 2
    Case "mercredi", "wednesday", "miercoles": dia = 3
    Case "jeudi", "thursday", "jueves": dia = 4
    Case "vendredi", "friday", "viernes": dia = 5
    Case "samedi", "saturday", "sabado": dia = 6
    Case "dimanche", "sunday", "domingo": dia = 7
    Case Else: DateCherchée = "?": GoTo fin
    End Select

[B][COLOR="DarkRed"]    DerDuMois = DateSerial(Année, mes + 1, 1) - 1 - (Weekday(DateSerial(Année, mes + 1, 1) - dia, vbMonday) - 1) Mod 7
    DateCherchée = DerDuMois + 7 * (IIf(RangJourSemaine < 0, RangJourSemaine + 1, RangJourSemaine) - 1 - Day(DerDuMois - 1) \ 7)
    If AuDelaMois = 0 Then
        If DateCherchée >= DateSerial(Année, mes + 1, 1) Then DateCherchée = DerDuMois
        If DateCherchée < DateSerial(Année, mes, 1) Then DateCherchée = DerDuMois - 7 * (Day(DerDuMois - 1) \ 7)
    End If[/COLOR][/B]

fin:
    DateJourSemaine = DateCherchée
End Function
La fonction MajMinSansAccent n'est pas modifiée.​
Bonne soirée.
ROGER2327
 

Pièces jointes

Dernière édition:
Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

Bonjour à tous,

Merci Monique pour ta "joyita" et merci à Job et Roger pour leurs solutions.
Je n'ai pu vous répondre plus tôt pour un problème de connexion et c'est tant mieux, car cela m'a obligé à résoudre le problème de cette fonction récalcitrante qui, maintenant, marche... du moins je l'espère.
Comme toute fonction, son intérêt est de pouvoir aussi être facilement utilisée dans une procédure.

Bonne fin de journée à tous.
 

Pièces jointes

Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

Bonsoir Roger,

Les grands esprits se rencontrent !
À peine ai-je envoyé mon dernier message que je croise le vôtre !

Vous avez tout à fait raison et les mots n'étaient pas faibles. Non seulement ce que j'avais écrit il y a voilà 3 ou 4 ans était obscur, mais même plutôt tordu. En me relisant j'avais presque honte d'adresser cette "perle" à ce forum. Je l'ai donc revue et corrigée et m'empresse d'essayer votre solution qui, en première lecture me paraît déjà et plus concise et plus élégante.
 
Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

Bravo Roger, on ne peut pas faire plus simple et plus concis.

Je me suis permis de rajouter dans votre fonction la possibilité de choisir les mois et dates en numérique.
Définitivement je conserve votre solution.

Bonne fin de soirée.
 

Pièces jointes

Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

Bonsoir à tous,
Hier, j'ai oublié de signaler qu'on pouvait donner une valeur négative au paramètre RangJourSemaine. Cela permet de trouver un jour donné un certain nombre de semaines avant le début du mois choisi.
(Note : 0 (zéro) et -1 donnent le même résultat.)​
Bonne soirée.
ROGER2327
 
Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

Bonjour Roger et à tous,

Afin de rendre cette fonction la plus polyvalente possible, j'ai envisagé de pouvoir obtenir la date du nième jour de la semaine à partir du 1er d'un mois donné (3ème mercredi à partir du 1er mars 2009) mais aussi à partir de nimporte quel jour du mois (3ème mercredi à partir du 15 mars 2009).
Malheureusement la fonction heurte sur la date correspondant à la dernière parution du jour choisi de la semaine dans le mois. Tant que le jour du mois à partir duquel doit s'effectuer la recherche est inférieur à la dernière parution du jour de la semaine choisi dans le mois, le résultat est juste, en revanche, si le jour du mois à partir duquel doit s'effectuer la recherche est >= à la dernière parution du jour de la semaine choisi dans le mois, le résultat est des plus curieux.

Un grand merci pour compléter cette fonction.
 

Pièces jointes

Re : Fonction qui coince pour obtenir la date du dernier dimanche du mois

Bonjour à tous
Dans le classeur joint, deux formules à tester. Si l'une d'elle convient, il ne sera pas difficile de la transformer en fonction.
Compte tenu du changement de problématique de Magic_Doctor, je ne me fonde plus sur la recherche du dernier dimanche du mois.​
À bientôt, peut-être...
ROGER2327
 

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
332
Réponses
0
Affichages
475
Réponses
12
Affichages
1 K
Retour