Tion d'équation
Bonjour,
Même problème / nouveau post (sous les conseils d'un habitué des lieux)
Je n'ai d'autres choix que de m'en remettre à nouveau à vos services.
Je souhaiterais faire un code pour créer une fonction TRI Global.
Sur le même principe que la fonction TRI qui renvoie via des flux de trésorerie le taux de rentabilité d'un investissement, ma fonction TRI Global souahitée doit utiliser ces même flux mais en les capitalisant (seulement les flux positifs) à un autre taux (donné) jusqu'à l'échéance et ainsi renvoyer à un autre taux de rentabilité.
Jusqu'à présent j'utilisais le solveur mais si une fonction pouvait faire l'affaire, j'y gagnerai un certain temps.
En gros je souhaiterais faire une fonction dont la syntaxe serait:
TRI_Global(Valeurs;Taux_Réinvestissements)
Avec comme argument "Valeurs" la même plage qui serait utilisée pour une fonction TRI et en Taux_Réinvestissements, un taux donné.
Ainsi la fonction TRI résolvant pour n flux notés F l'équation:
-F0 + F1/(1+TRI)^1 + ... + Fn/(1+TRI)^n = 0Je souhaiterais une fonction TRI_Global résolvant:
-F0 + (F1*(1+Taux_Réinv)^(n-1) + ... + Fn) / (1+TRI_Global)^n = 0Mais dans le cas où l'un des flux autre que F0 serait < 0, il n'a pas à être réinvesti mais doit toutefois être actualisé par (1+TRI_Global)^p. Où p est le "rang" du flux.
Aussi, si l'on reprend l'exemple de mon fichier, la fonction TIR_Global que je cherche doit résoudre l'équation:
-4200 -21600/(1+TIR_Global)^1 + (4545*(1.1)^3 + 8715*(1.1)^2 + 6215*(1.1) + 30265)/(1+TRI_Global)^5 = 0Et ce, sans avoir à passer par une cellule annexe (C10 dans mon fichier).
Voilà...
J'espère ne pas avoir été trop flou dans mes explications.
Je vous remercie pour le temps que vous m’accorderez.
Cdlt,
Darzou
Rebonjour,
Pour ceux qui seraient interessés, je suis parvenu à ce code:
Function TIRG(Flux, Réinvest)
Dim I!, J%, Periode%, Val!, K!, Cel As Range
I = Round(WorksheetFunction.IRR(Flux), 6)
Val = 0
K = -0.000001
Periode = [Flux].Count - 1
While Val <= 0
J = 0
For Each Cel In [Flux]
If Cel.Value >= 0 Then
Val = Val + Cel.Value * (1 + Réinvest) ^ (Periode - J) / (1 + I) ^ Periode
Else
Val = Val + Cel.Value / (1 + I) ^ J
End If
J = J + 1
Next Cel
If Val <= 0 Then
Val = 0
I = I + K
End If
Wend
TIRG = Round(I, 6)
End FunctionCe n'est pas topissime parce que je reste limité sur le nombre de décimales (si je vais chercher un K plus grand, ça en devient un peu trop laborieux pour ma machine...) mais ça reste suffisant pour l'utilisation que j'en ai.
Bref je reste toutefois ouvert à d'autre suggestions / optimisations sur ce sujet.
Bonne journée à tous,
Cdlt,
Darzou