Date et heure Nieme Day

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
une fonction qui peut être bien utile dans les planning par exemple (VBA/formule)
VB:
'**********************************************************
'          Fonction Nieme_Day

'donne le Nieme jour de semaine du mois
'version 1 supprimée
'version 2.4
'Date 28 / 6 / 2021
'Auteur: Patricktoulon et Yeahou sur ExcelDownloads
'mises a jour:
'réévaluation de l'argument nieme en variant( 1 à 5) ou "+" ou "x"
'retour du premier index jour (demandé)du mois suivant   par le nieme ="+" du mois
'retour du dernier index jour(demandé) du mois precédent par le nieme 0 du mois suivant
'retour du dernier index jour(demandé) du mois  par le nieme ="x" du mois
'l'argument nieme=5 renvoie vide si le 5 eme index jour du mois demandé n'existe pas
'suppression du 5eme argument plus necessaire avec nieme="+"
' ajout de la sortie si l'argument N ne convient pas
'mise a jour 29/06/2021
'control total de la validité de l'argumentation pour (A,M,J,N)

'*************************************************************
Option Explicit

Function Nieme_Day(ByVal A&, ByVal M&, ByVal J&, ByVal N As Variant) As Variant
    Dim Dat As Variant, Dy&
    If N Like "[!x,+,0-5]" Or (M > 12 and N>0) Or J > 7 And A < 1900 Then Nieme_Day = "Invalid Request!": Exit Function
    If N = "+" Then N = 1: M = M + 1 Else If N = "x" Then M = M + 1
    Dat = DateSerial(A, M, 1): Dy = J - Weekday(Dat, 2): If Dy >= 0 Then Dy = Dy - 7
    Dat = Dat + Dy + (Val(N) * 7)
    If Month(Dat) > M And A = Year(Dat) Then Dat = ""
    Nieme_Day = Dat
End Function
VB:
Sub test()
'
'le 3 eme mercredi du mois de mars 2021
    MsgBox Format(Nieme_Day(2021, 3, 3, 3), "dddd dd mmmm yyyy")

    'le premier jeudi du mois de juillet 2021
    MsgBox Format(Nieme_Day(2021, 7, 4, 1), "dddd dd mmmm yyyy")

    'le premier vendredi du mois de décembre 2021
    MsgBox Format(Nieme_Day(2021, 12, 5, 1), "dddd dd mmmm yyyy")

    'le dernier lundi du mois de juin 2021
    MsgBox Format(Nieme_Day(2021, 6, 1, 4), "dddd dd mmmm yyyy")
    MsgBox Format(Nieme_Day(2021, 7, 1, 0), "dddd dd mmmm yyyy")    'par le nieme 0 du mois suivant
    MsgBox Format(Nieme_Day(2021, 6, 1, "x"), "dddd dd mmmm yyyy")  'l'argument N="x" donne le dernier

    'le dernier lundi du mois d'out 2021
    MsgBox Format(Nieme_Day(2021, 9, 1, 0), "dddd dd mmmm yyyy")    'par le nieme 0 du mois suivant
    MsgBox Format(Nieme_Day(2021, 8, 1, 5), "dddd dd mmmm yyyy")    'le mois d'aout 2021 a 5 lundi
    MsgBox Format(Nieme_Day(2021, 8, 1, "x"), "dddd dd mmmm yyyy")  'l'argument N="x" donne le dernier

    'le dernier jeudi du mois d'avril 2021
    MsgBox Format(Nieme_Day(2021, 5, 4, 0), "dddd dd mmmm yyyy")    'par le nieme 0 du mois suivant
    MsgBox Format(Nieme_Day(2021, 4, 4, 5), "dddd dd mmmm yyyy")    '
    MsgBox Format(Nieme_Day(2021, 4, 4, "x"), "dddd dd mmmm yyyy")  'l'argument N="x" donne le dernier

    'le premier lundi suivant la fin septembre 2021
    MsgBox Format(Nieme_Day(2021, 9, 1, "+"), "dddd dd mmmm yyyy")  'l'argument "+" passe au premier du mois suivant

    'le premier vendredi  suivant la fin mars 2021
    MsgBox Format(Nieme_Day(2021, 3, 5, "+"), "dddd dd mmmm yyyy")  'l'argument "+" passe au premier du mois suivant


End Sub


utilisation en Formule:
=Nieme_Day(annéee;mois;index du jour;nieme)

'le 3 eme mercredi du mois de mars 2021
VB:
=Nieme_Day(2021; 3; 3; 3)

'le premier jeudi du mois de juillet 2021
Code:
=Nieme_Day(2021;7; 4; 1)

'le premier vendredi du mois de décembre 2021
Code:
= Nieme_Day(2021; 12; 5; 1)

'le dernier lundi du mois de juin 2021(3 solutions)
Code:
   =Nieme_Day(2021; 7; 1; 0)   ' le lundi précédant le mois de juillet Nieme=0
    =Nieme_Day(2021;6; 1; 4)
   =Nieme_Day(2021;6; 1; "x")

'le dernier lundi du mois d'out 2021(3 solutions)
Code:
    =Nieme_Day(2021; 9; 1; 0)
    =Nieme_Day(2021; 8; 1; 5)    'le mois d’août 2021 a 5 lundi
    =Nieme_Day(2021; 8; 1; "x")    'le"x" désigne le dernier
'le dernier vendredi de mars2021
Code:
=Nieme_Day(2021; 3; 5; "x")

'le premier lundi suivant la fin septembre 2021
Code:
=Nieme_Day(2021; 9; 1; "+")

'le dernier lundi de septembre 2021
Code:
=Nieme_Day(2021; 9; 1; "x")



comme vous avez pu le constater il y a des mois ou il y a 5 jours de semaine du même nom
donc pour le dernier cherchez plutôt le nieme "0" du mois suivant ou n="x"
c'est plus simple que de tester le 4eme ou 5 eme
pour le premier index jour du mois suivant c'est n="+"


--mis a jour le 29/06/2021--
 
Dernière édition:

Statistiques des forums

Discussions
311 720
Messages
2 081 896
Membres
101 833
dernier inscrit
sandra25