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 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
| Option Explicit
Public Function AvoirEpargne(Risk1 As String, Risk2 As String, Prime As Double, rend As Double, BirthDate As Date, gender As String, DateCalcul As Date, RiskAjout As String, _
AgeAjout As Double, RiskRetrait As String, ageRetrait As Double, AgeRetraitCap As Double) As Variant
Dim PrimeRisk1() As Double
Dim PrimeRisk2() As Double
Dim PrimeRiskAjout() As Double
Dim Retrait() As Double
Dim CumulAvoir As Double
Dim AvoirAnnee() As Double
Dim vecteur(4) As Variant
Dim CapitalAcquis As Double
Dim AvoirPrev As Double
Dim age As Double
Dim NmbMoisRetraite As Integer
Dim ArrayRisk1 As Range
Dim ArrayRisk2 As Range
Dim ArrayRiskAjout As Range
Dim ArrayRetrait As Range
Dim AgeRetraite As Integer
Dim j As Integer
Dim i As Integer
Dim k As Integer
Dim l As Integer
Dim colonne As Integer
'Paramètres frais
Dim FraisFixes As Double
Dim FraisPrimes As Double
Dim FraisAvoir As Double
Dim AugmPrimeAnnee As Double
FraisFixes = 100
FraisPrimes = 0.05
FraisAvoir = 0.004
AugmPrimeAnnee = 0.01 'Taux d'augmentation des primes par années
If gender = "F" Then colonne = 2 Else colonne = 3
'Calcul de l'âge exact
age = Year(DateCalcul) - Year(BirthDate) + Month(DateCalcul) / 12 - Month(BirthDate) / 12
'Age Retraite en fonction du genre
If gender = "F" Then AgeRetraite = 64 Else AgeRetraite = 65
'Calcul du nombre de mois avant retraite
NmbMoisRetraite = ((AgeRetraite - age) * 12)
ReDim PrimeRisk1(NmbMoisRetraite)
ReDim PrimeRisk2(NmbMoisRetraite)
ReDim AvoirAnnee(NmbMoisRetraite)
ReDim PrimeRiskAjout(NmbMoisRetraite)
ReDim Retrait(NmbMoisRetraite)
'Definition des plages ou rechercher les primes de risque en fonction des offres chosie
Set ArrayRisk1 = ThisWorkbook.Sheets(Risk1).Range("A1:C1300")
Set ArrayRisk2 = ThisWorkbook.Sheets(Risk2).Range("A1:C1300")
Set ArrayRiskAjout = ThisWorkbook.Sheets(RiskAjout).Range("A1:C1300")
Set ArrayRetrait = ThisWorkbook.Sheets(RiskRetrait).Range("A1:C1300")
' Création Array pour les primes de risk 1 & 2 et pour l'avoir de chaque année
For j = 1 To NmbMoisRetraite
PrimeRisk1(j) = Application.WorksheetFunction.VLookup(Int(age + j / 12), ArrayRisk1, colonne, False) * (1 + AugmPrimeAnnee) ^ (j - j + j / 12.1)
Next j
For k = 1 To NmbMoisRetraite
PrimeRisk2(k) = Application.WorksheetFunction.VLookup(Int(age + k / 12), ArrayRisk2, colonne, False) * (1 + AugmPrimeAnnee) ^ (k - k + k / 12.1)
Next k
'Partie ajout en cours de route
Dim NmbMoisSansAjout As Integer
Dim m As Integer
Dim n As Integer
NmbMoisSansAjout = (AgeAjout - age) * 12
For m = 1 To NmbMoisSansAjout - 1
PrimeRiskAjout(m) = 0
Next m
For n = NmbMoisSansAjout To NmbMoisRetraite
PrimeRiskAjout(n) = Application.WorksheetFunction.VLookup(Int(age + n / 12), ArrayRiskAjout, colonne, False) * (1 + AugmPrimeAnnee) ^ (n - n + n / 12.1)
Next n
'Partie retrait en cours de route
Dim NmbMoisSansRetrait As Integer
Dim a As Integer
Dim b As Integer
NmbMoisSansRetrait = (ageRetrait - age) * 12
For a = 1 To NmbMoisSansRetrait - 1
Retrait(a) = 0
Next a
For b = NmbMoisSansRetrait To NmbMoisRetraite
Retrait(b) = Application.WorksheetFunction.VLookup(Int(age + b / 12), ArrayRetrait, colonne, False) * (1 + AugmPrimeAnnee) ^ (b - b + b / 12.1)
Next b
' Calcul avoit total mensuel
For l = 1 To NmbMoisRetraite
AvoirAnnee(l) = Prime + Retrait(l) - PrimeRisk1(l) - PrimeRisk2(l) - PrimeRiskAjout(l) - FraisPrimes * (PrimeRisk1(l) + PrimeRisk2(l) + PrimeRiskAjout(l) - Retrait(l)) - FraisFixes / 12
Next l
'Boucle Calcul de l'avoir à la retraite
CumulAvoir = 0
For i = 1 To NmbMoisRetraite
CumulAvoir = CumulAvoir * (1 + rend / 12) ^ (1 / 12) + AvoirAnnee(i) * (1 - FraisAvoir / 12)
Worksheets("réserves").Cells("A" & i).Value = CumulAvoir
Next i
vecteur(0) = CumulAvoir
'Calcul du capital acquis
Dim NmbMoisAvRetraitCap As Double
Dim f As Integer
NmbMoisAvRetraitCap = (AgeRetraitCap - age) * 12
For f = 1 To NmbMoisAvRetraitCap
CapitalAcquis = CapitalAcquis * (1 + rend / 12) ^ (1 / 12) + AvoirAnnee(f) * (1 - FraisAvoir / 12)
Next f
vecteur(3) = CapitalAcquis
'Calcul du capital accumulé à l'age de la retraite dont on a besoin pour couvrir toutes les primes futures jusqu'à l'âge final choisi
Dim AgeFinal As Integer
Dim tEscompte As Double
Dim t As Integer
Dim u As Integer
Dim v As Integer
Dim s As Integer
Dim o As Integer
Dim g As Integer
AgeFinal = 80
tEscompte = 0#
Dim NmbMoisApresRetraite As Integer
Dim PrimeRiskR1() As Double
Dim PrimeRiskR2() As Double
Dim PrimeRiskAjoutR() As Double
Dim RetraitR() As Double
Dim AvoirAnneeR() As Double
Dim CapitalAcc As Double
NmbMoisApresRetraite = (AgeFinal - AgeRetraite) * 12
ReDim PrimeRiskR1(NmbMoisApresRetraite)
ReDim PrimeRiskR2(NmbMoisApresRetraite)
ReDim PrimeRiskAjoutR(NmbMoisApresRetraite)
ReDim AvoirAnneeR(NmbMoisApresRetraite)
ReDim RetraitR(NmbMoisApresRetraite)
For t = 1 To NmbMoisApresRetraite
PrimeRiskR1(t) = Application.WorksheetFunction.VLookup(Int(AgeRetraite + t / 12), ArrayRisk1, colonne, False) * (1 + AugmPrimeAnnee) ^ (t - t + t / 12.1)
Next t
For u = 1 To NmbMoisApresRetraite
PrimeRiskR2(u) = Application.WorksheetFunction.VLookup(Int(AgeRetraite + u / 12), ArrayRisk2, colonne, False) * (1 + AugmPrimeAnnee) ^ (u - u + u / 12.1)
Next u
For o = 1 To NmbMoisApresRetraite
PrimeRiskAjoutR(o) = Application.WorksheetFunction.VLookup(Int(AgeRetraite + o / 12), ArrayRiskAjout, colonne, False) * (1 + AugmPrimeAnnee) ^ (o - o + o / 12.1)
Next o
For g = 1 To NmbMoisApresRetraite
RetraitR(g) = Application.WorksheetFunction.VLookup(Int(AgeRetraite + g / 12), ArrayRetrait, colonne, False) * (1 + AugmPrimeAnnee) ^ (g - g + g / 12.1)
Next g
For v = 1 To NmbMoisApresRetraite
AvoirAnneeR(v) = PrimeRiskR1(v) + PrimeRiskR2(v)
Next v
'Boucle Calcul de l'avoir dont on a besoin à la retraite pour couvrir tous les couts futurs
CapitalAcc = 0
Worksheets("réserves").Activate
For s = 1 To NmbMoisApresRetraite
CapitalAcc = CapitalAcc + (PrimeRiskR1(s) + PrimeRiskR2(s) + PrimeRiskAjout(s) - RetraitR(s)) * (1 / (1 + tEscompte)) ^ (s / 12)
Next s
vecteur(1) = CapitalAcc
AvoirEpargne = vecteur
'épargne qui correcpond à celle qu'il faut pour rembourser l'écart de primes futures
Dim CapitalAcc2 As Double
Dim w As Integer
CapitalAcc2 = 0
For w = 1 To NmbMoisApresRetraite
CapitalAcc2 = CapitalAcc2 + (PrimeRiskR1(w) + PrimeRiskR2(w) + PrimeRiskAjout(w) - Prime - Retrait(w)) * (1 / (1 + tEscompte)) ^ (w / 12)
Next w
vecteur(2) = CapitalAcc2
AvoirEpargne = vecteur
End Function |