Autres inclure des si dans une formule datedif

patricktoulon

XLDnaute Barbatruc
Bonjour a tous

je voudrais inclure des si dans une formule datedif
en effet j'ai une formule qui peut me donner comme résultat
0 ans 0 mois 15 jours

je voudrais inclure des si si les valeurs an et mois et jour donne zero
l'exemple précédemment donné devrait donner par exemple simplement 15 jours
et pour parfaire la chose je voudrais aussi des si >1 mettre les "s"

la formule
=DATEDIF(A1;B1;"y")&" Ans "
&DATEDIF(A1;B1;"ym")&" mois "
&DATEDIF(DATE(ANNEE(B1);MOIS(B1);JOUR(A1));B1;"d")&" jours"
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Ma fonction perso DuréeEnClair
dixit #37 ...: :cool:

il n'y a pas de synchronisation mois/semaine !!!
semaine n'est un sous-multiple ni de année ni de mois
ou bien ne commencent pas toutes le lundi ! ni ne font 7 jours ?? :rolleyes:
4 sem. et 2 jours =30 jours !!!
1572208845521.png
 

Dranreb

XLDnaute Barbatruc
Ce n'est pas une question de synchronisation. Il faut ce souvenir que la duré constante d'une année n'est pas un nombre entier de jours, et donc celle du mois considéré comme 1 année / 12 non plus.
Pour 200 jours il fait =ENT(200/30,436875) soit 6 mois, il reste 200 - 6*30,436875) = 17,37875 jours
ENT(17,37875/7) = 2 semaines, il reste 3,37875 jours arrondis à 3.

Pas besoin que des poids soient des multiples entier les uns des autres pour pouvoir décomposer un nombre en les nombres d'unités successives dans chacun de ces poids, la seule règle étant que le produit de chaque nombre d'unité par son poids ne doit pas dépasser ni même atteindre une unité du poids supérieur.
 
Dernière édition:

eriiic

XLDnaute Barbatruc
Bonjour à tous,

pour alimenter le débat voici un échange intéressant sur le sujet : https://www.mrexcel.com/forum/excel...dif-excel-2007-a-post1587099.html#post1587099
Dans ce post, l'auteur recense les différentes anomalies de datedif et compare les résultats avec d'autres solutions en vba faites par des pointures.
Sur une large gamme de dates, Datedif et les 3 autres solutions présentent de l'ordre de 80000 erreurs.
Les corrections des anomalies de datedif en introduisent d'autres...
Avec sa proposition on passe à 1500 erreurs.
eric
 

patricktoulon

XLDnaute Barbatruc
re
bonsoir eriiic
non pourquoi ça peut être instructif
perso j'ai arrêté mon choix a la proposition de
job75 formule/name
la même que j'ai concaténé en une (sans les names
dranreb qui propose une restitution détaillée ans mois semaine jours
et la mienne

mais il est important de dire que datedif ne fait pas des erreurs partout
et donc les formules datediff dont on se sert fonctionnent très bien
bref ces quatre fonctionnent
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
si mon lien est hors sujet, n'hésitez pas à le dire, je supprimerai le post.
toutes les participations à l'évocation de DATEDIF sont intéressantes à parcourir et à constater nos difficultés à rester serein face à la rigueur mathématique vis à vis de la complexité calendaire ...

Mais je maintien que le découpage en années, mois, jours n'est qu'une vue de l'esprit ne satisfaisant que notre logique et non notre cartésianisme...
un âge s'exprime simplement en nombre de jours totaux entre début et fin.
toute tentative découpage plus fin nous expose à des choix que chacun jugera valides ou non selon sa propre rigueur.

on distinguera en fait dans la vision d'un âge en années mois jours
- un certain nombre de mois complets (éventuellement réductibles (modulo 12) en années complètes (12 mois consécutifs))
- 1 à 2 parties en jours n'appartenant pas à des mois complets (période début et fin), la somme des ces deux parties pouvant alors être supérieure 28 jours.

o_OLe dilemme se pose alors :
période qui logiquement pourrait être réduite à un mois complet plus une durée résiduelle en jours ???
quelle doit être la base de cette réduction ???
??? argumentation #47
c'est l'objet de toutes nos élucubrations... :) (Paix à Grégoire XIII)

:rolleyes: si mon intervention est inopportune , n'hésitez pas à le dire, je tenterai de modérer mes réactions.;)
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Mais je maintien que le découpage en années, mois, jours n'est qu'une vue de l'esprit ne satisfaisant que notre logique et non notre cartésianisme...

on distinguera en fait dans la vision d'un âge en années mois jours
- un certain nombre de mois complets (éventuellement réductibles (modulo 12) en années complètes (12 mois consécutifs))
- 1 à 2 parties en jours n'appartenant pas à des mois complets (période début et fin), la somme des ces deux parties pouvant alors être supérieure 28 jours.

c'est l'objet de toutes nos élucubrations... :) (Paix à Grégoire XIII)

encore Elucubrations ... ???
Ultimate AMJ
VB:
Function AMJ(borne1 As Date, borne2 As Date) As String
'------------------------------------------------------------------
' ' Principe :
' ' on se cale sur le jour de début
' ' chaque jour identique des mois suivants détermine X periodes mensuelles
' ' on deduit A le nombre d'années complètes (12 périodes mensuelles  => ENT (X / 12)
' ' on deduit M le reliquat périodes mensuelles ( X modulo 12)
' ' on peut alors calculer J les jours résiduels
'------------------------------------------------------------------
Dim Ddeb As Date, DFin As Date
Dim A0 As Integer, M0 As Integer, J0 As Integer, X As Integer
Dim A As Integer, M As Integer, J As Integer
'============remise en ordre éventuel des bornes
Ddeb = Application.Min(borne1, borne2)
DFin = Application.Max(borne1, borne2)
' ------------------------------------------------------------------
A0 = Year(Ddeb)
' ===========mois anniversaire debut
M0 = Month(Ddeb)
'===========jour anniversaire debut
J0 = Day(Ddeb)
'------------------------------------------------------------------
' ===========on compte toutes les periodes mensuelles par rapport au jour anniversaire debut
X = 0
While DateSerial(A0, M0 + X, J0) <= DFin
        A = Int(M / 12):        M = X Mod 12:        A = Int(X / 12)
        X = X + 1
Wend
' ===========nombre de jours par rapport au dernier jour anniversaire pris en référence
' -------------------- X-1 permet la prise en compte du nombre de jour du mois précédent l'anniversaire
J = DFin - (DateSerial(A0, M0 + X - 1, J0))
'-------------------------------------------------------------------
' ===========mise en forme string AMJ (absences et pluriels)
Select Case A
        Case 0:         AMJ = ""
        Case 1:        AMJ = A & " an "
        Case Else:        AMJ = A & " ans "
End Select

Select Case M
        Case 0:         AMJ = AMJ & ""
        Case Else:        AMJ = AMJ & M & " mois "
End Select

Select Case J
        Case 0:        'AMJ = AMJ
        Case 1:        AMJ = AMJ & J & " jour"
        Case Else:        AMJ = AMJ & J & " Jours"
        End Select
' ==========contrôle éventuel
'AMJ  & date  anniversaire mois-1
'AMJ = AMJ & " " & Format(DateSerial(A0, M0 + X - 1, J0), "dd/mm/yy")
'End
End Function
 

Modeste geedee

XLDnaute Barbatruc
Bosour®
bonsoir
perso j'ai de la peine pour celui qui se poserait la même question et qui viendrait chercher une reponse :D :D :D :D ;)
le temps qui démêlé tout ca excel ne supportera plus vba
:rolleyes: pourtant l'algorithme est simple ...
:p vue de l'esprit ne satisfaisant que notre logique

' ' Principe :
' ' on se cale sur le jour de début
' ' chaque jour identique des mois suivants détermine X périodes mensuelles
' ' on deduit A le nombre d'années complètes (12 périodes mensuelles => ENT (X / 12)
' ' on deduit M le reliquat périodes mensuelles ( X modulo 12)
' ' on peut alors calculer J les jours résiduels
nb:
je parle période mensuelle et non de mois !
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour @Modeste geedee et le fil
c'est l’étalage de divergence en 3 pages qui vont perdre le lecteur

ceci dit . une boucle while sérieux ?? o_O :oops:
ca donne l'impression a revenir dans du basic 1:D
avec toute les fonctions de calcul que l'on a dispo
perso a raisonner comme ca
je ferais le calcule avec
yearplus= year(date1)+yeard(date2)-year(date1)
et pour le reste du caclcul j'utiliserais "sgn" pour additionner ou soustraire
mais bon j'estime que les fonction de calcule que l'on a dispo devraient nous donner un résultat
cela dit tout les chemin mènent a rome souhaitons que les futures lecteurs aient l'esprit de voyage :D:D:D
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
Bonjour @Modeste geedee et le fil
c'est l’étalage de divergence en 3 pages qui vont perdre le lecteur
perdre le lecteur ???
:rolleyes:en tant que demandeur vous devriez plutôt vous réjouir , d'obtenir autant de propositions...
ceci dit . une boucle while sérieux ?? o_O :oops:
ca donne l'impression a revenir dans du basic 1:D
Proselytisme ???
en quoi sur un forum parlant de VBA, une structure While ... Wend
est-elle si anachronique ???
avec toute les fonctions de calcul que l'on a dispo
perso a raisonner comme ca
je ferais le calcule avec
???? yearplus= year(date1)+yeard(date2)-year(date1)
:p moi dans ce cas j'aurai écrit simplement :
Yearplus= Yeard(date2)

Ma proposition se résume aux calculs des valeurs A M J
en seulement 5 instructions "basiques "
via la simple boucle While
VB:
X=0
While DateSerial(A0, M0 + X, J0) <= DFin
        A = Int(M / 12):        M = X Mod 12:        A = Int(X / 12)
        X = X + 1
Wend
' ===========nombre de jours par rapport au dernier jour anniversaire pris en référence
' -------------------- X-1 permet la prise en compte du nombre de jour du mois précédent l'anniversaire
J = DFin - (DateSerial(A0, M0 + X - 1, J0))
les 3 Select Case suivants n'effectuant que la mise en forme du résultat

et pour le reste du caclcul j'utiliserais "sgn" pour additionner ou soustraire
mais bon j'estime que les fonction de calcule que l'on a dispo devraient nous donner un résultat
que ne proposez-vous pas votre propre solution ???
vous qui n'avez pas su trouver celle du fil initial :
je voudrais inclure des si si les valeurs an et mois et jour donne zero
l'exemple précédemment donné devrait donner par exemple simplement 15 jours
et pour parfaire la chose je voudrais aussi des si >1 mettre les "s"
la formule=DATEDIF(A1;B1;"y")&" Ans "
&DATEDIF(A1;B1;"ym")&" mois "
&DATEDIF(DATE(ANNEE(B1);MOIS(B1);JOUR(A1));B1;"d")&" jours"
=SUPPRESPACE(SI(B1-A1;TEXTE(DATEDIF(A1;B1;"y");"[>1]0"" ans"";[>]""1 an"";")&TEXTE(DATEDIF(A1;B1;"ym");"[>] 0"" mois "";")&TEXTE(DATEDIF(A1;B1;"md");"[>1]0"" jours"";[>]""1 jour"";");"0 jour"))

cela dit tout les chemin mènent a rome souhaitons que les futures lecteurs aient l'esprit de voyage :D:D:D
:rolleyes:
?? Que n'avez vous pas testé et comparé par rapport aux autres propositions ...
et constaté que ma proposition ne reproduit aucune des anomalies précédemment relevées
et faire preuve de constructivité en relatant ici celles que vous y auriez éventuellement trouvées ...

je ne vous salue pas !!!:mad:
 

patricktoulon

XLDnaute Barbatruc
oulah!! Bonjour Modeste geedee
faut pas te vexer ,je ne met pas en doute le fait que ça fonctionne
je dis seulement que le futur lecteur va se perdre dans les propositions

après en ce qui concerne la boucle , oui je part du principe qu'avec les outils que l'on a à dispo, on devrait pas avoir a avancer a pas (in boucle)
c'est mon opinions ça n'a rien contre toi ou qui que se soit

surtout que de surcroît nous nous somme un peu envolés dans les propositions dans le sens ou ma question portait sur une formule et non VBA
 

BOUBAOM

XLDnaute Junior
Bonsoir a tous, j'essaye vos formule mais j'ai un souci

SUPPRESPACE(SI(B226-B225;TEXTE(DATEDIF(B225;B226;"y");"[>1]0"" ans"";[>]""1 an"";")&TEXTE(DATEDIF(B225;B226;"ym");"[>] 0"" mois "";")&TEXTE(DATEDIF(B225;B226;"md");"[>1]0"" jours"";[>]""1 jour"";");"0 jour"))

EN B225 LE 26 MAI 2016 et en B226 la fonction MAINTENANT()
j'ai un resultat bizarre 3 ans 7 mois 128 jours, il me semble que 128 jours correspond a 4,26 mois en plus A L'AIDE
 

Discussions similaires

Statistiques des forums

Discussions
312 163
Messages
2 085 860
Membres
103 006
dernier inscrit
blkevin