Attribution de valeur à des cellules Excel depuis vba

Fermé
roso_8332 Messages postés 1 Date d'inscription mercredi 16 mars 2022 Statut Membre Dernière intervention 16 mars 2022 - 16 mars 2022 à 10:56
yg_be Messages postés 23328 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 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 !

1 réponse

yg_be Messages postés 23328 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 novembre 2024 Ambassadeur 1 551
Modifié le 16 mars 2022 à 14:01
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.
0