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 :
- 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:
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.
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 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)
début | fin | ancienneté 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: