1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
Public Sub RendementDate()
Dim db As DAO.Database
Dim rstRend, rstPreci As DAO.Recordset
Dim DatDeb As Date
Dim Preci, Rang, TRI, Calcul, Sens, Pas As Double
'Macro me permettan de créer la table support pour les calculs
'fields(0) -> date
'fields(1) -> descri
'fields(2) -> flux => entrée (+) sortie (-)
DoCmd.RunMacro "RendementDate"
'on ouvre les recordsets
Set db = DBEngine.OpenDatabase(Application.CurrentProject.FullName)
'on tri par date
Set rstRend = db.OpenRecordset("SELECT * FROM RendementDate ORDER BY [Date Opération] ASC")
'on récupère la date de début
'qui servira tout le long après pour récupérer la durée en année
DatDeb = rstRend.Fields(0)
'j'ouvre un table qui stock le degrès de précision pour mes calculs de rendement
'sinon suffit juste d'attrbuer une valeur à la variable Precision
Set rstPreci = db.OpenRecordset("SELECT * FROM Calculs")
Preci = rstPreci.Fields(0)
Set rstPreci = Nothing
TRI = 0
Rang = 0
Pas = 0.1
'on lance la boucle général qui continuera jusqu'a ce que le rang
'actuel est atteint la précision souaitée
Do Until Rang = Preci
Calcul = 0
Do Until rstRend.EOF
Calcul = Calcul + (rstRend.Fields(2) / ((1 + TRI) ^ (DateDiff("d", DatDeb, rstRend.Fields(0)) / 365)))
rstRend.MoveNext
Loop
rstRend.MoveFirst
'au premier 'tour' on définit dans quel sens on va : si calcul < 0
'rendement < 0% et vice versa
If Calcul > 0 And TRI = 0 Then
Sens = 1
ElseIf Calcul < 0 And TRI = 0 Then
Sens = -1
End If
'Maintenant on recherche si on a encadré le TRI
'C'est a dire lorsqu'il y a un changement de signe sur Calcul
If Calcul < 0 And Sens = 1 Then
'on reviens au taux de bas de fourchette
TRI = TRI - (Pas * Sens)
'on divise le pas par 10
Pas = Pas / 10
'on ajoute 1 a la précision
Rang = Rang + 1
ElseIf Calcul > 0 And Sens = -1 Then
TRI = TRI - (Pas * Sens)
Pas = Pas / 10
Rang = Rang + 1
End If
TRI = TRI + Pas * Sens
'si on envoie de mauvaise donnée, il se peut que le calcul tourne en boucle donc :
if TRI >= 4 or TRI <= -1 then
Exit Sub
end if
Loop
'j'ouvre le recordset ou je vais écrire ma valeur
Set rstRend = db.OpenRecordset("SELECT * FROM DateRendement")
rstRend.Edit
rstRend.Fields(3) = TRI
rstRend.Update
Set rstRend = Nothing
End Sub |
Partager