besoin d'aide pour une opération qui demane une boucle

besoin d'aide pour une opération qui demane une boucle - VB/VBA/VBS - Programmation

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

Reply

Marsh Posté le 23-03-2012 à 14:02:17   

Reply

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  
comment on peut integrer ce 0.5 dans le calul qui represente 6 mois avant la fin de la maturité


 
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 :
  1. Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean)
  2. Cancel = True
  3. Dim n As Double
  4. Dim Ans As Double
  5. Dim sAns As Double
  6. Dim Message As String
  7. Ans = 4
  8. For n = 1 To Ans
  9.     sAns = sAns + (coupon * n) / ((1 + Yrate) ^ n) / (coupon * ((1 + Yrate) ^ n))
  10.     Message = Message & sAns & vbLf
  11. Next n
  12. MsgBox Message
  13. End Sub


 
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


Message édité par mmarle le 25-03-2012 à 21:16:36
Reply

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


Message édité par akira3100 le 26-03-2012 à 13:33:34
Reply

Marsh Posté le 26-03-2012 à 13:40:11    

End sub a la fin

Reply

Marsh Posté le 26-03-2012 à 14:09:27    

ah il suffit de faire sAns=sAns+(coupon*n)  
 
Merci bcp

Reply

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

Reply

Marsh Posté le 26-03-2012 à 15:45:10    

:hello:  
Tu as donné une valeur de départ à sAns ?
 
genre :
 

Code :
  1. sAns = 1
  2. For n = 1 To Ans
  3. sAns = sAns + (coupon * n) / ((1 + Yrate) ^ n)


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

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

Reply

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

Reply

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"

Reply

Marsh Posté le 26-03-2012 à 16:05:36   

Reply

Marsh Posté le 26-03-2012 à 16:19:05    

sAns c'est la duration

Reply

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 :
  1. Dim Crate As Double
  2. Dim Yrate As Double
  3. Dim jours As Double
  4. Dim years As Double 
  5. Dim coupon As Double


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

Marsh Posté le 27-03-2012 à 14:19:52    

Merciiiii
ca marche

Reply

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
 
 

Reply

Marsh Posté le 27-03-2012 à 16:58:21    

Il faut peut être déclarer ta variable as Variant

Reply

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 "," ?


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

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   ","  

Reply

Marsh Posté le 27-03-2012 à 17:44:32    

Je crois que InputBox renvoie une chaîne de caractères.
Remplace

Code :
  1. Yrate = InputBox("saisir le taux de rendement" )


par

Code :
  1. Yrate = CDbl(InputBox("saisir le taux de rendement" ))


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

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  
 

Reply

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
 
 
 
 
 
 
 
 
 

Reply

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  :heink:  
 
Fais une inputbox en mettant "Veuillez saisir un taux en %" ou quelque chose dans le genre.


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

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.

Reply

Marsh Posté le 28-03-2012 à 14:09:29    

Big thanks oovaveoo

Reply

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed