Date du jour-même ou précédent

Episode IV de la saga ‘Weekday’. On souhaite obtenir cette fois-ci, la date d’un jour de semaine qui précède ou NON la date de référence.

Préambule
Je vous conseille de lire le premier billet de ‘Weekday’ pour comprendre le principe des calculs.
Voir aussi le récapitulatif des fonctions.

Les matrices
On souhaite donc passer de la matrice ‘Weekday’ à la matrice ‘Jour courant ou précédent’

Weekday(Date,VbDayOfWeek)                   Jour courant ou précédent          
                  VbDayOfWeek                                 VbDayOfWeek      
Jour Date  L   M   M   J   V   S   D        Jour date  L   M   M   J   V   S   D
Lundi      1   7   6   5   4   3   2        Lundi      0  -6  -5  -4  -3  -2  -1
Mardi      2   1   7   6   5   4   3        Mardi     -1   0  -6  -5  -4  -3  -2
Mercredi   3   2   1   7   6   5   4  vers  Mercredi  -2  -1   0  -6  -5  -4  -3
Jeudi      4   3   2   1   7   6   5        Jeudi     -3  -2  -1   0  -6  -5  -4
Vendredi   5   4   3   2   1   7   6        Vendredi  -4  -3  -2  -1   0  -6  -5
Samedi     6   5   4   3   2   1   7        Samedi    -5  -4  -3  -2  -1   0  -6
Dimanche   7   6   5   4   3   2   1        Dimanche  -6  -5  -4  -3  -2  -1   0

 
On remarque que toutes les valeurs de la matrice finale sont les opposés + 1 de la matrice ‘Weekday’. Par exemple, si la date de référence est un lundi, le mardi sera 1 – 7 = -6, le dimanche sera 1 – 2 = -1 et pour les valeurs de la diagonale, la formule est 1 – 1 = 0.

La fonction VBA

Public Function DateJourMemeOuPrecedent(ByVal DateRef As Date, ByVal Jour As VbDayOfWeek) As Date
   DateJourMemeOuPrecedent = DateRef - CInt(Weekday(DateRef, Jour)) + 1
End Function

 
Tester la fonction
La fonction suivante teste les 49 possibilités de la matrice et affiche les résultats dans la fenêtre ‘Exécution’ de l’éditeur VB.

Public Function TestDateJourMemeOuPrecedent()
   Dim d As Date, r As Date, dates(1 To 7) As Date
   Dim i As Integer, j As Integer, k As Integer, NbErr As Integer
   Dim s As String, Jours As Variant

   d = Int(Now())
   While Weekday(d) <> vbMonday: d = d + 1: Wend
   Jours = VBA.Array("Dimanche", "Lundi   ", "Mardi   ", "Mercredi", "Jeudi   ", "Vendredi", "Samedi  ")

   Debug.Print "Test DateJourMêmeOuPrecedent()" & vbCrLf & "----------------------"
   For i = 1 To 7
      s = vbNullString
      Debug.Print "* Date de référence : " & Format(d, "dddd dd/mm/yyyy")
      Debug.Print vbTab & "Jour cherché" & vbTab & vbTab & "Jour trouvé" & vbTab & vbTab & "Conforme ?" & vbCrLf & _
                  vbTab & "----------------------------------------------"
      For k = 1 To 6: dates(Weekday(d - k)) = d - k: Next k
      dates(Weekday(d)) = d

      For j = 1 To 7
         r = DateJourMemeOuPrecedent(d, j)
         s = s & vbTab & Jours(j - 1) & vbTab & vbTab & Format(r, "ddd dd/mm/yyyy") & vbTab & vbTab
         If r <> dates(j) Then
            NbErr = NbErr + 1
            s = s & "Erreur !" & vbCrLf
         Else
            s = s & "Ok" & vbCrLf
         End If
      Next j
      Debug.Print s
      d = d + 1
   Next i
   Debug.Print "***" & IIf(NbErr > 0, NbErr, " Aucune") & " erreur(s) commise(s) ***"
End Function

 
@+ pour la suite des épisodes ‘Weekday’.

Philippe

2 réflexions au sujet de « Date du jour-même ou précédent »

  1. BONJOUR CHER AMI JE SUIS DEBUTANT ET C EST MON PREMIER COMMENTAIRE SUR LES SOLUTIONS QUE VOUS PROPOSEZ.
    JE VOUS REMERCIE POUR L AIDE QUE VOUS APPORTEZ AUX JEUNES DEVELOPPEURS ET JE SOUHAITERAI QUE VOUS CREER UN CLUB DE JEUNES DEVELOPPEURS POUR ECHANGER LES CONNAISSANCES S ENTRAIDER MUTUELLEMENT. AINSI VOUS AMELIOREZ ET FAIRE PROGRESSER LE CONNAISSANCES DE VOS MEMBRES C EST FACILE NON,

    MA QUESTION A MOI ET QUE JE N ARRIVE PAS A UTILISER LA FONCTION NO.SEMAINE SOUS ACCESS 2007 ALORS QUE SOUS EXCEL CA MARCHE. LE SYSTEME ME REPONDS QU IL YA « ERR D EXECUTION 424 OBJET REQUIS; LA FONCTION « WeekdayName(date()) ne fonctionne pas merci de ta collaboration nous somme le 24 MAI 2014 14:17 LEMZAOUI

    • Bonjour et merci pour votre commentaire.
      Concernant votre question, NO.Semaine (WeekNum) est une fonction spécifique à Excel et non VBA. Les fonctions VBA ‘DatePart’ et ‘Format’ permettent d’obtenir le numéro de semaine d’une date ou pour obtenir le numéro ISO8601 d’une semaine voir ce billet.

      La fonction ‘WeekdayName’ retourne le jour de semaine en texte mais n’accepte pas de date en argument mais un ‘WeekDay’. On peut utiliser la fonction ‘Format’ qui est plus simple (voir l’aide VBA de Access).
      Exemple :

      Debug.Print WeekdayName(Weekday(Date(), vbMonday), False, vbMonday)
      Debug.Print Format(Date(), "dddd")

      cordialement

      Philippe

Laisser un commentaire