Autres Durée calendaire

jmfmarques

XLDnaute Accro
Bonjour
Deux discussions ont été ouvertes (et sont en cours) au sujet du calcul de la durée calendaire.
Je ne souhaite vraiment pas que celle-ci, de discussion, dévie à son tour de la finalité.
il ne s'agit en aucun cas de déterminer si est logique ou non la notion même de durée calendaire (qu'il s'agisse d'un âge, ou d'une ancienneté, etc ...), mais tout simplement d'en permettre le calcul sur la base des conventions de définition d'une durée calendaire.
Le calcul d'une durée calendaire est enseigné en cours élémentaire et est effectué sur ces bases :
- Détermination de la partie "principale" de la durée calendaire : elle est composée des entiers suivants, entre deux date/heure:
- nombres d'années calendaires entières (donc de date/heure à date/heure)
- nombre de mois calendaires entiers (donc de date/heure à date/heure)
Une fois cette partie principale déterminée (au bout du compte : une espèce d'âge anniversaire), elle est complétée par tous les "résidus", qui, eux, sont temporels et ne peuvent qu'être exprimés en jours, heures, minutes et secondes au delà de l' " anniversaire"

Ainsi et par exemple :
- si Pierre a atteint l'âge de 10 ans le 27 février 2020 (à supposément 0h:0m:0s), il a 10 ans , 3 jours et 2 heures le 01/03/2020 à 2 heures du mat , hein ...
- il n'aurait eu que 10 ans et 2 jours le 01/03/2019 à 2 heures du mat s'il était né le 27/02/2019
Partons maintenant de l'idée selon laquelle cette convention de calcul n'échappe à personne (y compris -puisque tel n'est pas le propos - à ceux qui en contesteraient l'utilité :), la raison d'être, etc ... etc ... qui relèvent de toute autre chose que du calcul à faire sur les bases de cette convention, sans en discuter ce qui n'est par définition même pas à discuter ....) :

Le décor est-il maintenant clair pour tous ?
Si (et j'espère que tel est le cas) oui, je me suis efforcé de coder une fonction personnalisée totalement indépendante de l'utilisation de fonctions Excel (DATEDIF, au demeurant masquée) et VBA (datediff), dont il est rapporté qu'elles ne sont pas exemptes d'erreurs selon la version Office.
J'ai donc codé la fonction personnalisée suivante :
VB:
Public Function DUREE_CALENDAIRE(C1 As Range, C2 As Range) As String
  Dim d1 As Date, d2 As Date, T(2, 5) As Integer, z As Integer, k As Integer, X As String, n
  d1 = C1.Value: d2 = C2.Value
  T(0, 0) = Year(d2): T(0, 1) = Month(d2): T(0, 2) = Day(d2): T(0, 3) = Hour(d2): T(0, 4) = Minute(d2): T(0, 5) = Second(d2)
  T(1, 0) = Year(d1): T(1, 1) = Month(d1): T(1, 2) = Day(d1): T(1, 3) = Hour(d1): T(1, 4) = Minute(d1): T(1, 5) = Second(d1)
  For k = 5 To 0 Step -1
    If T(0, k) < T(1, k) Then
      z = 60
      Select Case k
        Case 3: z = 24
        Case 2: z = Day(DateSerial(T(0, 0), T(0, 1), 0))
        Case 1:  z = 12
      End Select
      T(0, k) = T(0, k) + z: T(0, k - 1) = T(0, k - 1) - 1
    End If
    T(2, k) = T(0, k) - T(1, k)
  Next
  n = Array("", " an", " mois", " jour", " heure", " minute", " seconde")
  For k = 0 To 5
    X = X & IIf(T(2, k) > 0, T(2, k) & n(k + 1), " ") & IIf(T(2, k) > 1 And k <> 1, "s", "") & " "
  Next
  DUREE_CALENDAIRE = WorksheetFunction.Trim(X)
End Function
- en application des méthodes de calcul enseignées dans ce domaine en cours élémentaire
- en ne faisant appel qu'à la seule fonction de VBA dont l'exactitude ne saurait être mise en cause (DateSerial)

J'ai bien évidemment fait des tests du type "avocat du diable" pour déceler d'éventuelles erreurs.
Je n'y suis pas parvenu (à déceler une faille) jusqu'à présent, mais d'autres pourraient découvrir une faille qui m'aurait échappé. ils m'intéressent.
Voilà le principe des ces tests (avec cette formule en C2 et tiée vers le bas:
Code:
=DUREE_CALENDAIRE(A2;B2)
Ma gratitude à tous ceux qui voudront bien tout mettre en oeuvre pour mettre en exergue une éventuelle faille. Ce ne sera qu'en absence de faille, que je déposerai cette fonction personnalisée.

débutfinancienneté calendaire
14/05/1941 00:00:02​
25/03/2020 00:00:00​
78 ans 10 mois 10 jours 23 heures 59 minutes 58 secondes
14/01/2019 10:00:02​
16/02/2020 00:02:01​
1 an 1 mois 1 jour 14 heures 1 minute 59 secondes
26/03/2014 10:00:02​
02/03/2018 10:01:02​
3 ans 11 mois 4 jours 1 minute
26/02/2020 10:00:02​
02/03/2020 10:00:02​
5 jours
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
1585345007943.png

ce n'est pas facile à comprendre,
faire l'opération inverse (en application de cette convention) pour comprendre.

???????
30/03/2001 --->03/06/2012
+ 11 ans entiers calendaires --->> 30/03/2012
+ 2 mois entier calendaire--->>avril-mai 2012
+ résidus jours temporels depuis le 30/05/2016 (4 jours) --->> 03/06/2012

31/03/2001 --->03/06/2012

+ 11 ans entiers calendaires --->> 31/03/2012
+ 2 mois entier calendaire--->>avril-mai 2012
+ résidus jours temporels depuis le 31/05/2016 (3 jours) --->> 03/06/2012

01/04/2001--->03/06/2012

+ 11 ans entiers calendaires --->> 01/04/2012
+ 2 mois entier calendaire--->>avril-mai 2012
+ résidus jours temporels depuis le 01/06/2016 (2 jours) --->> 03/06/2012
 

jmfmarques

XLDnaute Accro
ce que tu montres là, Modeste geedee
c'est ce qui correspond au cas dont je parlais ici :
EDIT je vois bien (mais rien à voir avec tes surlignements) que mon deuxième garde-fou est à corriger (ce que je vais faire demain) très légèrement pour faire face à un cas particulier.
Correction en réalité déjà faite mais je préfère ne la montrer que demain après d'autres tests. Elle est en Dernière colonne ici :
31/12/2000 10:00:02​
06/07/2014 10:00:02​
13 ans 6 mois 6 joursBON13 ans 6 mois 6 jours
01/01/2001 10:00:02​
06/07/2014 10:00:02​
13 ans 6 mois 5 joursBON13 ans 6 mois 5 jours
31/12/2000 00:00:00​
06/04/2014 00:00:00​
13 ans 3 mois 7 jours13 ans 3 mois 6 jours
30/12/2000 00:00:00​
06/04/2014 00:00:00​
13 ans 3 mois 7 jours13 ans 3 mois 7 jours
30/03/2001 05:27:00​
03/06/2012 06:26:00​
11 ans 2 mois 4 jours 59 minutes11 ans 2 mois 4 jours 59 minutes
31/03/2001 05:27:00​
03/06/2012 06:26:00​
11 ans 2 mois 4 jours 59 minutes11 ans 2 mois 3 jours 59 minutes
01/04/2001 05:27:00​
03/06/2012 06:26:00​
11 ans 2 mois 2 jours 59 minutes11 ans 2 mois 2 jours 59 minutes
 

Discussions similaires