Dates & années bissextiles

oguruma

XLDnaute Occasionnel
Bonjour,
je viens de voir que Bernard_XLD et moi étions dans la même réflexion sur les dates. J'avais aussi posté un sujet sur les dates remarquables. Aux portes de la nouvelle année les questions vont sans doute débouler sur les dates et la détection d'une année bissextile. J'ai fait très simple via formule et via VBA.

1702578590357.png


1702578555087.png


1702578572245.png


En VBA
VB:
Sub TestBissextile()
   MsgBox estBissextile(Range("$B$5").Value)
End Sub
Function estBissextile(hAnnee As Integer) As Boolean
    If hAnnee <= 0 Then
        Err.Raise 13
    End If
    estBissextile = Day(DateSerial(hAnnee, 2, 29)) = 29
End Function

Dans la foulée quelques petites formules
1702578708657.png

1702578692561.png


1702578742558.png

1702578755151.png

1702578725506.png


1702578797935.png

1702578814853.png


1702579125695.png


Le tout codé en VBA

Code:
Option Explicit

Sub TestBissextile()
   MsgBox estBissextile(Range("$B$5").Value)
End Sub
Function estBissextile(hAnnee As Integer) As Boolean
    If hAnnee <= 0 Then
        Err.Raise 13
    End If
    estBissextile = Day(DateSerial(hAnnee, 2, 29)) = 29
End Function

Sub TestNbJoursMois()
    MsgBox nbJoursMois(Range("$B$10").Value, Range("$C$10").Value)
End Sub
Function nbJoursMois(hAnnee As Integer, hMois As Integer) As Integer
    If hAnnee < 0 Then
        Err.Raise 13
    End If
    If hMois < 1 Or hMois > 12 Then
        Err.Raise 13
    End If
    nbJoursMois = Day(DateSerial(hAnnee, hMois + 1, 0))
End Function

Sub TestPremJourDuMois()
    MsgBox premJourDuMois(Range("$B$15").Value, Range("$C$15").Value)
End Sub

Function premJourDuMois(hAnnee As Integer, hMois As Integer) As Date
    If hAnnee <= 0 Then
        Err.Raise 13
    End If
    If hMois < 1 Or hMois > 12 Then
        Err.Raise 13
    End If
    premJourDuMois = DateSerial(hAnnee, hMois, 1)
End Function

Sub TestDernJourDuMois()
    MsgBox dernJourDuMois(Range("$B$21").Value, Range("$C$21").Value)
End Sub


Function dernJourDuMois(hAnnee As Integer, hMois As Integer) As Date
    If hAnnee <= 0 Then
        Err.Raise 13
    End If
    If hMois < 1 Or hMois > 12 Then
        Err.Raise 13
    End If
    dernJourDuMois = DateSerial(hAnnee, hMois + 1, 0)
End Function
 

Pièces jointes

  • 1702578782096.png
    1702578782096.png
    4.6 KB · Affichages: 5

Cousinhub

XLDnaute Barbatruc
Bonsoir,
Hello, juste pour le fun...
La formule donne "bien" l'état, sauf pour THE année (1900)
VBA donne le bon état
Sinon, pour une fin de mois, il y a aussi "FIN.MOIS($B$5;0)" (Application.EoMonth en VBA)
Cependant, même elle, donne 28/02/1900 pour cette foutue année...
Tu vas me dire, ben oui, et alors????
En ajoutant +1, la formule donne "29/02/1900", alors qu'on devrait être le 01/03/1900...
C'était juste pour faire vivre le fil...
Bonne soirée, et bon W-E
 

oguruma

XLDnaute Occasionnel
Bsr, oui, merci effectivement the Année 1900 est particulière. Bon à l'époque nous n'étions pas de ce monde :D. Comme je l'avais dit c'est un truc qui est là pour "à la va-vite". Mais en phase avec toi, le calcul sur les dates et les différents types de calendriers ça reste une science particulière et complexe.... surtout quand on s'intéresse de près comment est calculé Pâques ;) car ensuite beaucoup de fêtes chrétiennes en dépendent.
En fait... de mémoire si on veut appliquer cette règle dans notre calendrier Grégorien une année divisible par 100 doit aussi être divisible par 400. Cas du passage à l'an 2000 qui a été un sérieux casse-tête (bon ça a généré du Taff pour les SSII ou ESN désormais.) Donc 1900 bien que divisible par 4 n'est pas divisible par 400 on obtient 4.75 - et par 4 on obtient 475.
Si on prend 2400 (bon je ne pense pas l'atteindre) cette année est bien bissextile car divisible par 100 et par 400.
Et pour conclure les éditeurs se sont adaptés avec des contournements. Donc £Krosoft considère à tord que 1900 est bissextile ce qui est faux dans le respect du calendrier Grégorien.
Là nous entrons dans un débat qui dépasse certainement le cadre de ce post.
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Donc £Krosoft considère à tord que 1900 est bissextile ce qui est faux dans le respect du calendrier Grégorien.
Là nous entrons dans un débat qui dépasse certainement le cadre de ce post.
Voir icalendrier.fr

Bonsour,
Errare humanum est, perseverar diabolicum...
Le tableur de Ashton tate (lotus 1 2 3) leader du marché à l'époque est à l'origine de ce bug.
Hégémonie aidant, Le concurrent Microsoft a voulu être compatible...
Mal lui (nous) en a pris...et ne reconnaîtra jamais ce bug !
.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour juste en passant
VB:
Function estBissextile(ans As Long) As boolean
If ans >= 1900 Then estBissextile = Array(False, True)(Abs(Day(DateSerial(ans, 3, 0)) = 29))
End Function

Sub test()
MsgBox estBissextile(2000)
MsgBox estBissextile(1900)
End Sub
 

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour le fil, le forum
Bonjour juste en passant
VB:
Function estBissextile(ans As Long) As boolean
If ans >= 1900 Then estBissextile = Array(False, True)(Abs(Day(DateSerial(ans, 3, 0)) = 29))
End Function

Sub test()
MsgBox estBissextile(2000)
MsgBox estBissextile(1900)
End Sub

Patrick , ça sert à quoi ton
VB:
estBissextile = Array(False, True)(Abs(Day(DateSerial(ans, 3, 0)) = 29))
ce ne serait pas suffisant avec
VB:
estBissextile = Day(DateSerial(ans, 3, 0) = 29

Cordialement,
Bernard_XLD
 

patricktoulon

XLDnaute Barbatruc
bonjour @Bernard_XLD
il faut remplacer les expressions false et true par ce que vous voulez que ca renvoie
et enlever le "As boolean " de la fonction
j'ai laissé les expressions bouléennes par fleme ;)
VB:
Function estBissextile(ans As Long)
If ans >= 1900 Then estBissextile = Array("non", "oui")(Abs(Day(DateSerial(ans, 3, 0)) = 29))
End Function

Sub test()
MsgBox estBissextile(2000)
MsgBox estBissextile(1900)
End Sub
je fais toujours mes fonctions pluri-type
je peux changer d'avis en cours de route du develloppement sans tout réécrire ;)
c'est pour ça que j'utilise l'array(x,y)(item abs(booléen))
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
d'ailleur si je veux avoir le retour "non" même si ans <1900 je devrais l'ecrire comme ça
on saisi bien le problème conceptuel de la version 1 ;)
VB:
'version2
Function estBissextile(ans As Long)
estBissextile = Array("non", "oui")(Abs(Day(DateSerial(ans, 3, 0)) = 29) And ans > 1900)
End Function

Sub test()
MsgBox estBissextile(2000)
MsgBox estBissextile(1850)
End Sub

'version 1
 Function estBissextile1(ans As Long)
If ans >= 1900 Then estBissextile1 = Array("non", "oui")(Abs(Day(DateSerial(ans, 3, 0)) = 29))
End Function

Sub test1()
MsgBox estBissextile1(2000)
MsgBox estBissextile1(1850)
End Sub
;)
 

patricktoulon

XLDnaute Barbatruc
Bonsoir,
Hello, juste pour le fun...
La formule donne "bien" l'état, sauf pour THE année (1900)
VBA donne le bon état
Sinon, pour une fin de mois, il y a aussi "FIN.MOIS($B$5;0)" (Application.EoMonth en VBA)
Cependant, même elle, donne 28/02/1900 pour cette foutue année...
Tu vas me dire, ben oui, et alors????
En ajoutant +1, la formule donne "29/02/1900", alors qu'on devrait être le 01/03/1900...
C'était juste pour faire vivre le fil...
Bonne soirée, et bon W-E

re
en fait (et je précise dans tout language informatique)
que ce soit pour les dets heure minute seconde
il y a un trou
c'est quoi ce trou?
en effet prenons une date
en l'occurence ici puisque c'est le thème de ce topic
le 28/02/1900
à quelle histoire 🤣
et bien c'est tout simple le trou est au niveau de la date à 00:00:00
ca y est on a perdu patrick me direz vous
nan nan!!
posez vous la question
le 28/02/1900 à 00:00:00
on est :
  • a° 28/02/1900 au matin (il fait encore nuit)
  • b° 28/02/1900 au soir juste un millième de seconde avant le matiin du jour suivant
si vous avez compris ça
vous comprendrez ceci et vous constaterez que contrairement a ce que vous pensez les develloppeurs de krosoft ont bien travaillé
1702815826274.png


repensez au matin et au soir
elle sont pas super intelligentes ces fonction FIN.MOIS et date hein !!
@+;)
 

Pièces jointes

  • les date avec excel toute une histoire.xlsx
    10.4 KB · Affichages: 5

Discussions similaires

Statistiques des forums

Discussions
312 210
Messages
2 086 281
Membres
103 170
dernier inscrit
HASSEN@45