besoin d'aide pour une opération qui demane une boucle - VB/VBA/VBS - Programmation
Marsh Posté le 23-03-2012 à 17:01:45
Bonjour,
Citation : et si le resultat se presente en virgue , du genre n = 4.5 : 4 ans et demi |
En fait tu as déclaré ta variable n comme un entier (Integer) et 4,5 n'est pas un entier! Il faut la déclarer comme décimal (Double)
Tu peux utiliser ce bout de code pour ta formule.
Code :
|
Tu peux modifier le nombre d'année dans "Ans", puis il te reste à utiliser le clique droit et le tour est joué.
@ bientôt
Marsh Posté le 26-03-2012 à 13:32:41
Merci , j'ai essayé ce code avec quelques modif!! mais lorsque je fais le calcul de sAns ,, il considere n comme le nombre total d'année .
j'ai essayé avec un simple exemple de mettre
sAns = coupon *n
lorsque n = 4 et coupon = 3
il fait 4*3=12
et moi je veux qu'il fasse ca : 1*3+2*3+3*3 =18
voile mon nouveau code :
Sub Duration()
'declaration des variables
Dim papier As String
Dim Crate As String
Dim Yrate As String
Dim jours As String
Dim years As String
Dim coupon As String
Dim tradedate As Date
Dim maturitydate As Date
Dim Duration As String
Dim Ans As Double
Dim sAns As Double
Dim n As Double
Dim message As String
'Message de bienvenue
MsgBox ("bienvenue dans votre programme de calcul de Duration" )
'boite de dialogue
Do
papier = InputBox("saisir la reference du papier" )
If papier = "" Then
MsgBox "la valeur est incorrecte", vbCritical
End If
Loop Until papier <> ""
Do
Crate = InputBox("saisir le taux de coupon" )
If Crate = "" Then
MsgBox "la valeur est incorrecte", vbCritical
End If
Loop Until Crate <> ""
Do
Yrate = InputBox("saisir le taux de rendement" )
If Yrate = "" Then
MsgBox "la valeur est incorrecte", vbCritical
End If
Loop Until Yrate <> ""
tradedate = InputBox("saisir la trade date" )
maturitydate = InputBox("saisir la maturity date" )
'calcul du nombre d'années allant de la trade date a la maturité
jours = (DateDiff("d", tradedate, maturitydate))
years = jours / 360
Ans = years
MsgBox years
'Creation des cellules
Range("A1" ).Value = "Bond Reference"
Range("A2" ).Value = "Coupon Rate"
Range("A3" ).Value = "Yield Rate"
Range("A4" ).Value = "Trade Date"
Range("A5" ).Value = "Maturity Date"
Range("A6" ).Value = "Number of days till maturity"
Range("A7" ).Value = "Coupon"
Range("A9" ).Value = "Duration"
'Affectation des valeurs
Range("B1" ).Value = papier
Range("B2" ).Value = Crate
Range("B3" ).Value = Yrate
Range("B4" ).Value = tradedate
Range("B5" ).Value = maturitydate
Range("B6" ).Value = jours
Range("B9" ).Value = Duration
coupon = 100 * Range("B2" ).Value
Range("B7" ).Value = coupon
MsgBox coupon
'ajuster automatiquement la largeur des cellules
Columns("A:B" ).EntireColumn.AutoFit
'creation formule
For n = 1 To Ans
sAns = (coupon * n)
'/ ((1 + Yrate) ^ n) / (coupon * ((1 + Yrate) ^ n))
Next n
message = message & sAns & vbLf
MsgBox message
Marsh Posté le 26-03-2012 à 15:36:50
svp je suis coincé pourtant tout est bon normalement
par exemple si je veux faire ca !! a chaque fois il bloque au niveau de la formule !
j'ai pris cete formule juste pour calculer el numerateur mais rien
voile :
For n = 1 To Ans
sAns = sAns + (coupon * n) / ((1 + Yrate) ^ n)
'/ ((1 + Yrate) ^ n) / (coupon * ((1 + Yrate) ^ n))
Next n
message = message & sAns & vbLf
MsgBox message
Marsh Posté le 26-03-2012 à 15:45:10
Tu as donné une valeur de départ à sAns ?
genre :
Code :
|
Marsh Posté le 26-03-2012 à 15:50:54
Dim Ans As Double
Dim sAns As Double
Ans=years
j'ai seulement declaré sAns.
merciiii
Marsh Posté le 26-03-2012 à 16:03:44
en faite la formule de duration est :
D=(somme de (n*coupon/(1+Yrate)^n))/(somme de (coupon/(1+Yrate)^n))
avec coupon =Crate*100
Marsh Posté le 26-03-2012 à 16:05:36
j'ai essayé avec cette ligne de commande pour commencer par calculer le numerateur , soit
sAns = sAns + (coupon * n) / ((1 + Yrate) ^ n)
mais il me dit "Type mismatch"
Marsh Posté le 26-03-2012 à 18:44:36
Comme ça vite fait, je vois que tu déclares toutes tes variables en "string". String, c'est pour les chaines de caractères.
Si tu veux les intégrer à un calcul, il faut les déclarer en "integer" (nombre entier) ou "double" (avec décimales).
Code :
|
Marsh Posté le 27-03-2012 à 16:39:22
le probleme c'est que lorsque je declare Yrate ou bien Crate as double,,, lorsque j'arrive a la boite de dialogue Inputbox, ca marche pas,, et bloque la dans !!! si je laisse comme il est string ,, il y a pas de probleme avec la Inputbox mais la formule ne marchera pas
je comprend pas !! pourtant Yrate a une valeur numérique, c'est bizarre.
si je mets a la place de Yrate un chiffre , la formule marche normalement.
d'ou le probleme vient de Yrate & Crate.
concernant les dates ,, il faut les declarer comme des dates !
Merci de me donner votre point de vue! :
voila mon code de nouveau , si vous avz du temps, execute la macro et voit c'est quoi le probleme.
ca sera vraiment gentil de votre part .
tout le probleme tourne au tour de Yrate et de Crate qui sont des valeurs en taux . :
Sub Duration()
'declaration des variables
Dim papier As String
Dim Crate As String
Dim Yrate As String
Dim jours As Integer
Dim years As Double
Dim coupon As Double
Dim tradedate As Date
Dim maturitydate As Date
Dim Duration As String
Dim Ans As Double
Dim sAns As Double
Dim n As Double
Dim message As String
'Message de bienvenue
MsgBox ("bienvenue dans votre programme de calcul de Duration" )
'boite de dialogue
Do
papier = InputBox("saisir la reference du papier" )
If papier = "" Then
MsgBox "la valeur est incorrecte", vbCritical
End If
Loop Until papier <> ""
Do
Crate = InputBox("saisir le taux de coupon" )
If Crate = "" Then
MsgBox "la valeur est incorrecte", vbCritical
End If
Loop Until Crate <> ""
Do
Yrate = InputBox("saisir le taux de rendement" )
If Yrate = "" Then
MsgBox "la valeur est incorrecte", vbCritical
End If
Loop Until Yrate <> ""
tradedate = InputBox("saisir la trade date" )
maturitydate = InputBox("saisir la maturity date" )
'calcul du nombre d'années allant de la trade date a la maturité
jours = (DateDiff("d", tradedate, maturitydate))
years = jours / 360
Ans = years
MsgBox Ans, vbInformation, "Years to maturity"
'Creation des cellules
Range("A1" ).Value = "Bond Reference"
Range("A2" ).Value = "Coupon Rate"
Range("A3" ).Value = "Yield Rate"
Range("A4" ).Value = "Trade Date"
Range("A5" ).Value = "Maturity Date"
Range("A6" ).Value = "Number of days till maturity"
Range("A7" ).Value = "Coupon"
Range("A9" ).Value = "Duration"
'Affectation des valeurs
Range("B1" ).Value = papier
Range("B2" ).Value = Crate
Range("B3" ).Value = Yrate
Range("B4" ).Value = tradedate
Range("B5" ).Value = maturitydate
Range("B6" ).Value = jours
Range("B9" ).Value = Duration
coupon = 100 * Range("B2" ).Value
Range("B7" ).Value = coupon
MsgBox coupon
'ajuster automatiquement la largeur des cellules
Columns("A:B" ).EntireColumn.AutoFit
'creation formule
Yrate = Range("B3" ).Value
For n = 1 To Ans
sAns = sAns + (coupon * n) / (1 + Yrate) ^ n
'/ ((1 + Yrate) ^ n) / (coupon * ((1 + Yrate) ^ n))
Next n
message = message & sAns & vbLf
MsgBox message
End Sub
Marsh Posté le 27-03-2012 à 17:00:11
Il faudrait nous donner l'erreur que cela te met et sur quelle ligne de code, ça pourrait aider
Dans le inputbox, tu saisie un point "." ou une virgule "," ?
Marsh Posté le 27-03-2012 à 17:26:03
bon si je declare Yrate ou Crate comme un double,, la ligne qui pause probleme est celle de l'inputbox .
si je laisse en string, aucun probleme a signaler, juste que dés qu'il arrive a la formule, il ne reconnait pas Yrate.
par contre , lorsque , au lieu de mettre Yrate dans la formule, je mets la valeur correspondante a ca cellule , c'est a dire : Range("B3" ).Value , ma formule se calcule :
sAns = sAns + ((coupon * n) / ((1 + Range("B3" ).Value) ^ n))
mais Yrate= range("B3" ).value !!! pour quoi Yrate ne marche donc pas ?
je mets virgule dans Inputbox , pas un point ","
Marsh Posté le 27-03-2012 à 17:44:32
Je crois que InputBox renvoie une chaîne de caractères.
Remplace
Code :
|
par
Code :
|
Marsh Posté le 28-03-2012 à 11:58:51
really big thanks oovaveoo
j'ai remplacé :
Do
Yrate = CDbl(InputBox("saisir le taux de rendement" ))
If Yrate = "" Then
MsgBox "la valeur est incorrecte", vbCritical
End If
Loop Until Yrate <> ""
lorsque je saisit 3% dans la boite de dialogue, ca marche pas , et me dit "type mismatch"
le probleme provient de la 2éme ligne : " if Yrate="" then"
any idea.
sinon c'est pas grave,, je peux laisser Yrate et Crate as string et aprés au lieu de mettre Yrate dans la formule, je met : Range("B3" ).value
Marsh Posté le 28-03-2012 à 12:02:03
voila ce code , il marche trés bien ! mais c'est vraiment pas pro
Sub Duration()
'declaration des variables
Dim papier As String
Dim Crate As String
Dim Yrate As String
Dim jours As Integer
Dim years As Double
Dim coupon As Double
Dim tradedate As Date
Dim maturitydate As Date
Dim Duration As Double
Dim Ans As Double
Dim sAns As Double
Dim tAns As Double
Dim n As Double
Dim message As String
'Message de bienvenue
MsgBox ("bienvenue dans votre programme de calcul de Duration" )
'boite de dialogue
Do
papier = InputBox("saisir la reference du papier" )
If papier = "" Then
MsgBox "la valeur est incorrecte", vbCritical
End If
Loop Until papier <> ""
Do
Crate = InputBox("saisir le taux de coupon" )
If Crate = "" Then
MsgBox "la valeur est incorrecte", vbCritical
End If
Loop Until Crate <> ""
Do
Yrate = InputBox("saisir le taux de rendement" )
If Yrate = "" Then
MsgBox "la valeur est incorrecte", vbCritical
End If
Loop Until Yrate <> ""
tradedate = InputBox("saisir la trade date" )
maturitydate = InputBox("saisir la maturity date" )
'calcul du nombre d'années allant de la trade date a la maturité
jours = (DateDiff("d", tradedate, maturitydate))
years = jours / 360
Ans = years
MsgBox Ans, vbInformation, "Years to maturity"
'Creation des cellules
Range("A1" ).Value = "Bond Reference"
Range("A2" ).Value = "Coupon Rate"
Range("A3" ).Value = "Yield Rate"
Range("A4" ).Value = "Trade Date"
Range("A5" ).Value = "Maturity Date"
Range("A6" ).Value = "Number of days till maturity"
Range("A7" ).Value = "Coupon"
Range("A9" ).Value = "Duration"
'Affectation des valeurs
Range("B1" ).Value = papier
Range("B2" ).Value = Crate
Range("B3" ).Value = Yrate
Range("B4" ).Value = tradedate
Range("B5" ).Value = maturitydate
Range("B6" ).Value = jours
coupon = 100 * Range("B2" ).Value
Range("B7" ).Value = coupon
MsgBox coupon
'ajuster automatiquement la largeur des cellules
Columns("A:B" ).EntireColumn.AutoFit
'creation formule
Yrate = Range("B3" ).Value
For n = 1 To Ans
sAns = sAns + ((coupon * n) / ((1 + Range("B3" ).Value) ^ n))
tAns = tAns + (coupon / ((1 + Range("B3" ).Value) ^ n))
Duration = sAns / tAns
Range("B9" ).Value = Duration
Next n
message = message & Duration & vbLf
MsgBox message
End Sub
Marsh Posté le 28-03-2012 à 13:50:42
Ah ouais mais quand tu disais saisir un taux, je pensais que tu saisissais "3" ou "0,03".
C'est sûr que si tu saisis "3%", ça ne marchera pas
Fais une inputbox en mettant "Veuillez saisir un taux en %" ou quelque chose dans le genre.
Marsh Posté le 28-03-2012 à 14:06:32
oui voila . comme tu le dis, je saisis 3% .
bon c'est fait, trés content .
maintenant il faut que je fasse un menu plus agreable aves les userforms.
Marsh Posté le 28-03-2012 à 14:38:57
dite a la fin lorsqu'il fait msg box duration .
est ce que je peux inclure dans le msgbox un bouton qui permet de relancer le programme , au cas ou l'utilisateur voudrait calculer la duration pour une autre oblig.
Merci infiniment
Marsh Posté le 23-03-2012 à 14:02:17
Bonjour , c'est pour le calcul de la duration
je sais pas comment trouver la formule vba qui calcule la duration! la fomule qui se trouve en bas.
n c'est le nombres d'années separant la date du trade de la maturité.
i part de 1 jusqu'a la derniére année (declaré comme years)
n=years
je veux que dans la formule commence a faire 1* (---) + 2 * (---) + ....+...n*(---)
c'est a dire si n=4 , donc on s'arrete a 4
et si le resultat se presente en virgue , du genre n = 4.5 : 4 ans et demi
comment on peut integrer ce 0.5 dans le calul qui represente 6 mois avant la fin de la maturité
comment on fait ca SVP
Merciiiiiiiiii
Voila mon code
Sub Duration()
'declaration des variables
Dim papier As String
Dim Crate As String
Dim Yrate As String
Dim jours As String
Dim years As String
Dim coupon As String
Dim tradedate As Date
Dim maturitydate As Date
Dim Duration As String
Dim i As Integer
Dim n As Integer
n = i + 1
'Message de bienvenue
MsgBox ("bienvenue dans votre programme de calcul de Duration" )
'boite de dialogue
papier = InputBox("saisir la reference du papier" )
Crate = InputBox("saisir le taux de coupon" )
Yrate = InputBox("saisir le taux de rendement" )
tradedate = InputBox("saisir la trade date" )
maturitydate = InputBox("saisir la maturity date" )
'calcul du nombre d'années allant de la trade date a la maturité
jours = (DateDiff("d", tradedate, maturitydate))
years = jours / 360
n = years
MsgBox years
'Creation des cellules
Range("A1" ).Value = "Bond Reference"
Range("A2" ).Value = "Coupon Rate"
Range("A3" ).Value = "Yield Rate"
Range("A4" ).Value = "Trade Date"
Range("A5" ).Value = "Maturity Date"
Range("A6" ).Value = "Number of days till maturity"
Range("A7" ).Value = "Coupon"
Range("A9" ).Value = "Duration"
'Affectation des valeurs
Range("B1" ).Value = papier
Range("B2" ).Value = Crate
Range("B3" ).Value = Yrate
Range("B4" ).Value = tradedate
Range("B5" ).Value = maturitydate
Range("B6" ).Value = jours
Range("B9" ).Value = Duration
coupon = 100 * Range("B2" ).Value
Range("B7" ).Value = coupon
'ajuster automatiquement la largeur des cellules
Columns("A:B" ).EntireColumn.AutoFit
'creation formule
For i = 1 To n
A = (coupon * i) / ((1 + Yrate) ^ i) / (coupon * ((1 + Yrate) ^ i))
MsgBox A
Next
End Sub