Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2749 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2132625
akira3100
Posté le 23-03-2012 à 14:02:17  profilanswer
 


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

mood
Publicité
Posté le 23-03-2012 à 14:02:17  profilanswer
 

n°2132674
mmarle
Posté le 23-03-2012 à 17:01:45  profilanswer
 

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
n°2133002
akira3100
Posté le 26-03-2012 à 13:32:41  profilanswer
 

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
n°2133005
akira3100
Posté le 26-03-2012 à 13:40:11  profilanswer
 

End sub a la fin

n°2133020
akira3100
Posté le 26-03-2012 à 14:09:27  profilanswer
 

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

n°2133063
akira3100
Posté le 26-03-2012 à 15:36:50  profilanswer
 

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

n°2133066
vave
Nice to meet me
Posté le 26-03-2012 à 15:45:10  profilanswer
 

: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
n°2133068
akira3100
Posté le 26-03-2012 à 15:50:54  profilanswer
 

Dim Ans As Double
Dim sAns As Double
 
Ans=years
 
j'ai seulement declaré sAns.
 
merciiii

n°2133074
akira3100
Posté le 26-03-2012 à 16:03:44  profilanswer
 

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

n°2133075
akira3100
Posté le 26-03-2012 à 16:05:36  profilanswer
 

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"

mood
Publicité
Posté le 26-03-2012 à 16:05:36  profilanswer
 

n°2133083
akira3100
Posté le 26-03-2012 à 16:19:05  profilanswer
 

sAns c'est la duration

n°2133100
vave
Nice to meet me
Posté le 26-03-2012 à 18:44:36  profilanswer
 

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
n°2133225
akira3100
Posté le 27-03-2012 à 14:19:52  profilanswer
 

Merciiiii
ca marche

n°2133287
akira3100
Posté le 27-03-2012 à 16:39:22  profilanswer
 

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
 
 

n°2133300
mmarle
Posté le 27-03-2012 à 16:58:21  profilanswer
 

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

n°2133301
vave
Nice to meet me
Posté le 27-03-2012 à 17:00:11  profilanswer
 

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
n°2133304
akira3100
Posté le 27-03-2012 à 17:26:03  profilanswer
 

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

n°2133309
vave
Nice to meet me
Posté le 27-03-2012 à 17:44:32  profilanswer
 

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
n°2133434
akira3100
Posté le 28-03-2012 à 11:58:51  profilanswer
 


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  
 

n°2133438
akira3100
Posté le 28-03-2012 à 12:02:03  profilanswer
 

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
 
 
 
 
 
 
 
 
 

n°2133461
vave
Nice to meet me
Posté le 28-03-2012 à 13:50:42  profilanswer
 

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
n°2133469
akira3100
Posté le 28-03-2012 à 14:06:32  profilanswer
 

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.

n°2133471
akira3100
Posté le 28-03-2012 à 14:09:29  profilanswer
 

Big thanks oovaveoo

n°2133482
akira3100
Posté le 28-03-2012 à 14:38:57  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
Probleme de position de DIV une ptite aide svp aide moi !!!! pour ajouter google adsence dans replye
besoin d'une petite ligne VBA pour AccessAide sur macro Excel
[CRON PHP] Aide pour script CRON PHP et wgetAide VBA - verrouillage code et cellule
Besoin d'aide pour structure d'une BDD MySQLBesoin de quelqu'un pour un reglage html sur mon forum svp
Plus de sujets relatifs à : besoin d'aide pour une opération qui demane une boucle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR