Résolu utiliser des tableaux dans le code vba

  • Auteur de la discussion dianbobo
  • Date de début

dianbobo

Expert
Bonjour, :bounce:
ci dessous c'est vraiment pas un code mais je voudrai en ecrire un qui obéit a l'algorithme ci dessous
aidez moi s'IL VOUS PLAIT
[cpp]
Sub essai()
'date d'echéance
Dim a, alpha, j, beta As Double
a = Cells(i, 8).Date 'se sont les dates d'echeances qui sont stockeés a la colonne H A partir de la ligne 5
Cells(2, 1) = aujourdhui
alpha(i) = (a - Cells(2, 1).Data) / 360 'nombre d'année entre la date d'echeance et aujourd'hui
beta(i) = Int(alpha(i)) + 1
'date du premier coupon
d(i) = Cells(i, 10).Date 'ce sont des dates qui existent en colonne J

nbredejour(i) = d(i) - Cells(2, 1) 'nombre de jours ENTRE AUJOURDHUI et la date du premier coupon
'soit la variable x qui est égale : le nombre de jours /30
Dim x As Double
Dim t1, t2 As Integer
x(i) = d(i) - Cells(2, 1)
t1(i) = Int(x) 'partie entiere de x
t2(i) = x1 + 1
j(i) = (x(i) - t1(i)) * 30 'calcul du nombre de jours compris dans x mois
' definir p1
Dim p1 As Double
p1 = x / 12
For i = 2 To beta
p(i) = p1 + (i - 1) 'les p(i) sont des valeurs en exposant dans ma formule

Next i
'calcul des T(i)
For i = 1 To beta
T(i) = (j(i) * (Sheets("Feuil2").Cells(t2(i) + 11, 7).Value + 12 * (i - 1)) + (30 - j(i)) * (Sheets("Feuil2").Cells(t1(i) + 11, 7).Value + 12 * (i - 1))) / 30
Next i

'calcul de la valeur spot c'est une somme pour i=1 à beta de tf/(1+T(i))^P(i)+100/(1+T(beta))^P(beta)
Dim Pspot As Double
Pspot = 0
'la je veux ecrire une boucle for jusqu'a la derniere ligne non vide


For i = 1 To beta
Pspot = tf / (1 + T(i)) ^ p(i) + 100 / (1 + T(i = beta)) ^ p(i = beta)
Pspot = Pspot + 1
Next i
'enfin je veux retourner Pspot dans chacune des cellules de la colonne L
'en fait Pspot est une somme que je calculer pour chaque valeur de beta et mettre le resultat de cette somme dans une cellule a la colonne L
'sachant bien que les dates d'echeances changes donc modifient les calculs






End Sub[/cpp]



merci d'avance
 

zeb

Modérateur
Bonjour,

Tu le sais, nous ne faisons pas de développement à la demande.
 

dianbobo

Expert
bonjour j'ai envi d'ecrire la formule ci-dessous dans un code en faisant varier les indices de la colonne L DE i=6 jusqu'a 100 par exemple

[cpp]NombreDeJour(i) = Range("L6") - Range("A2")

NombreDeJour(i) = Range("L7") - Range("A2")
NombreDeJour(i) = Range("L8") - Range("A2").........[/cpp]

merci de votre aide
 

zeb

Modérateur
Utilise Cells() au lieu de Range().

N'utilise pas Range("L6") tout seul. Précise à Excel que c'est la valeur qui t'intéresse. Ça évite les effets de bord dans certains cas. Si tu remplaces Range() par Cells(), même topo.
 

dianbobo

Expert
voila comment je l'ai ecrit :

[cpp]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[/cpp]

en cells(i,12),cells(2,1) et cells(i,8) se sont des dates
est ce que par exemple cells(i,12).value va me chercher le nombre qui correspond a la date ou la date elle meme
moi je veux qu'il me recupere le nombre qui correspond a la date

merci d'avance
 

zeb

Modérateur
RTFM : Et si tu prenais la peine de demander à Excel !!!!!
 

dianbobo

Expert
:) j'ai parlé avec excel sauf qu'il ne peu pas repondre a la question ci -dessous :non:
:( voila je croix que j'ai vu les premieres erreurs que j'ai faites
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
il a encore des erreurs :"incompatibilité de type"



[cpp]
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[/cpp]
merci d'avance
 

zeb

Modérateur
C'est très curieux, quand je demande de l'aide sur Date à Excel, voici sa réponse :

Date, type de données

Les variables de type Date sont stockées sous la forme de nombres à virgule flottante de 64 bits (8 octets) IEEE représentant des dates comprises entre le 1er janvier 100 et le 31 décembre 9999, et des heures allant de 0:00:00 à 23:59:59. Toute valeur de littéral date peut être attribuée à une variable de type Date. Les littéraux date doivent être délimités par le signe #, par exemple #January 1, 1993# ou #1 Jan 93#.

Les variables de type Date affichent les dates au format de date abrégé reconnu par votre ordinateur. Les heures s'affichent au format horaire (plage de 12 ou 24 heures) défini dans votre ordinateur.

Lorsque d'autres types de données numériques sont convertis en données de type Date, les valeurs situées à gauche du séparateur décimal représentent la date, tandis que celles situées à droite correspondent à l'heure. Minuit est représenté par 0 et midi par 0,5. Les nombres entiers négatifs représentent des dates antérieures au 30 décembre 1899.

-----------------------------------

:pfff:
Dianbobo, j'en ai marre de te répéter 1000 fois les mêmes choses.
Quand tu as une erreur, merci de dire à quelle ligne
[:zeb:4]

-----------------------------------

Tu n'as pas dimensionné tes tableaux. Fais-le.
Si tu ne sais pas de quoi je parle, RTFM : sélectionne le mot Dim dans ton code et appuie sur la touche F1. C'est l'élément subscripts.
Tant qu'à faire, regarde aussi l'aide sur ReDim.

-----------------------------------

Code:
Worksheets("&Forwards&" )
Mais qu'est-ce que tu cherches à faire ????? :??:
(C'est le nom de ta feuille ? - Si oui, je n'ai rien dit ;) )
 

dianbobo

Expert
ai-je bien compris les consignes :??:

[cpp]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[/cpp]

est ce de cette façon que je dois redimensionner les tableaux avec une boucle for comme je viens de le faire :??:

dans mon erreur on ne m'indique pas le la ligne mais il y a juste une boite de dialogue qui s'ouvre : "incompatibilité de type" c'est ce qui est ecrit dans la boite de dialogue :(
 

zeb

Modérateur
Si on t'indique une ligne : elle est surlignée en jaune quand la boîte de dialogue d'affiche.

Ligne 5. Mais lis la doc bon sang et ne fais pas n'importe quoi !
Quelle est la valeur de ta variable i quand tu fais tes ReDim ?

(En répondant à la question, tu auras la réponse à ta question)
 

dianbobo

Expert
bonjour tout le monde
j'ai modifé la ligne 5 et réecrit le code comme ci-dessous
dans ma boucle for je veux aller de i=6 jusqu'a la derniere ligne de la feuille non vide
et j'ai mi ceci:
[cpp]For i = 6 To Cells(Rows.Count, 1).End(xlUp).Row[/cpp]

aussi j'ai lu l'aide pour la fonction ReDim est ce correct mon ecriture a la ligne 6 :??:

[cpp]Option Base 1
Sub prixspot()
Dim NombreDeJour(), NbreAnnées() As Variant
Dim x(), T(), p(), g() As Double
Dim i As Integer, j As Integer, x1() As Integer, x2() As Integer, v() As Integer, k As Integer
ReDim NombreDeJour(1 To k), NbreAnnées(1 To k), x(1 To k), T(1 To k), p(1 To k), g(1 To k), v(1 To k), x1(1 To k), x2(1 To k)
k = 1000

For i = 6 To Cells(Rows.Count, 1).End(xlUp).Row
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, 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[/cpp]

j'ai essayé de l'executer mais j'ai une erreur : "l'indice n'appartient pas a la selection" et lorsque ma boite de dialogue se ferme ,je parle là de celle qui m'indique l'erreur je n'ai aucune ligne en surbrillance :(
là je refléchit mais je ne vois pas ce qui cloche

merci d'avance
 

zeb

Modérateur
En plus de lire la doc, il faut réfléchir.

Code:
Dim x()
Ceci déclare un tableau qui s'appelle x, de 0 case. C'est pas beaucoup :o

Code:
ReDim x(k)
Ceci redimensionne le tableau x de k cases. Si k n'est pas définit, il est égale à ... ZERO. Donc tu viens de redimensionner ton tableau à 0 case. C'est toujours pas beaucoup :o

:pfff:
 

zeb

Modérateur
Dianbobo, tu m'énerves (*) :fou:
Pourquoi ?
Parce ce que tu ne comprends rien !
Pourquoi ?
Ben ... peut être parce que j'explique mal !
Et c'est cette éventualité qui m'énerve le plus :fou: :fou: :fou:

______________
(*) Ce n'est pas pour autant que je vais arrêter de t'aider ;)
 

dianbobo

Expert
:( je comprend que Zed sois enervé a mon avis c'est moi qui comprend pas grand chose de ses explications et pourtant elles sont claires

je crois que cette fois j'ai redimensionné mes tableaux correctement dans le code ci-dessous:

[cpp]
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
ReDim x(1000), T(1000), p(1000), g(1000), v(1000), x1(1000), x2(1000)

For i = 6 To Cells(Rows.Count, 1).End(xlUp).Row

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 (c'est uenvaleur entiere) i

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
Cells(i, 11).FormulaR1C1 = "= Cells(i, 10).Value / (1 + T(j)) ^ p(j) + 100 / (1 + T(v(i)) ^ p(v(i))"
Next j
Next i


End Sub[/cpp]


de plus j'ai un tout petit peu modifié le code car j'ai pu calcculer en colonne N et O respectivement le nombre de jours et le nombre d'années :)

mais le code a toujours la meme erreur :"l'indice n'appartient pas a la selection"

merci d'avance
 

dianbobo

Expert
ou bien je devais l'ecrire comme ci-dessous :??: :

[cpp]1.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
ReDim x(1000,1), T(1000,1), p(1000,1), g(1000,1), v(1000,1), x1(1000,1), x2(1000,1)

For i = 6 To Cells(Rows.Count, 1).End(xlUp).Row

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 (c'est uenvaleur entiere) i

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 Cells(i, 11).FormulaR1C1 = "= Cells(i, 10).Value / (1 + T(j)) ^ p(j) + 100 / (1 + T(v(i)) ^ p(v(i))"
Next j
Next i


End Sub[/cpp]

et ci dessous j'explique ce que je fais dans mon code

voile le contenu de mon classeur excel ce n'est qu'un exemple
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 K 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)
K8=somme(8)

puis appliquer ce procedé en K9,k10,,,jusqua la derniere cellule K11 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.
 

zeb

Modérateur
T'as le droit d'être long ;)

Code:
ReDim x(1000,1)
Mais qu'est-ce que tu inventes encore :pfff:

Ça c'est bon (j'ai simplifié) :
Code:
Dim x() As Double
ReDim x(1000)
Mais c'est mieux directement comme ça :
Code:
Dim x(1000) As Double
Ça c'est toujours bon :
Code:
Dim x() As Double
ReDim x(1000)

For i = 6 To Cells(Rows.Count, 1).End(xlUp).Row
   x(i)=...
Mais dans ce vas, autant dimensionner au plus juste :
Code:
Dim k As Long
Dim x() As Double

k = Cells(Rows.Count, 1).End(xlUp).Row

ReDim x(6 To k)

For i = 6 To k
   x(i)=...
As-tu bien compris ? Et bien regarde-le encore ! :o ... ;)

Ligne 18, pourquoi tu te mets en FormulaR1C1 ? Utilise Formula, c'est plus simple. En parlant de la ligne 18, je t'invite à mieux regarder ce que tu veux mettre dans ta formule.

Alors maintenant, voilà comment "voir" ta ligne en jaune.

Juste après la ligne Sub prixspot(), tu mets sur une nouvelle ligne vide, le mot Stop et tu lances ta macro. Que se passe-t-il alors ?????? Ben comme son nom l'indique, l'instruction Stop interrompt ta macro. A partir de maintenant, tu vas bien regarder la ligne surlignée en jaune et tu vas appuyer sur [F8]. Au moment où ça pète, ton erreur sera là !

Bon, alors comme je ne sais pas où est ton erreur,
 

dianbobo

Expert
voila je crois que j'ai bien compri les explicatin

[cpp]Option Base 1
Sub Prixspot()

Stop
Dim k As Long
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(6 To k), T(6 To k), p(6 To k), g(6 To k), v(6 To k), x1(6 To k), x2(6 To k), somme(6 To k)
k = Cells(Rows.Count, 1).End(xlUp).Row
For i = 6 To k
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, 1) = Int(x(i, 1)) '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, 1) + 11, 7).Value + 12 * (j - 1) + (30 - g(i)) * (Worksheets("Forwards").Cells(x1(i, 1) + 11, 7).Value + 12 * (j - 1))) / 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).Formula = "=somme(i)"
Next i



End Sub[/cpp]

c'est a la ligne 9 qu'il y a l'erreur lorsque je fait F8 une boite de dialogue s'ouvre et dit : erreur d'execution '9' l'indice n'appartient pas a la selection

merci d'avance :)
 

zeb

Modérateur
grrrrrrrrrr !!!!!!!

Mais c'est donc que tu n'as rien compris :fou: :fou: :fou: :fou:
C'est que j'explique si mal que ça ???? :ouch: :ouch: :ouch: :ouch:

A quoi k est-il égal, à la ligne 11 ?
A quoi k est-il égal, à la ligne 9 ?
A quoi k devrait-il être égal, à la ligne 9 ?

Conclusion : ...

Tips : Regarder encore et encore et encore le code que j'ai proposé.

----------------------------

Ta formule, ligne 29 est fausse. :o
 

dianbobo

Expert
:(
je ne suis pas sur d'avoir bien compris

sauf qu'avec ce que j'ai ecrit ci-dessous je n'ai plus d'erreur a la ligne 8 du code ci-dessosu mais a l'aide toujours de F8 j'ai une reereur a la ligne 23
et ma ligne 28 [cpp]Cells(i, 11).Value = somme(i) [/cpp]est t'elle toujours fausse :??:

[cpp]Sub Prixspot()

Stop
Dim k As Long
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(6 To Cells(Rows.Count, 1).End(xlUp).Row), T(6 To Cells(Rows.Count, 1).End(xlUp).Row), p(6 To Cells(Rows.Count, 1).End(xlUp).Row), g(6 To Cells(Rows.Count, 1).End(xlUp).Row), v(6 To Cells(Rows.Count, 1).End(xlUp).Row), x1(6 To Cells(Rows.Count, 1).End(xlUp).Row), x2(6 To Cells(Rows.Count, 1).End(xlUp).Row), somme(6 To Cells(Rows.Count, 1).End(xlUp).Row)
k = Cells(Rows.Count, 1).End(xlUp).Row
For i = 6 To k
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, 1) + 11, 7).Value + 12 * (j - 1) + (30 - g(i)) * (Worksheets("Forwards").Cells(x1(i, 1) + 11, 7).Value + 12 * (j - 1))) / 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).Value = somme(i)
Next i



End Sub[/cpp]

desolé si je ne comprend pas vite
sinon merci de votre aide elle m'est precieuse :)
 

zeb

Modérateur
Dis-moi tu ;)

--------------------------------

Code:
Dim k As Long
Dim x() As Double
ReDim x(6 To Cells(Rows.Count, 1).End(xlUp).Row)
k = Cells(Rows.Count, 1).End(xlUp).Row

M'enfin ! C'est bon, oui. Mais c'est très bête de faire deux fois le même calcul.
Pourquoi, nom d'un clic de souris, ne veux-tu pas regarder le code que je te proposais ????

Je te le refais :
Code:
Dim k As Long
Dim x() As Double
k = Cells(Rows.Count, 1).End(xlUp).Row
ReDim x(6 To k)

Qu'est-ce qui ne te paraît pas évident ?

--------------------------------

Abandonne l'utilisation de While .. Wend.
Utilise Do While / Loop à la place.
C'est une histoire d'obsolescence et de compatibilité.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 018
Membres
1 586 388
Dernier membre
mery2005
Partager cette page
Haut