Attribution de valeur à des cellules Excel depuis vba
Fermé
roso_8332
Messages postés1Date d'inscriptionmercredi 16 mars 2022StatutMembreDernière intervention16 mars 2022
-
16 mars 2022 à 10:56
yg_be
Messages postés23328Date d'inscriptionlundi 9 juin 2008StatutContributeurDernière intervention17 novembre 2024
-
16 mars 2022 à 14:01
Bonjour,
Je cherche à attribuer des valeurs à ma feuille Excel "Réserves" depuis une boucle vba.
For i = 1 To NmbMoisRetraite
CumulAvoir = CumulAvoir * (1 + rend / 12) ^ (1 / 12) + AvoirAnnee(i) * (1 - FraisAvoir / 12)
Next i
En gros j'aimerai que les résultats de chaque boucle de CumulAvoir soient attribué à une cellule Excel.
J'ai essayé comme ça :
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
Mais ça ne me retourne rien et ça me renvoie un message d'erreur #VALUE! à ma fonction...
Le code complet :
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
Les lignes qui nous intéressent sont de la ligne 122 à 126.
Je tiens à préciser que ce code marche et me renvoie 4 valeurs justes.
Je vous remercie par avance !
A voir également:
Attribution de valeur à des cellules Excel depuis vba
bonjour,
"ça ne me retourne rien et ça me renvoie un message d'erreur #VALUE! à ma fonction", peux-tu être plus précis?
qu'attends-tu comme "retour"?
où vois-tu "#VALUE!"?
"ce code marche et me renvoie 4 valeurs justes", peux-tu être plus précis? que vois-tu de juste et où?
Si tu souhaites partager ton fichier, nous pourrons mieux analyser.