Date et heure DATEDIFF_AMJ4

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 !

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
j'avais fait une fonction "DATEDIFFAMJ" il y a quelque temps pour obtenir la différence entres deux date ans mois et jour
et un demandeur a faite une demande concernant la différence entre deux dates
sauf que lui avait besoins de faire la différence de dates 1 et 2 (entre deux siècles)
et pour couronner le tout avec des dates en dessous l'année 1900
j'ai donc repris ma fonction de base et utilisé une astuce simple
si pour la date la plus ancienne c'est une année divisible par 4 ou 400 je la décale en 2020( fevrier 28/29) sinon je la décale en 1904

10/10/2025
mise ajour de la fonction est est doté du multi ReturnMode
toujours la date2 en optional aussi histoire d'avoir l'anniversaire


en dessous 1800 non garantie

la fonction:

exemple d'utilisation en formule :

VB:
Function DATEDIFF_AMJ4$(ByVal dat1 As Date, Optional ByVal dat2 As Date = 0, Optional ReturnMode As String = 0)
    '**************************************
    ' fonction DateDiffAMJ V°4
    ' auteur:patricktoulon sur Exceldownloads
    ' date de mise en jour V°4:04/07/2021
    ' mise a jour supplementaire
    ' ajout de l'argument boolean "JustYear" pour ne récuprérer que les années
    ' mise à jour 09/102025
    ' suppression de l'argument boolean "Justyear" et remplaement par un variant
    ' pouvant ùodifier le return
    ' an ou mois ou jour ou les trois  en textuelou les trois en array
    'ajout du passage au calendrier gregorien pour la date 1 en dessous le 24 fevrier 1582
    'mise a jour 08/112025
    'Proposé par @eriiic sur exceldownload
    'ajout du calcul  pour supprimer  1 jour sur l'es années qui donne un faux positif pour les bisextiles
    '*************************************
    Dim A$, M$, J$, Ax&, Mx&, Jx, Dtemp$, et$, yeardécalée&, y
    If dat2 = 0 Then dat2 = Date
    If dat1 > dat2 Then Dtemp = dat2: dat2 = dat1: dat1 = Dtemp
    dat1 = dat1 - (dat1 < #3/1/1900#) ' traitement du delta de 1 sur dates < 1/3/1900
    dat2 = dat2 - (dat2 < #3/1/1900#) ' traitement du delta de 1 sur dates < 1/3/1900
 
    dat1 = DateSerial(Year(dat1) + 2000, Month(dat1), Day(dat1)) ' +2000 ans
    dat2 = DateSerial(Year(dat2) + 2000, Month(dat2), Day(dat2)) ' +2000 ans
    If dat1 < #12/20/3582# And dat2 > #12/20/3582# Then dat1 = dat1 + 10 '(julien/grégorien) perte de 10 jours suggéré par @Modete geedee

    A = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""y"")"): Ax = A
    M = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""ym"")"): Mx = M
    J = Evaluate("=DATEDIF(" & CLng(dat1) & "," & CLng(dat2) & ",""md"")"): Jx = J
 
    A = IIf(A = 0, "", IIf(A = 1, A & " an ", A & " ans "))
    M = IIf(M = 0, "", IIf(M = 1, M & " mois", M & " mois"))
    J = IIf(J = 0, "", IIf(J = 1, "1 jour", J & " jours"))
    et = IIf(Val(A) > 0 Or Val(M) > 0, IIf(Val(J) > 0, " et ", " "), "")
       Select Case LCase(CStr(ReturnMode))
        Case "a", "1": DATEDIFF_AMJ4 = Ax
        Case "m", "2": DATEDIFF_AMJ4 = Mx
        Case "j", "3": DATEDIFF_AMJ4 = Jx
        Case "amj", "4", "0": DATEDIFF_AMJ4 = Application.Trim(A & M & " " & et & J)
        Case "T", 5: DATEDIFF_AMJ4 = Array(Ax, Mx, Jx)
    End Select
 End Function


Code:
=datediffAMJ4(date1;date2)      différence textuelle
=datediffAMJ4(date1)            anniversaire textuelle  par date2 par defaut
=datediffAMJ4(date1;date2;1)    année   argument (1 ou "a" ou "A")
=datediffAMJ4(date1;date2;2)    les mois   argument (2 ou "m" ou "M")
=datediffAMJ4(date1;date2,3)    les jours   argument (3 ou "j" ou "J")
=datediffAMJ4(date1;date2,4)    différence textuelle  argument (0 ou 4 ou "amj" ou "AMJ" )
=datediffAMJ4(date1;date2,5)    un array des trois datas de date argument (5 ou "t" ou "T") pratique pour le vba
petite démo
1760047154458.png


l'utilisation en VBA se fait de la même manière

et sauf erreur de ma part elle est compatible All version Excel
 

Pièces jointes

  • 1760221456989.png
    1760221456989.png
    6.1 KB · Affichages: 5
Dernière édition:
Bonsoir @eriiic

Je n'avais pas lu ton code en détail... Pourquoi dans les com tu parles de février 1582 ???

réponse :
  • Le pape a décrété la réforme du calendrier julien le 24 février 1582 (bulle Inter gravissimas).
  • En France, l’application s’est faite du 9 au 20 décembre 1582 : le lendemain du 9 décembre fut le 20 décembre — on a donc supprimé 10 jours pour rattraper le décalage accumulé.

Donc, année d’adoption : 1582, avec entrée en vigueur en décembre 1582.

️ 1. Le problème du calendrier julien​


Le calendrier julien (instauré par Jules César en -45) comptait une année moyenne de 365,25 jours
(soit une année bissextile tous les 4 ans).


Mais…
L’année tropique réelle (celle des saisons) dure environ 365,2422 jours.
Cette petite différence de 11 minutes par an semble minime, mais elle s’accumule !
→ En 1500 ans, cela fait environ 10 jours de décalage.


Concrètement, le printemps astronomique (équinoxe de mars) tombait vers le 11 mars au lieu du 21 mars fixé par le Concile de Nicée en 325.

2° ok j'ai testé ca fonctionne
Je pensais bêtement qu'aller jusqu'en 2020 permetait de tomber juste pour les années bisextiles 2000 c'est bon aussi

mise a jour proposée par @eriiic adoptée
la mise ajour a été faite en post #1

Patrick
 
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

  • Suggestion Suggestion
Date et heure EcartDate
Réponses
32
Affichages
5 K
Réponses
0
Affichages
2 K
Réponses
2
Affichages
2 K
Réponses
0
Affichages
1 K
Réponses
9
Affichages
2 K
Retour