Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Magic_Doctor

XLDnaute Barbatruc
Bonjours,

J'ai essayé de résoudre le problème suivant : convertir en année(s) / mois COMPLET(S) / jour(s) le nombre de jours qu'il y a entre 2 dates.
Quelques conditions :
- les années ont toutes 365 jours (on ne tient donc jamais compte des années bissextiles)
- les mois sont toujours complets (fatalement les jours pourront parfois avoir plus de 31 jours suivant les dates)
- le jour de la 1ère date est toujours inclus

J'ai rédigé une fonction obèse-poussive-tordue-spaghetti, mais qui, ma foi, a l'air de marcher :
VB:
Function DissectionTemps(dat1 As Date, dat2 As Date) As String
'Magic_Doctor
Dim nba As Integer, m1 As Integer, m2 As Byte, j1 As Byte, j2 As Byte, x As Byte
Dim mesmois As Variant, i As Byte
Dim nbtjr As Integer, nbjr As Integer
Dim nbjmr As Integer, nbjmr1 As Integer, nbjmr2 As Integer
Dim nbmr As Byte, nbmr1 As Byte, nbmr2 As Byte
Dim sentence1 As String, sentence2 As String, sentence3 As String
Dim suf1 As String, suf2 As String, slash1 As String, slash2 As String

j1 = Day(dat1): j2 = Day(dat2)
m1 = Month(dat1): m2 = Month(dat2)

If m2 < m1 Or m2 = m1 And j2 < j1 Then x = 1
nba = Year(dat2) - Year(dat1) - x 'nombre d'années entre les 2 dates
nbtjr = dat2 - DateSerial(Year(dat1) + nba, m1, j1) 'nombre total de jours restant depuis dat1 + nba jusqu'à dat2
mesmois = Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) 'mois d'une année de 365 jours

If Month(dat1) < Month(dat2) Then
    nbmr = Abs(m1 - m2 + 1) 'nombre de mois complets restant
    For i = m1 To m2 - 2
        nbjmr = nbjmr + mesmois(i) 'nombre de jours dans les mois complets restant
    Next
    nbjr = nbtjr - nbjmr + 1 'nombre de jours restant
    
    If Day(dat1) = 1 Then 'si le jour de "dat1" est un 1er du mois
        nbmr = nbmr + 1
        nbjmr = nbjmr + NbJoursDuMois(CInt(m1))
        nbjr = nbtjr - nbjmr + 1
    End If
    
    If Day(dat2) = NbJoursDuMois(m2) Then 'si le jour de "dat2" est une fin de mois
        nbmr = nbmr + 1 'nombre de mois complets restant
        nbjr = nbjr - NbJoursDuMois(m2) 'nombre de jours restant
    End If
End If

If Month(dat1) = Month(dat2) Then
    If Day(dat1) < Day(dat2) Then
        nbmr = IIf(Day(dat1) = 1 And Day(dat2) = NbJoursDuMois(CInt(m1)), 1, 0) 'nombre de mois complets restant
        nbjr = IIf(Day(dat1) = 1 And Day(dat2) = NbJoursDuMois(CInt(m1)), 0, nbtjr) 'nombre de jours restant
    ElseIf Day(dat1) = Day(dat2) Then
        nbjr = 0
    Else
        For i = m1 To 11
            nbjmr1 = nbjmr1 + mesmois(i) '1ère tranche du nombre de jours dans les mois complets restant
        Next
    
        For i = 0 To m2 - 2
            nbjmr2 = nbjmr2 + mesmois(i) '2ème tranche du nombre de jours dans les mois complets restant
        Next
        nbmr = 11 'nombre de mois complets restant
        nbjmr = nbjmr1 + nbjmr2 'nombre de jours dans les mois complets restant
        nbjr = nbtjr - nbjmr 'nombre de jours restant
    End If
End If

If Month(dat1) > Month(dat2) Then
    For i = m1 To 11
        nbjmr1 = nbjmr1 + mesmois(i) '1ère tranche du nombre de jours dans les mois complets restant
    Next
    nbmr1 = 12 - m1
    
    If Day(dat1) = 1 Then 'si le jour de "dat1" est un 1er du mois
        nbmr1 = nbmr1 + 1
        nbjmr1 = nbjmr1 + NbJoursDuMois(CInt(m1))
    End If
    
    If Month(dat2) = 1 Then 'le mois de "dat2" est janvier
        If Day(dat1) = 1 Then 'si le jour de "dat1" est un 1er du mois
            nbmr = 13 - Month(dat1)
            nbjr = Day(dat2)
        Else
            nbmr = nbmr1
            nbjr = nbtjr - nbjmr1 + 1
        End If
        GoTo after
    End If
    
    For i = 0 To m2 - 2
        nbjmr2 = nbjmr2 + mesmois(i) '2ème tranche du nombre de jours dans les mois complets restant
    Next
    nbmr2 = Month(dat2) - 1 '2ème tranche du nombre de jours dans les mois complets restant
    nbmr = nbmr1 + nbmr2 'nombre de mois complets restant
    nbjmr = nbjmr1 + nbjmr2 'nombre de jours dans les mois complets restant
    nbjr = nbtjr - nbjmr 'nombre de jours restant
after:
    If Day(dat2) = NbJoursDuMois(m2) Then 'si le jour de "dat2" est une fin de mois
        nbmr = nbmr + 1 'nombre de mois complets restant
        nbjr = nbjr - NbJoursDuMois(m2) 'nombre de jours restant
    End If
    If Day(dat1) = 1 And Day(dat2) = NbJoursDuMois(m2) Then 'si le jour de "dat1" est le 1er d'un mois et le jour de "dat2" est une fin de mois
        If nbmr = 12 Then nbmr = 11: nbjr = NbJoursDuMois(m2)
    End If
End If
    
'*************************** Éléments de la chaîne ***************************
    suf1 = IIf(nba > 1, "s", "")
    suf2 = IIf(nbjr > 1, "s", "")
    sentence1 = IIf(nba = 0, "", nba & " an" & suf1)
    sentence2 = IIf(nbmr = 0, "", nbmr & " mois")
    sentence3 = IIf(nbjr = 0, "", nbjr & " jour" & suf2)
    slash1 = IIf(sentence1 = "" Or sentence2 = "", "", " / ")
    slash2 = IIf(sentence1 = "" And sentence2 = "" Or sentence2 = "" And sentence3 = "" Or sentence2 <> "" And sentence3 = "", "", " / ")
'*****************************************************************************
DissectionTemps = sentence1 & slash1 & sentence2 & slash2 & sentence3
End Function
'-----------------------------------------------------------------------------------------------
Function NbJoursDuMois(m As Byte, Optional année As Integer = 0) As Byte
'Renvoie le nombre de jours d'un mois en fonction de son Nº
'- m : un Nº de mois (janvier --> 1 ... décembre --> 12)
'- année : si omis, ne tiendra pas compte des années bissextiles (février -2- aura toujours 28 jours)
'Magic_Doctor
    Dim mesmois As Variant, x As Byte, nbjoursmois As Byte
    
    x = IIf(année = 0, 28, IIf(LeapYear(année), 29, 28))
    mesmois = Array(31, x, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
    
    NbJoursDuMois = mesmois(m - 1)
End Function
'-----------------------------------------------------------------------------------------------
Function LeapYear(a%) As Boolean
'Vérifie si une année est bissextile ou pas (tient compte des années théoriquement bissextiles et qui ne le sont en fait pas, comme 1800/1900/2100...)
'- a : une année quelconque
'ROGER2327
    LeapYear = ((a Mod 4) = 0) * (1 + ((a Mod 100) = 0) * (1 + (((a \ 100) Mod 4) = 0)))
End Function
Peut-on "dégraisser ce mammouth" ?
 

Pièces jointes

  • DissectionTemps.xlsm
    22.6 KB · Affichages: 89
  • DissectionTemps.xlsm
    22.6 KB · Affichages: 99
  • DissectionTemps.xlsm
    22.6 KB · Affichages: 101
Dernière édition:

KenDev

XLDnaute Impliqué
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonjour à tous,

ROGER2327 à dit:
Quand je lis mois complet, je comprends bêtement du premier au dernier jour du mois. Par conséquent, du 15 mars 2013 inclus au 20 avril 2013 exclu, je ne vois pas de mois complet, ni mars, ni avril. Je vois 17 jours en mars et 19 jours en avril.
De même, du 1[SUP]er[/SUP] juin 2013 inclus au 30 juin 2013 exclu, je ne vois pas un mois complet ; tout au plus 29 jours. Il est vrai que je suis grave miraud...

Là j'ai compris, merci Roger! Merci de penser au cerveau lent. Nous utilisons les mêmes mots mais chacun avec une définition différente.
_ de j/m a j-1/m+1 inclus -> ma 1ere fonction
_,de 1/m à (dernier j)/m -> la question du fil
_ 1 a= 365,2425 j / 1 m= 30.436875 j. -> ma 2eme fonction

Je suis donc à côté de la plaque. Du coup je retire le
KenDev à dit:
vous ne m'empêcherez pas de pensez que c'est travailler un peu "à l'arrache"
C'est juste un choix qui n'a pas à me plaire ou pas. Et ca m'apprendras à intervenir sur un fil ou je pense, à tort ou à raison, que le demandeur n'a pas donné toutes les billes pour y répondre. Mais bon, c'est tellement rigolo ces histoires de dates...

Désolé pour le dérangement.

Cordialement

KD
 

ROGER2327

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Re...


(...)
Là j'ai compris, merci Roger! Merci de penser au cerveau lent. Nous utilisons les mêmes mots mais chacun avec une définition différente.
_ de j/m a j-1/m+1 inclus -> ma 1ere fonction
_,de 1/m à (dernier j)/m -> la question du fil
_ 1 a= 365,2425 j / 1 m= 30.436875 j. -> ma 2eme fonction
(...)
C'est effectivement le cas. Accordons-nous au moins sur une chose : certes, nous utilisons différemment le concept de mois. Mais nous avons le mérite de n'en utiliser qu'un seul. Au contraire, il semblerait que notre ami utilise l'un ou l'autre concept, au gré de la conjoncture ou du sens du vent...​


(...)
Je suis donc à côté de la plaque.
(...)
Halte-là, ami ! Je dirais plutôt qu'on ne sait pas trop où est la plaque !​



(...)
Du coup je retire le
Citation Envoyé par KenDev
vous ne m'empêcherez pas de pensez que c'est travailler un peu "à l'arrache"
(...)
Ne retirez rien, car :​
(...)
C'est juste un choix qui n'a pas à me plaire ou pas. Et ca m'apprendras à intervenir sur un fil ou je pense, à tort ou à raison, que le demandeur n'a pas donné toutes les billes pour y répondre.
(...)
On ne saurait mieux dire !


(...)
Mais bon, c'est tellement rigolo ces histoires de dates...
(...)
Oui !
On ne sait pas bien ce qu'on cherche, mais on s'amuse bien !

Continuons !​


Bonne journée.


ℝOGER2327
#6972


Vendredi 13 As 141 (Moustaches du Dr Faustroll - fête Suprême Tierce)
25 Brumaire An CCXXII, 4,4663h - faisan
2013-W46-5T10:43:09Z
 

job75

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Re,

Une solution VBA où j'ai purement et simplement transcrit les formules Excel :

Code:
Function MonTemps(deb As Date, fin As Date)
Dim joursdeb%, joursfin%, années%, mois%, jours%
deb = deb - (Day(deb) = 28 And Month(deb) = 2 And IsDate("29/2/" & Year(deb)))
fin = fin - (Day(fin) = 28 And Month(fin) = 2 And IsDate("29/2/" & Year(fin)))
joursdeb = -(Day(deb) > 1) * (DateSerial(Year(deb), Month(deb) + 1, 1) - deb)
joursfin = -(Day(fin + 1) > 1) * (fin - DateSerial(Year(fin), Month(fin), 0))
années = Application.Max(Int(Application.Days360(DateSerial(Year(deb), Month(deb) + Sgn(joursdeb), 1), DateSerial(Year(fin), Month(fin) - (joursfin = 0), 1)) / 360), 0)
mois = Application.Max(Int(Application.Days360(DateSerial(Year(deb), Month(deb) + Sgn(joursdeb), 1), DateSerial(Year(fin), Month(fin) - (joursfin = 0), 1)) / 30), 0) - 12 * années
jours = IIf(Month(deb) = Month(fin) And Year(deb) = Year(fin) And mois = 0, fin - deb - (Day(deb) = 29 Or Day(fin) <> 29 Or Month(fin) <> 2), joursdeb + joursfin)
MonTemps = IIf(deb > fin, "", IIf(années, années & " an" & IIf(années > 1, "s", "") & " ", "") & IIf(mois, mois & " mois ", "") & IIf(jours, jours & " jour" & IIf(jours > 1, "s", ""), ""))
End Function
Fichier (5).

A+
 

Pièces jointes

  • DissectionTemps(5).xls
    70.5 KB · Affichages: 54
  • DissectionTemps(5).xls
    70.5 KB · Affichages: 55
  • DissectionTemps(5).xls
    70.5 KB · Affichages: 59

Modeste geedee

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonsour®

selon : https://www.excel-downloads.com/thr...de-temps-pour-des-annees-de-365-jours.213338/

C'est la raison pour laquelle, dans les plans d'amortissement bien faits, la date de sortie de l'immobilisation est la veille de la date de mise en service + le nombre d'années d'amortissement.

:rolleyes:
https://www.excel-downloads.com/thr...de-temps-pour-des-annees-de-365-jours.213338/
Je pense, depuis mon 1er post, avoir été cohérent. Si vous n'avez pas compris exactement ce que je voulais obtenir, c'est autre chose. Mais peut-être que je m'exprime mal...

il suffit donc de rendre "cohérentes" les dates prises en compte
- plus de problèmes de jours
- plus de problèmes de mois
- que des années entières :rolleyes:

date début : A2
date arret : B2
date sortie : C2
=DATE(ANNEE(A2)+ANNEE(B2)-ANNEE(A2)+(TEXTE(B2;"mmjj")>=TEXTE(A2;"mmjj"));MOIS(A2);JOUR(A2)-1)nb années immobilisation :
=ANNEE(C2+1)-ANNEE(A2)
 

Pièces jointes

  • immobilisation.xlsx
    21.1 KB · Affichages: 59

Magic_Doctor

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonjour KenDev, job, Roger, le forum,

Il est vrai que l'énoncé d'une question peut souvent porter à confusion. C'est tellement clair dans l'esprit de celui qui énonce qu'il en oublie que le message peut ne pas passer.
J'ai une date de départ et une date d'arrivée. En fait on "survole" tout le temps qui sépare ces 2 dates :
En général ces 2 dates sont distantes de plusieurs années, parfois seulement de plusieurs mois et rarement uniquement de quelques jours.
Si elles sont distantes de plusieurs années, alors, dans un premier temps, on fait le décompte des années, supposons "n" années. On reporte la 1ère date à "1ère date + n". Entre début de "1ère date + n" et fin de 2ème date il n'y aura forcément que des mois et des jours ou peut-être même que des jours (enfin toutes les combinaisons sont possibles). 2 cas de figures :
- si la 1ère date ne commence pas un 1er, son mois sera forcément incomplet
- si la 2ème date ne finit pas le dernier jour de son mois, son mois sera lui aussi incomplet
En revanche, tous les mois qui séparent ces 2 dates seront, eux, complets. On "survole" ces mois complets pour en faire le décompte mais aussi le total de leurs jours (mois de 30, 31 ou 28 jours).
Ne restent plus que quelques jours : ceux allant du jour de la 1ère date jusqu'à la fin du mois de celle-ci et le nombre de jours de la 2ème date. La somme de ces jours sera le nombre de jours restant qui au maximum aura pour valeur 60 (02/01/2000 --> 30/10/2015).
Je ne sais pas, mais peut-être est-ce plus clair ainsi.

KenDev,
02/02/1980 --> 31/03/2013
- 02/02/1980 --> 02/02/2013 : 33 ans
- 02/02/2013 --> 31/03/2013 : 28 jours de février (du 2 inclus au 29 inclus) + 1 mois (tout le mois de mars)
Bilan : 33 ans / 1 mois / 28 jours (comme ROGER)

Mais votre exemple est intéressant (comme quoi le dialogue est enrichissant) car, partant du principe que nous sommes dans des années fiscales de toujours 365 jours, je me demande maintenant si le résultat exact ne serait pas : 33 ans / 1 mois / 27 jours (du 2 février inclus au 28 février inclus).

Roger, chez moi aussi ça bouillonne parfois, surtout avec les dates.

Dans la soirée je vais essayer vos solutions.

Merci et bonne journée à tous.
 

KenDev

XLDnaute Impliqué
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Re bonjour à tous,

Bon alors si tout le monde est d'accord pour continuer à jouer.

@MD
Si je traduis bien :
Dans un premier temps on calcule le nombre d'années écoulées, la notion de mois complet n'intervenant qu'après cette première opération. (Il me semble qu'alors la prise en compte du bissextile doit se faire d'après la date anniversaire-antérieur-le-plus-proche et non avec la date d'origine).

Ci joint un classeur comparatifs avec les dernières propositions de MD, Roger2327 (merci pour votre gentil post), Job et celle ci.

@Modeste geedee
Je n'ai pas inclus votre dernière proposition, très différente et qui ne se prète pas à l'exercice.

Cordialement

KD

VB:
Option Explicit
Function DiffDat3(ByVal Dt1 As Date, ByVal Dt2 As Date) As String
    Dim Dt3 As Date, y1&, y2&, m1&, m2&, d1&, d2&, c&, d3&, m3&, y3&, a&, b&
    If Dt2 < Dt1 Then Dt3 = Dt1: Dt1 = Dt2: Dt2 = Dt3
    y1 = Year(Dt1): m1 = Month(Dt1): d1 = Day(Dt1): y2 = Year(Dt2): m2 = Month(Dt2): d2 = Day(Dt2)
    Do: c = c + 1: Loop Until IsPost(y1 + c, m1, d1, y2, m2, d2)
    y3 = c - 1
    If Not (d1 = d2 And m1 = m2) Then 'exception anniversaire
        m3 = -(m1 <> m2) * (m2 - m1 - 1 - 12 * (m2 < m1)) + 11 * (m1 = m2) * (d1 > d2)
        a = LastDay(m1, y2): b = LastDay(m2, y2): d3 = a - d1 + 1 + d2
        If m1 = m2 And d1 < d2 Then d3 = d2 - d1 + 1 Else m3 = m3 - (d1 = 1) - (d2 = b): d3 = d3 + a * (d1 = 1) + b * (d2 = b)
    End If
    If y3 > 0 Then DiffDat3 = y3 & " an" & IIf(y3 > 1, "s", "")
    If m3 > 0 Then DiffDat3 = IIf(DiffDat3 <> "", DiffDat3 & " / ", "") & m3 & " mois"
    If d3 > 0 Then DiffDat3 = IIf(DiffDat3 <> "", DiffDat3 & " / ", "") & d3 & " jour" & IIf(d3 > 1, "s", "")
End Function
Function LastDay(ByVal M As Byte, Optional yr) As Byte
    Dim y&
    LastDay = 31 + (Abs(M - 10) = 1 Or Abs(M - 5) = 1) + 3 * (M = 2)
    If Not IsMissing(yr) Then y = CLng(yr): LastDay = LastDay + (M = 2) * (y Mod 4 = 0 And ((y Mod 400 = 0) Or (y Mod 100 > 0)))
End Function
Function IsPost(ByVal y1&, ByVal m1&, ByVal d1&, ByVal y2&, ByVal m2&, ByVal d2&) As Boolean
    IsPost = IIf(y1 > y2, True, IIf(y1 = y2, IIf(m1 > m2, True, IIf(m1 = m2, d1 > d2, False)), False))
End Function
 

Pièces jointes

  • DissectionTemps.xlsm
    37.1 KB · Affichages: 60
  • DissectionTemps.xlsm
    37.1 KB · Affichages: 59
  • DissectionTemps.xlsm
    37.1 KB · Affichages: 66

job75

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Re,

Merci KenDev, cette comparaison m'a permis de voir un dysfonctionnement entre mes formules Excel et leur transcription en VBA.

Il se produit uniquement quand février 1900 est inclus, à cause de ce fameux 29/02/1900.

On peut corriger les années et les mois en les comptant entre le 1 du 1er mois et le 2 du 2ème mois :

Code:
années = Application.Max(Int(Application.Days360(DateSerial(Year(deb), Month(deb) + Sgn(joursdeb), 1), DateSerial(Year(fin), Month(fin) - (joursfin = 0), 2)) / 360), 0)
Mais impossible de corriger simplement l'erreur sur les jours.

Voyez les 2 fichiers joints.

Si l'on entre 16/03/1900 à la place de 16/01/1900 il n'y a plus de problème.

A+
 

Pièces jointes

  • DissectionTemps(5).xls
    70.5 KB · Affichages: 63
  • DissectionTemps(5).xls
    70.5 KB · Affichages: 65
  • DissectionTemps(5).xls
    70.5 KB · Affichages: 64
  • DissectionTemps(5) légèrement corrigé.xls
    70.5 KB · Affichages: 51
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonsour®
@Modeste geedee
Je n'ai pas inclus votre dernière proposition, très différente et qui ne se prète pas à l'exercice.

:(
on ignore donc cette condition essentielle !!
C'est la raison pour laquelle, dans les plans d'amortissement bien faits, la date de sortie de l'immobilisation est la veille de la date de mise en service + le nombre d'années d'amortissement.

N'y aurait-il pas de contrôleur de gestion dans les rangs de XLD ???
:cool:
 

KenDev

XLDnaute Impliqué

Pièces jointes

  • DissectionTemps40.xls
    90.5 KB · Affichages: 58
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonsour®
Bon alors si tout le monde est d'accord pour continuer à jouer.
:rolleyes:
:cool:
Hors les hypothèses de Magic_DD,

- qu'est-ce un plan d'amortissement bien fait ??

- comment comptabilise-t-on en durée les immobilisations ??

:rolleyes:

On détermine pour chaque bien pris individuellement, une durée normale d’utilisation.
Les durées de vie les plus couramment admises sont :
Pour les constructions 20 à 25 ans
Pour les matériels et outillages 10 à 12 ans
Pour les matériels et mobiliers de bureau 10 ans
Pour les véhicules de transport 5 ans
lorsqu’une immobilisation est acquise en cours d’exercice comptable, on doit
réduire la première annuité d’amortissement au prorata temporis (c'est-à-dire
proportionnellement au temps écoulé entre la date de mise en service de l’immobilisation et la
date de clôture de l’exercice).
 
Dernière édition:

Magic_Doctor

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Buenas noches Modeste geedee,

J'ai analysé cette histoire de plans d'amortissement (dont, au passage, je me fous éperdument...) suite à la demande de ma fille qui désirait que je lui dresse un tableau sur Excel pour régler, sans se prendre la tête, ce problème. Je découvre donc cette histoire d'amortissements sur le net. Un plan pas con pour obliger des professionnels à investir (donc à dépenser du fric et faire tourner la machine à fric : TVA + économie + être à la pointe du progrès...) sans que pour autant ils puissent arnaquer le fisc (si on sort prématurément, on est alors puni...), et en contre partie on est un chouïa moins racketisé par les impôts... Je cherche, dans notre honorable forum, des fils sur ce sujet. Il y en a ! De toutes les réponses que j'ai pu voir, une m'a particulièrement intéressé, celle de Jiheme (voir PJ). Je ne comprenais pas pourquoi la date de sortie de l'immobilisation était la veille de la date de mise en service de l'immobilisation + le nombre d'années d'amortissement. Mais au bout d'un moment on fini par comprendre et c'est clair, puisque c'est logique. Si un pseudo-spécialiste comptable ou fiscal contredit cette logique, je m'en moque autant que des pseudo-spécialistes du Monde qui prétendent péremptoirement que l'effet de serre est dû uniquement à l'homme. Comme si le soleil n'existait pas ! Mais il est tellement plus facile d'inventer un Grand-coupable que l'on puisse par la suite, ad vitam aeternam, ponctionner (taxe éco et j'en passe...), sans jamais régler pour autant le problème.
De toute façon, dans le bordel actuel, je ne pense pas que les sbires du fisc martyrisent les gens pour 1 jour d'amortissement. J'imagine qu'ils ont d'autres chats, ou plutôt tigres, à fouetter... Ce qui m'intéresse, c'est de faire quelque chose qui tienne la route avec des cerises en plus (dont se foutent le fisc et le comptable), comme le thème de ce fil.
Enfin, pas besoin de me faire un cours sur ce sujet (amortissement dégressif, unités d'œuvre, proratisation de la 1ère année d'amortissement...), j'ai déjà lu pas mal de trucs mortels là-dessus. L'amortissement c'est une règle de 3 noyée dans une jargonophasie qui légitime ceux qui le gèrent. Au quidam de la traduire...
Plus intéressant que certains commentaires sont des réponses constructives.

PS : je suis dans le linéaire.
 

Pièces jointes

  • Tableau d'amortissement.xlsm
    14.3 KB · Affichages: 59
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonsour®
:rolleyes:
je ne sais si l'auteur du tableau d'amortissement fourni est spécialiste en la matières...

constatations :
- on fonctionne en année d'exercice, pas de notion de mois si ce n'est la date clôture d'exercice
- les amortissements d'années de mise en service et hors service sont au prorata JOURS360 par rapport aux bornes respectives d'exercice, de même que pour une sortie anticipée (Plus-value).
sinon les amortissements sont annualisés en fonction de la durée initiale.

donc : X années =(X-1) années complètes +(prorata jours Exercice MiseEnService + prorata jours Exercice MiseHorsService)
 

Magic_Doctor

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Re...

Mettons-nous bien d'accord, cette fonction est uniquement pour le "fun de l'esprit". Elle n'a strictement rien à voir avec l'univers fiscal stricto sensu. Du reste, dans un autre post, je l'avais déjà précisé.
Seulement, voilà, supposons que, pour une raison quelconque (vol, incendie, obsolescence technologique...), vous décidiez de sortir de votre amortissement avant son terme (sortie anticipée), cette fonction vous dit tout simplement, d'une manière, ma foi, cohérente à l'esprit, pendant exactement combien de temps vous avez réellement amorti. Un point c'est tout. C'est ce que j'appelle la "cerise", qui ne sert à rien mais qui peut être utile, d'autant plus qu'elle ne mange pas de pain.
Quant aux proratisations (règle basique de 3, cours du primaire...), elles s'appliquent tant aux années dites comptables de 360 jours qu'aux années dites ficales de 365 jours. Dans un forum de comptabilité j'ai posé la question s'il fallait raisonner en 360 jours ou en 365 jours. La réponse fut que cela n'avait strictement aucune importance, et que cette nuance dépend en fait du logiciel dont on dispose. L'essentiel c'est d'amortir d'une manière cohérente et irréfutable, et le fisc ne va pas faire chier le peuple pour + ou - 5 jours. Dieu merci !
Quand on amorti c'est à partir du jour de mise en service de l'actif et non pas le lendemain ! Donc, au final, on retranche 1 jour.
Enfin, pourquoi toujours chercher des spécialistes ? Et le bon sens, qu'en faites-vous ? C'est un peu comme si je vous demandais si vous croyez encore aux soi-disant spécialistes de la météorologie... personnellement, je trouve que, trop souvent, la grenouille c'est pas mal.
Re-enfin, vous mettez en exergue "pas de notion de mois si ce n'est la date de clôture de l'exercice". Pourquoi ce commentaire ? J'en viens directement au grain en déclarant la date de mise en service d'un actif ainsi que celle de sa sortie anticipée, et c'est tout. La date de clôture de l'exercice n'a, que je sache, rien à voir avec la résolution du problème ; ce peut être n'importe quel mois de l'année (en général décembre).

PS : pour ces histoires à la mord-moi-le-nœud, définitivement je préfère les années comptables de 360 jours (tous les calculs sont plus simples). Et comme dirait le proverbe arabe : "360 jours ou 365 jours, di tout façon li fisc ti pique li fric".
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Fonction qui dissèque un intervalle de temps pour des années de 365 jours

Bonsour®
on pourra donc en définitive résumer ainsi
Nbr de jours amortis dans le mois de début : =FIN.MOIS(DateDebut;0)-DateDebut
Nbr de jour amortis dans le mois de fin : = JOUR(DateFin)
Nbr de jours appartenant à des mois complets : =DateFin-JOUR(Datefin)-FIN.MOIS(DateDebut;0)-1
Nbr Années complètes : =ANNEE(DateFin-JOUR(DateFin)-FIN.MOIS(JourDebut;0)-1)-1900
Nbr Mois(années incomplètes) : =DATEDIF(FIN.MOIS(DateDeb;0);DateFin-JOUR(DateFin);"ym")
 

Pièces jointes

  • magic_dd.xls
    85.5 KB · Affichages: 61
  • magic_dd.xls
    85.5 KB · Affichages: 56
  • magic_dd.xls
    85.5 KB · Affichages: 57
Haut Bas