recherche de code.

dianbobo

XLDnaute Junior
bonjour a tous

j'ai envi d'ecrire un code vba pour excel mais j'ai de gros problemes car je suis vraiment un amateur
voila je vais m'expliquer:
'je voudrai calculer le prix dune marchandise
'la date du jour est en A2
les dates de premiers coupons sont en colonne L a partir de la ligne 6 jusqu'a la derniere ligne non vide
'l'etude se fait donc ligne par ligne
lindice i designe ce qui se passe entre aujourd'hui et l'anné future i
exemple:
a la ligne 6 j'ai la date du premier coupon 11/04/2011
1) trouver le nombre de jours entre la date du jour et la date du premier coupon



Code:
datedif(i)=(L(i),A2,"d")


2)convertir ce nombre de jours en mois :


Code:
X(i)=nbre de jour/30


3)trouver le noMbre d'année :

Code: Tout sélectionner
Code:
v=(datefuture-date du jour)/360
[v]=partie entiere de v
entre l'année en cours et la date future en colonne H A PARTIR DE LA LIGNE 6(les dates futures sont en colonne H)
*pour chaque année future i je dois faire la somme suivante et stocker le resultat en



Code:
cells(i,11),i=6,..,jusqu'a la derniere ligne non vide:

 cells(i,11)=somme(tf/(1+Tij)^Pij)+100/(1+Tn)^Pn j=1 à [v]+1
 
ou

tf=cells(i,10) pour i=6 ,jusqu'a la derniere ligne non vide
Tij=(y(i)*(sheets("feuil2").cells([v]+1,7).value+12*(j-1))+(30-y(i))*(sheets("feuil2").cells([v],7).value+12*(j-1)))/30
 

y(i)=(X(i)-[X(i)])*30
et
 pij=X(i)/12+(j-1) pour j=1 à [v]+1

[] c'est la partie entiere

merci de votre aide
 

Pièces jointes

  • Classeur1essai.xls
    37.5 KB · Affichages: 41
  • Classeur1essai.xls
    37.5 KB · Affichages: 45
  • Classeur1essai.xls
    37.5 KB · Affichages: 44

dianbobo

XLDnaute Junior
Re : recherche de code.

voila je croix que j'ai vu les premieres erreurs que j'ai faites et comment je dois essayé d'ecrire le code :
je devais definir mes variables sous forme de tableau si je ne me trompe
donc voila le code ci-dessous si quelqu'un veux bien m'aider a l'ameliorer
car j'ai encore des erreurs "incompatibilité de type"




Code:
Option Base 1

Sub prixspot()
    Dim NombreDeJour(), NbreAnnées() As Double
    Dim x(), T(), p(), g() As Double
    Dim i As Integer, j As Integer, x1() As Integer, x2() As Integer, v() As Integer
    For i = 6 To 10000
    NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
    NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360
    x(i) = NombreDeJour(i) / 30 'conversion du nombre de jours en mois a la ligne i
    x1(i) = Int(x(i)) 'partie entiere de x(i)
    x2(i) = x1(i) + 1
    v(i) = Int(NbreAnnées(i)) 'partie entiere du nombre d'année de la ligne i
    
        For j = 1 To v(i) + 1
             p(j) = x(i) / 12 + (j - 1)
             T(j) = (g(i) * Worksheets("&Forwards&").Cells(x2(i) + 11, 7).Value + 12 * (j - 1) + (30 - g(i)) * (Worksheets("&Forwards&").Cells(x1(i) + 11, 7).Value + 12 * (j - 1))) / 30
             g(i) = (x(i) - x1(i)) * 30
            Cells(i, 11).FormulaR1C1 = Cells(i, 10).Value / (1 + T(j)) ^ p(j) + 100 / (1 + T(v(i) + 1)) ^ p(v(i) + 1)
        Next j
    Next i
    
End Sub
merci de votre aide:)
 

dianbobo

XLDnaute Junior
Re : recherche de code.

bonsoir tout le monde et bonsoir a toi Paritec
je repondrai au message laissé en suspend ;)


j'ai donc creer des tableaux et REdIM EST SENcé me les redimensionner mais je ne suis pas ci-sur
deja j'ai un message d'erreur et je ne suis pas sur que je devais ecrire

Code:
NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
    NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360


dans le code etant donné que je calcul le nombre de jours a l'aide des dates:
Code:
Cells(i, 8), Cells(2, 1),Cells(i, 12)
contiennent des dates

Code:
Sub prixspot()
    Dim NombreDeJour(), NbreAnnées() As Double
    Dim x(), T(), p(), g() As Double
    Dim i As Integer, j As Integer, x1() As Integer, x2() As Integer, v() As Integer
    ReDim NombreDeJour(i), NbreAnnées(i), x(i), T(i), p(i), g(i), v(i), x1(i), x2(i)
       For i = 6 To 10000
          NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
          NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360
          x(i) = NombreDeJour(i) / 30 'conversion du nombre de jours en mois a la ligne i
          x1(i) = Int(x(i)) 'partie entiere de x(i)
          x2(i) = x1(i) + 1
          v(i) = Int(NbreAnnées(i)) 'partie entiere du nombre d'année de la ligne i
        Next i
    
    For i = 6 To 10000
    NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
    NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360
    x(i) = NombreDeJour(i) / 30 'conversion du nombre de jours en mois a la ligne i
    x1(i) = Int(x(i)) 'partie entiere de x(i)
    x2(i) = x1(i) + 1
    v(i) = Int(NbreAnnées(i)) 'partie entiere du nombre d'année de la ligne i
    
        For j = 1 To UBound(v)
             p(j) = x(i) / 12 + (j - 1)
             T(j) = (g(i) * Worksheets("Forwards").Cells(x2(i) + 11, 7).Value + 12 * (j - 1) + (30 - g(i)) * (Worksheets("Forwards").Cells(x1(i) + 11, 7).Value + 12 * (j - 1))) / 30
             g(i) = (x(i) - x1(i)) * 30
            Cells(i, 11).FormulaR1C1 = Cells(i, 10).Value / (1 + T(j)) ^ p(j) + 100 / (1 + T(v(i) + 1)) ^ p(v(i) + 1)
        Next j
    Next i
    
End Sub
merci d'avance
 

Paritec

XLDnaute Barbatruc
Re : recherche de code.

Re Dianbobo le forum,
alors redim n'est pas sensé le faire il le fait mais encore faut-il lui demander gentiment!!!
pour dimensionner redim v1 (4,2) te donnera un tableau de 4 lignes 2 colonnes alors ta manière de les déclarer à mon avis n'est pas bonne
maintenant si tu fais un exemple de ton fichier avec ce que tu as et des explications dans le fichiers, au besoin un petit exemple du résultat souhaité et tu vas avoir des réponses
moi sans fichier je ne cherche même pas
a+
papou :)
 

dianbobo

XLDnaute Junior
Re : recherche de code.

Code:
Option Base 1

Sub prixspot()
    Dim x() As Double, T() As Double, p() As Double, g() As Double
    Dim i As Integer, j As Integer, x1() As Integer, x2() As Integer, v() As Integer
    Dim somme() As Single
    ReDim x(1000, 1), T(1000, 1), p(1000, 1), g(1000, 1), v(1000, 1), x1(1000, 1), x2(1000, 1), somme(1000, 1)
    
    For i = 6 To Cells(Rows.Count, 1).End(xlUp).Row
        somme(i) = 0
    
        '   NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
        'NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360
        x(i) = Cells(i, 15).Value / 30 'conversion du nombre de jours en mois a la ligne i
        x1(i) = Int(x(i)) 'partie entiere de x(i)
        x2(i) = x1(i) + 1
        v(i) = Cells(i, 14).Value ' nombre d'année de la ligne i
        g(i) = (x(i) - x1(i)) * 30
        While v(i) > 0
                For j = 1 To v(i)
                     p(j) = x(i) / 12 + (j - 1)
                        T(j) = (g(i) * Worksheets("Forwards").Cells(x2(i) + 11, 7).Value + 12 * (j - 1) + (30 - g(i)) * (Worksheets("Forwards").Cells(x1(i) + 11, 7).Value + 12 * (j - 1))) / 30
                        g(i) = (x(i) - x1(i)) * 30
                        somme(i) = Cells(i, 13).Value / (1 + T(j)) ^ p(j) + 100 / (1 + T(v(i)) ^ p(v(i)))
                Next j
        Wend
        somme(i) = somme(i)
        Cells(i, 11).FormulaR1C1 = "=somme(i)"
    Next i
    
    
End Sub

mon fichier n'arrive pas a etre joins on dirai que je ne peu pas faire un envoi a l'exterieur alors je vais mettre ci dessous son contenu.
dans la feuil1 j'ai un tableau de h6 a o11
en colonne H j'ai
h6=Date fin contrat
h7=11/08/2010
h8=11/04/2012
h9=03/10/2011
h10=16/04/2012
h11=22/07/2013
en colonne k j'ai
k6=spot
k7=? k8=? k9=? k10=? k11=? (c'est la colonne pour faire la somme)
en colonne L J'ai
L6=Dte Premier coupon
L7=vide
L8=11/04/2011
L9=03/10/2011
L10=16/04/2011
L11=22/07/2011
en colonne M j'ai
m6=TF-Post
m7=3,13
m8=0,25
m9=0,50
m10=4,50
m11=5,00
en colonne N
n6=Nombre D'années
n7=0
n8=3
n9=2
n10=5
n11=3
en colonne O j'ai
o6=Nbre de jours
o7=vide
o8=40644
o9=40819
o10=40649
o11=40746
dans ma feuille 2 ("forwards) j'ai une colonne de valeur a partir de la ligne 5 en colonne G

je m'explique dans la colonne en jaune je voudrai avoir des resultats de la façon ci-dessous:
1)la cellule L7 etant vide alors on va a la cellule suivante
pour calculer K8 j'ai besoin de:
*du nombre d'anné entre aujourd'hui et H8 =N8 (ce nombre d'année est en N8)
*du nombre de jours entre aujourd'hui et L8
ensuite je converti ce nombre de jours en mois 'dans ma macro c'est mon tableau "x"
x(8)=O8/30
*j'evalue la partie entiere de x(8) dans ma macro j'ai mi
x1(8)=Int(x(8))
*j'ajoute +1 a la partie entiere
x2(8)=x1(8)+1
*ma boucle sur j parcourt le nombre d'année dans ma macro j'ai mi: v(8)=N8
*ma condition while c'est pour dire que je fait la boucle sur j tant que mon nombre d'année est >0
pour K8 j'evalue alors p(j) j=1 jusqu'à v(8) ou v(8) est le nombre d'anné en N8 DONC P(j)=x(8)/12+(j-1) puis j'evalue T(j)=(g(i)*(worksheets("feuil2")Cells(x1(8)+11,7)+12*(j-1))+(30-g(i))*(worksheets("feuil2")cells(x2(8)+11,7)+12*(j-1))/30
enfin je veux faire la somme ci-dessous SUPPOSONS par exemlpe qu'on a 3 ans en N8 donc:
K8=M8*(1/(1+T(1))^P(1)+1/(1+T(2))^P(2)+1/(1+T(3))^P(3))+100/1/(1+T(3))^P(3)

puis appliquer ce procedé en K9,k10,,,jusqua la derniere cellule K87 EN fait la derniere cellule n'est pas fixe elle est variable elle depend de la derniercellule non vide de la colonne H par exemple ,
DESOLE d'etre si long

merci de votre aide.
 

dianbobo

XLDnaute Junior
Re : recherche de code.

voila je vais expliquer ici le resultat attendu
j'ai des colonne dans ma feuille excel
colonne N a partir de la ligne 6 jusqu'a la ligne 195 :
Code:
v()=[5,1,6,4,....,3] donc v(6)=5,v(7)=1,.....,v(195)=3
raison pour laquelle j'ai defini le tableau v()
en colonne O de la ligne 6 a la ligne 195
Code:
x()=[10.33,11.55,8,...,12.33,12] x(6)=10.33,x(7)=11.55 ,..,x(195)=12
raison pour laquelle j'ai defini le tableau x()

mon objectif c'est de remplir le tableau
Code:
somme()=[................]
qui est ma colonne K toujours de la ligne 6 a la ligne 195
pour ce faire j'ai creer d'autres tableaux qui me sont utiles :
Code:
x1()=Int(x)=[10,11,8,...,12,12] (int=partie entiere de x) donc x1(6)=10,x1(7)=11...
Code:
x2()=x1()+1=[11,12,9,...,13,13] x2(6)=11,...g()=(x()-Int(x()))*30=[0.33*30,0.55*30,0,...,0.33*30,0] donc  g(6)=0.33*30,...
pour faire ma somme je dois parcourir chaque element du tableau d'ou ma boucle i ,une fois i est fixé je fais
for j=1 à v(i) prenons un exemple:
fixons i=6 j'aurai :
Code:
x(6)=10.33;x1(6)=10;x2(6)=11;v(6)=5;g(6)=0.33*30
donc je calcule selon cette boucle:
Code:
For j = 1 To v(i)
                        p(j + 5) = x(i) / 12 + (j - 1)
                        T(j + 5) = (g(i) * (forwards_x2_11x7 + 12 * (j - 1)) + (30 - g(i)) * (forwards_x1_11x7 + 12 * (j - 1))) / 30
                        somme(i) = Cells(i, 13).Value / (1 + T(j + 5)) ^ p(j + 5) + 100 / (1 + T(v(i) + 5) ^ p(v(i) + 5))
                    Next j
Code:
p(6)=x(6)/12;p(7)=x(6)/12+1;p(8)=x(6)/12+2;p(9)=x(6)/12+3;p(10)=x(6)/12+4 puis je calcule 
T(6)=(g(6) * (forwards_x2_11x7 ) + (30 - g(6)) * (forwards_x1_11x7 )) / 30
T(7)=(g(6) * (forwards_x2_11x7 + 12 ) + (30 - g(6)) * (forwards_x1_11x7 + 12 )) / 30
T(8)=(g(6) * (forwards_x2_11x7 + 12 * 2) + (30 - g(6)) * (forwards_x1_11x7 + 12 * 2)) / 30
T(9)=(g(6) * (forwards_x2_11x7 + 12 * 3) + (30 - g(6)) * (forwards_x1_11x7 + 12 * 3)) / 30
T(10)=(g(6) * (forwards_x2_11x7 + 12 * 4) + (30 - g(6)) * (forwards_x1_11x7 + 12 * 4)) / 30
ouf enfin je fais ma somme(6)
Code:
somme(6)=cells(6,13).value*(1/(1+T(6))^p(6)+1/(1+T(7))^p(7)+1/(1+T(8))^p(8)+1/(1+T(9))^p(9)+1/(1+T(10))^p(10))+100/(1+T(10))^p(10)
puis je met
Code:
somme(6) dans cells(6,11)
voila j'espere avoir mieux eclairci le probleme
dont voici le code:
Code:
Sub Prixspot()


    Dim k As Long
    Dim x() As Double
    Dim T() As Double
    Dim p() As Double, g() As Double
    Dim i As Integer, j As Integer
    Dim x1() As Integer, x2() As Integer
    Dim v() As Integer
    Dim somme() As Single
    Dim forwards_x2_11x7 As Double
    Dim forwards_x1_11x7 As Double
    k = Cells(Rows.Count, 1).End(xlUp).Row
    ReDim x(6 To k), T(6 To k)
    ReDim p(6 To k), g(6 To k)
    ReDim v(6 To k)
    ReDim x1(6 To k), x2(6 To k)
    ReDim somme(6 To k)
    
    For i = 6 To k
        If Cells(i, 15).Value <> "" Then
            somme(i) = 0
            x(i) = Cells(i, 15).Value  'conversion du nombre de jours en mois a la ligne i
            x1(i) = Int(x(i)) 'partie entiere de x(i)
            x2(i) = x1(i) + 1
            v(i) = Cells(i, 14).Value ' nombre d'année de la ligne i
            g(i) = (x(i) - x1(i)) * 30
            forwards_x2_11x7 = Worksheets("Forwards").Cells(x2(i) + 11, 7).Value
            forwards_x1_11x7 = Worksheets("Forwards").Cells(x1(i) + 11, 7).Value
            If v(i) > 0 Then
                 
                    For j = 1 To v(i)
                        p(j + 5) = x(i) / 12 + (j - 1)
                        T(j + 5) = (g(i) * (forwards_x2_11x7 + 12 * (j - 1)) + (30 - g(i)) * (forwards_x1_11x7 + 12 * (j - 1))) / 30
                        somme(i) = Cells(i, 13).Value / (1 + T(j + 5)) ^ p(j + 5) + 100 / (1 + T(v(i) + 5) ^ p(v(i) + 5))
                    Next j
            End If
             
        
        somme(i) = somme(i)
        Cells(i, 11).Value = somme(i)
        End If
    Next i
end sub
le code tourne deja mais ma somme est fausse selon ce que j'ai ecrit dans ma boucle
si quelqu'un veut bien m'aider
merci d'avance
 

Discussions similaires

Réponses
5
Affichages
256
Réponses
17
Affichages
938
Réponses
0
Affichages
186

Statistiques des forums

Discussions
312 613
Messages
2 090 238
Membres
104 463
dernier inscrit
lbo