Se connecter avec
S'enregistrer | Connectez-vous

utiliser des tableaux dans le code vba

Dernière réponse : dans Programmation

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
  1. Sub essai()
  2. 'date d'echéance
  3. Dim a, alpha, j, beta As Double
  4. 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
  5. Cells(2, 1) = aujourdhui
  6. alpha(i) = (a - Cells(2, 1).Data) / 360 'nombre d'année entre la date d'echeance et aujourd'hui
  7. beta(i) = Int(alpha(i)) + 1
  8. 'date du premier coupon
  9. d(i) = Cells(i, 10).Date 'ce sont des dates qui existent en colonne J
  10.  
  11. nbredejour(i) = d(i) - Cells(2, 1) 'nombre de jours ENTRE AUJOURDHUI et la date du premier coupon
  12. 'soit la variable x qui est égale : le nombre de jours /30
  13. Dim x As Double
  14. Dim t1, t2 As Integer
  15. x(i) = d(i) - Cells(2, 1)
  16. t1(i) = Int(x) 'partie entiere de x
  17. t2(i) = x1 + 1
  18. j(i) = (x(i) - t1(i)) * 30 'calcul du nombre de jours compris dans x mois
  19. ' definir p1
  20. Dim p1 As Double
  21. p1 = x / 12
  22. For i = 2 To beta
  23. p(i) = p1 + (i - 1) 'les p(i) sont des valeurs en exposant dans ma formule
  24.  
  25. Next i
  26. 'calcul des T(i)
  27. For i = 1 To beta
  28. 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
  29. Next i
  30.  
  31. '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)
  32. Dim Pspot As Double
  33. Pspot = 0
  34. 'la je veux ecrire une boucle for jusqu'a la derniere ligne non vide
  35.  
  36.  
  37. For i = 1 To beta
  38. Pspot = tf / (1 + T(i)) ^ p(i) + 100 / (1 + T(i = beta)) ^ p(i = beta)
  39. Pspot = Pspot + 1
  40. Next i
  41. 'enfin je veux retourner Pspot dans chacune des cellules de la colonne L
  42. '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
  43. 'sachant bien que les dates d'echeances changes donc modifient les calculs
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50. End Sub




merci d'avance

Autres pages sur : utiliser tableaux code vba

Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

Voilà :
  1. Dim i As Long
  2. Dim j As Integer
  3. Dim g As Double
  4. Dim T As Double
  5. Dim P As Double
  6. Dim nb_mois As Double
  7. Dim nb_annee As Integer
  8. Dim somme As Single
  9. Dim forwards_10x7 As Double
  10. Dim forwards_11x7 As Double
  11.  
  12. For i = 0 To Cells(Rows.Count, 1).End(xlUp).Row - 6
  13. If Cells(i + 6, 15).Value <> "" Then
  14. nb_annee = Cells(i + 6, 14).Value
  15. If nb_annee > 0 Then
  16. nb_mois = (Cells(i + 6, 15).Value Mod 360) / 30
  17. somme = 0
  18. g = (nb_mois - Int(nb_mois)) * 30
  19. forwards_10x7 = Worksheets("Forwards").Cells(Int(nb_mois) + 10, 7).Value
  20. forwards_11x7 = Worksheets("Forwards").Cells(Int(nb_mois) + 11, 7).Value
  21. For j = 0 To nb_annee - 1
  22. P = nb_mois / 12 + j
  23. T = (g * (forwards_10x7 + 12 * j) + (30 - g) * (forwards_11x7 + 12 * j)) / 3000
  24. somme = somme + Cells(i + 6, 13).Value / (1 + T ^ P)
  25. Next
  26. P = nb_mois / 12 + nb_annee - 1
  27. T = (g * (forwards_10x7 + 12 * (nb_annee - 1)) + (30 - g) * (forwards_11x7 + 12 * (nb_annee - 1))) / 3000
  28. somme = somme + 100 / (1 + T ^ P)
  29. Cells(i + 6, 11).Value = somme
  30. End If
  31. End If
  32. Next


J'ai mis un modulo à la ligne 16. C'est comme ça qu'on récupère le reste d'une division.
Comme je suis informaticien, je veux que mes boucles commencent à zéro, c'est comme ça. :spamafote: 

Alors, n'est-ce pas clair ?

Je pense que ça paraîtra encore plus évident quand les variables auront des noms plus intelligents. forwards_10x7 et forwards_11x7, c'est nul ! (oui, je sais, c'est de moi).

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

  1. NombreDeJour(i) = Range("L6") - Range("A2")
  2.  
  3. NombreDeJour(i) = Range("L7") - Range("A2")
  4. NombreDeJour(i) = Range("L8") - Range("A2").........


merci de votre aide
Expert Programmation

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.

voila comment je l'ai ecrit :

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


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

:)  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"



  1. Option Base 1
  2.  
  3. Sub prixspot()
  4. Dim NombreDeJour(), NbreAnnées() As Double
  5. Dim x(), T(), p(), g() As Double
  6. Dim i As Integer, j As Integer, x1() As Integer, x2() As Integer, v() As Integer
  7. For i = 6 To 10000
  8. NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
  9. NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360
  10. x(i) = NombreDeJour(i) / 30 'conversion du nombre de jours en mois a la ligne i
  11. x1(i) = Int(x(i)) 'partie entiere de x(i)
  12. x2(i) = x1(i) + 1
  13. v(i) = Int(NbreAnnées(i)) 'partie entiere du nombre d'année de la ligne i
  14.  
  15. For j = 1 To v(i) + 1
  16. p(j) = x(i) / 12 + (j - 1)
  17. 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
  18. g(i) = (x(i) - x1(i)) * 30
  19. Cells(i, 11).FormulaR1C1 = Cells(i, 10).Value / (1 + T(j)) ^ p(j) + 100 / (1 + T(v(i) + 1)) ^ p(v(i) + 1)
  20. Next j
  21. Next i
  22.  
  23. End Sub

merci d'avance
Expert Programmation

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

Citation :
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.

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

  1. Worksheets("&Forwards&" )

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

ai-je bien compris les consignes :??: 

  1. Sub prixspot()
  2. Dim NombreDeJour(), NbreAnnées() As Double
  3. Dim x(), T(), p(), g() As Double
  4. Dim i As Integer, j As Integer, x1() As Integer, x2() As Integer, v() As Integer
  5. [b]ReDim NombreDeJour(i), NbreAnnées(i), x(i), T(i), p(i), g(i), v(i), x1(i), x2(i)
  6. For i = 6 To 10000
  7. NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
  8. NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360
  9. x(i) = NombreDeJour(i) / 30 'conversion du nombre de jours en mois a la ligne i
  10. x1(i) = Int(x(i)) 'partie entiere de x(i)
  11. x2(i) = x1(i) + 1
  12. v(i) = Int(NbreAnnées(i)) 'partie entiere du nombre d'année de la ligne i
  13. Next i[/b]
  14. For i = 6 To 10000
  15. NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
  16. NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360
  17. x(i) = NombreDeJour(i) / 30 'conversion du nombre de jours en mois a la ligne i
  18. x1(i) = Int(x(i)) 'partie entiere de x(i)
  19. x2(i) = x1(i) + 1
  20. v(i) = Int(NbreAnnées(i)) 'partie entiere du nombre d'année de la ligne i
  21.  
  22. For j = 1 To UBound(v)
  23. p(j) = x(i) / 12 + (j - 1)
  24. 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
  25. g(i) = (x(i) - x1(i)) * 30
  26. Cells(i, 11).FormulaR1C1 = Cells(i, 10).Value / (1 + T(j)) ^ p(j) + 100 / (1 + T(v(i) + 1)) ^ p(v(i) + 1)
  27. Next j
  28. Next i
  29.  
  30. End Sub


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 :( 
Expert Programmation

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)

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


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

  1. Option Base 1
  2. Sub prixspot()
  3. Dim NombreDeJour(), NbreAnnées() As Variant
  4. Dim x(), T(), p(), g() As Double
  5. Dim i As Integer, j As Integer, x1() As Integer, x2() As Integer, v() As Integer, k As Integer
  6. 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)
  7. k = 1000
  8.  
  9. For i = 6 To Cells(Rows.Count, 1).End(xlUp).Row
  10. NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
  11. NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360
  12. x(i) = NombreDeJour(i) / 30 'conversion du nombre de jours en mois a la ligne i
  13. x1(i) = Int(x(i)) 'partie entiere de x(i)
  14. x2(i) = x1(i) + 1
  15. v(i) = Int(NbreAnnées(i)) 'partie entiere du nombre d'année de la ligne i
  16.  
  17. For j = 1 To UBound(v, 1)
  18. p(j) = x(i) / 12 + (j - 1)
  19. 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
  20. g(i) = (x(i) - x1(i)) * 30
  21. Cells(i, 11).FormulaR1C1 = Cells(i, 10).Value / (1 + T(j)) ^ p(j) + 100 / (1 + T(v(i) + 1)) ^ p(v(i) + 1)
  22. Next j
  23. Next i
  24.  
  25.  
  26. End Sub


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
Expert Programmation

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

  1. Dim x()

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

  1. 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: 
Expert Programmation

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 ;) 

:(  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:

  1. Option Base 1
  2. Sub prixspot()
  3. Dim x() As Double, T() As Double, p() As Double, g() As Double
  4. Dim i As Integer, j As Integer, x1() As Integer, x2() As Integer, v() As Integer
  5. ReDim x(1000), T(1000), p(1000), g(1000), v(1000), x1(1000), x2(1000)
  6.  
  7. For i = 6 To Cells(Rows.Count, 1).End(xlUp).Row
  8.  
  9. x(i) = Cells(i, 15).Value / 30 'conversion du nombre de jours en mois a la ligne i
  10. x1(i) = Int(x(i)) 'partie entiere de x(i)
  11. x2(i) = x1(i) + 1
  12. v(i) = Cells(i, 14).Value ' nombre d'année de la ligne (c'est uenvaleur entiere) i
  13.  
  14. For j = 1 To v(i)
  15. p(j) = x(i) / 12 + (j - 1)
  16. 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
  17. g(i) = (x(i) - x1(i)) * 30
  18. Cells(i, 11).FormulaR1C1 = "= Cells(i, 10).Value / (1 + T(j)) ^ p(j) + 100 / (1 + T(v(i)) ^ p(v(i))"
  19. Next j
  20. Next i
  21.  
  22.  
  23. End Sub



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

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

  1. 1.Option Base 1
  2. Sub prixspot()
  3. Dim x() As Double, T() As Double, p() As Double, g() As Double
  4. Dim i As Integer, j As Integer, x1() As Integer, x2() As Integer, v() As Integer
  5. ReDim x(1000,1), T(1000,1), p(1000,1), g(1000,1), v(1000,1), x1(1000,1), x2(1000,1)
  6.  
  7. For i = 6 To Cells(Rows.Count, 1).End(xlUp).Row
  8.  
  9. x(i) = Cells(i, 15).Value / 30 'conversion du nombre de jours en mois a la ligne i
  10. x1(i) = Int(x(i)) 'partie entiere de x(i)
  11. x2(i) = x1(i) + 1 v(i) = Cells(i, 14).Value ' nombre d'année de la ligne (c'est uenvaleur entiere) i
  12.  
  13. For j = 1 To v(i)
  14. p(j) = x(i) / 12 + (j - 1)
  15. 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
  16. 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))"
  17. Next j
  18. Next i
  19.  
  20.  
  21. End Sub


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.
Expert Programmation

T'as le droit d'être long ;) 

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

Ça c'est bon (j'ai simplifié) :
  1. Dim x() As Double
  2. ReDim x(1000)
Mais c'est mieux directement comme ça :
  1. Dim x(1000) As Double
Ça c'est toujours bon :
  1. Dim x() As Double
  2. ReDim x(1000)
  3.  
  4. For i = 6 To Cells(Rows.Count, 1).End(xlUp).Row
  5. x(i)=...
Mais dans ce vas, autant dimensionner au plus juste :
  1. Dim k As Long
  2. Dim x() As Double
  3.  
  4. k = Cells(Rows.Count, 1).End(xlUp).Row
  5.  
  6. ReDim x(6 To k)
  7.  
  8. For i = 6 To k
  9. 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,

voila je crois que j'ai bien compri les explicatin

  1. Option Base 1
  2. Sub Prixspot()
  3.  
  4. Stop
  5. Dim k As Long
  6. Dim x() As Double, T() As Double, p() As Double, g() As Double
  7. Dim i As Integer, j As Integer, x1() As Integer, x2() As Integer, v() As Integer
  8. Dim somme() As Single
  9. 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)
  10. k = Cells(Rows.Count, 1).End(xlUp).Row
  11. For i = 6 To k
  12. somme(i) = 0
  13.  
  14. ' NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
  15. 'NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360
  16. x(i) = Cells(i, 15).Value / 30 'conversion du nombre de jours en mois a la ligne i
  17. x1(i, 1) = Int(x(i, 1)) 'partie entiere de x(i)
  18. x2(i) = x1(i) + 1
  19. v(i) = Cells(i, 14).Value ' nombre d'année de la ligne i
  20. g(i) = (x(i) - x1(i)) * 30
  21. While v(i) > 0
  22. For j = 1 To v(i)
  23. p(j) = x(i) / 12 + (j - 1)
  24. 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
  25. somme(i) = Cells(i, 13).Value / (1 + T(j)) ^ p(j) + 100 / (1 + T(v(i)) ^ p(v(i)))
  26. Next j
  27. Wend
  28. somme(i) = somme(i)
  29. Cells(i, 11).Formula = "=somme(i)"
  30. Next i
  31.  
  32.  
  33.  
  34. End Sub


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 :) 
Expert Programmation

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 

:( 
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
  1. Cells(i, 11).Value = somme(i)
est t'elle toujours fausse :??: 

  1. Sub Prixspot()
  2.  
  3. Stop
  4. Dim k As Long
  5. Dim x() As Double, T() As Double, p() As Double, g() As Double
  6. Dim i As Integer, j As Integer, x1() As Integer, x2() As Integer, v() As Integer
  7. Dim somme() As Single
  8. 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)
  9. k = Cells(Rows.Count, 1).End(xlUp).Row
  10. For i = 6 To k
  11. somme(i) = 0
  12.  
  13. ' NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
  14. 'NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360
  15. x(i) = Cells(i, 15).Value / 30 'conversion du nombre de jours en mois a la ligne i
  16. x1(i) = Int(x(i)) 'partie entiere de x(i)
  17. x2(i) = x1(i) + 1
  18. v(i) = Cells(i, 14).Value ' nombre d'année de la ligne i
  19. g(i) = (x(i) - x1(i)) * 30
  20. While v(i) > 0
  21. For j = 1 To v(i)
  22. p(j) = x(i) / 12 + (j - 1)
  23. 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
  24. somme(i) = Cells(i, 13).Value / (1 + T(j)) ^ p(j) + 100 / (1 + T(v(i)) ^ p(v(i)))
  25. Next j
  26. Wend
  27. somme(i) = somme(i)
  28. Cells(i, 11).Value = somme(i)
  29. Next i
  30.  
  31.  
  32.  
  33. End Sub


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

Dis-moi tu ;) 

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

  1. Dim k As Long
  2. Dim x() As Double
  3. ReDim x(6 To Cells(Rows.Count, 1).End(xlUp).Row)
  4. 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 :
  1. Dim k As Long
  2. Dim x() As Double
  3. k = Cells(Rows.Count, 1).End(xlUp).Row
  4. 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é.

bonjour tout le monde ,bonjour Zed :) 
je crois avoir compris
en effet je faisais la chose suivante :
je definissais ReDim(6 to K) avant de declarer la valeur de K conclusion k=0 :sol: 
il fallait donc definir K avant de faire REDIM.

finalement j'ai ecris le code ci-dessous:


  1. Sub Prixspot()
  2.  
  3. Stop
  4. Dim k As Long
  5. Dim x() As Double, T() As Double
  6. Dim p() As Double, g() As Double
  7. Dim i As Integer, j As Integer
  8. Dim x1() As Integer, x2() As Integer
  9. Dim v() As Integer
  10. Dim somme() As Single
  11. k = Cells(Rows.Count, 1).End(xlUp).Row
  12. ReDim x(6 To k), T(6 To k)
  13. ReDim p(6 To k), g(6 To k)
  14. ReDim v(6 To k)
  15. ReDim x1(6 To k), x2(6 To k)
  16. ReDim somme(6 To k)
  17.  
  18. For i = 6 To k
  19. somme(i) = 0
  20.  
  21. ' NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin
  22. 'NbreAnnées(i) = (Cells(i, 8).Value - Cells(2, 1).Value) / 360
  23. x(i) = Cells(i, 15).Value / 30 'conversion du nombre de jours en mois a la ligne i
  24. x1(i) = Int(x(i)) 'partie entiere de x(i)
  25. x2(i) = x1(i) + 1
  26. v(i) = Cells(i, 14).Value ' nombre d'année de la ligne i
  27. g(i) = (x(i) - x1(i)) * 30
  28. Do While v(i) > 0
  29. For j = 1 To v(i)
  30. p(j + 5) = x(i) / 12 + (j - 1)
  31. T(j + 5) = (g(i) * (Worksheets("Forwards").Cells(x2(i) + 11, 7).Value _
  32. + 12 * (j - 1)) + (30 - g(i)) * _
  33. (Worksheets("Forwards").Cells(x1(i) + 11, 7).Value _
  34. + 12 * (j - 1))) / 30
  35.  
  36. somme(i) = Cells(i, 13).Value / (1 + T(j + 5)) ^ p(j + 5) + 100 / (1 + T(v(i)) ^ p(v(i)))
  37. Next j
  38. Exit Do
  39. 'ici je crois qu'on ne fait rien puisque je veux faire mes calculs uniquement quand v(i)>0
  40. Loop
  41.  
  42. somme(i) = somme(i)
  43. Cells(i, 11).Value = somme(i)
  44. Next i
  45.  
  46.  
  47.  
  48. End Sub


est-ce correct ic :
  1. Sub Prixspot()
  2.  
  3. Stop
  4. Dim k As Long
  5. Dim x() As Double, T() As Double
  6. Dim p() As Double, g() As Double
  7. Dim i As Integer, j As Integer
  8. Dim x1() As Integer, x2() As Integer
  9. Dim v() As Integer
  10. Dim somme() As Single
  11. k = Cells(Rows.Count, 1).End(xlUp).Row
  12. ReDim x(6 To k), T(6 To k)
  13. ReDim p(6 To k), g(6 To k)
  14. ReDim v(6 To k)
  15. ReDim x1(6 To k), x2(6 To k)
  16. ReDim somme(6 To k)
  17.  
  18. For i = 6 To k...


sauf que j'ai une erreur a la ligne 31 "incompatibilité de type"

aussi ai-je bien mis ma condition do while....loop? vu que tout ce qui m'interesse c'est faire mes calculs lorsque v(i)>0
et que pensez vous de ma formule ligne:43 :??: 

merci d'avance :) 

Expert Programmation

AAAHHHH !!!!!!!!!!
Ça y est, t'as compris, ton code Dim et ReDim est nickel :bounce: 

Je viens de mieux regarder ta boucle Do While .. Loop.
M'enfin, utilise un If !

Par contre, je ne vois pas le soucis en ligne 31.
La voilà :
  1. T(j + 5) = ( _
  2. g(i) * (Worksheets("Forwards" ).Cells(x2(i) + 11, 7).Value + 12 * (j - 1))
  3. + (30 - g(i)) * (Worksheets("Forwards" ).Cells(x1(i) + 11, 7).Value + 12 * (j - 1)) _
  4. ) / 30


Bon, je te propose ceci :
  1. Dim forwards_x2_11x7 As Double
  2. Dim forwards_x1_11x7 As Double
  3.  
  4. ...
  5.  
  6. forwards_x2_11x7 = Worksheets("Forwards" ).Cells(x2(i) + 11, 7).Value
  7. forwards_x1_11x7 = Worksheets("Forwards" ).Cells(x1(i) + 11, 7).Value
  8.  
  9. T(j + 5) = ( _
  10. g(i) * (forwards_x2_11x7 + 12 * (j - 1))
  11. + (30 - g(i)) * (forwards_x1_11x7 + 12 * (j - 1)) _
  12. ) / 30


Au moment où ça claque, tu regardes la valeur des nouvelles variables.


c'est de cette façon que je dois utiliser mon If :??:  ou je me suis encore trompé?
  1. If v(i) > 0 Then
  2. For j = 1 To v(i)
  3. p(j + 5) = x(i) / 12 + (j - 1)
  4. T(j + 5) = (g(i) * (forwards_x2_11x7 + 12 * (j - 1)) + (30 - g(i)) * (forwards_x1_11x7 + 12 * (j - 1))) / 30
  5. somme(i) = Cells(i, 13).Value / (1 + T(j + 5)) ^ p(j + 5) + 100 / (1 + T(v(i)) ^ p(v(i)))
  6. Next j
  7. End If
  8. somme(i) = somme(i)
  9. Cells(i, 11).Value = somme(i)


en plus j'ai une erreur ici:( l'indice n'appartient pas a la selection)

  1. somme(i) = Cells(i, 13).Value / (1 + T(j + 5)) ^ p(j + 5) + 100 / (1 + T(v(i)) ^ p(v(i)))


:(  je ne vois pas pourquoi cette erreur :??: 

Expert Programmation

Et bien pour ton histoire d'indice qui n'appartient pas à la sélection, je suppose que v(i) ou v(i)+1 doit dépasser k. Ça, c'est à toi de voir :o 

Je trouve que ta ligne 8 est très .. inintéressante.

Le If me semble correct.
Je ne sais pas si ta ligne 9 doit se trouver dans le If, encore une fois, c'est à toi de voir.

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 :
  1. 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
  1. 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
  1. 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 :
  1. x1()=Int(x)=[10,11,8,...,12,12] (int=partie entiere de x) donc x1(6)=10,x1(7)=11...
  2. x2()=x1()+1=[11,12,9,...,13,13] x2(6)=11,...[/code]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 :
  1. x(6)=10.33;x1(6)=10;x2(6)=11;v(6)=5;g(6)=0.33*30
donc je calcule selon cette boucle:
  1. For j = 1 To v(i)
  2. p(j + 5) = x(i) / 12 + (j - 1)
  3. T(j + 5) = (g(i) * (forwards_x2_11x7 + 12 * (j - 1)) + (30 - g(i)) * (forwards_x1_11x7 + 12 * (j - 1))) / 30
  4. somme(i) = Cells(i, 13).Value / (1 + T(j + 5)) ^ p(j + 5) + 100 / (1 + T(v(i) + 5) ^ p(v(i) + 5))
  5. Next j

  1. 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
  2. T(6)=(g(6) * (forwards_x2_11x7 ) + (30 - g(6)) * (forwards_x1_11x7 )) / 30
  3. T(7)=(g(6) * (forwards_x2_11x7 + 12 ) + (30 - g(6)) * (forwards_x1_11x7 + 12 )) / 30
  4. T(8)=(g(6) * (forwards_x2_11x7 + 12 * 2) + (30 - g(6)) * (forwards_x1_11x7 + 12 * 2)) / 30
  5. T(9)=(g(6) * (forwards_x2_11x7 + 12 * 3) + (30 - g(6)) * (forwards_x1_11x7 + 12 * 3)) / 30
  6. 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)
  1. 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
  1. somme(6) dans cells(6,11)

voila j'espere avoir mieux eclairci le probleme
dont voici le code:
  1. Sub Prixspot()
  2.  
  3.  
  4. Dim k As Long
  5. Dim x() As Double
  6. Dim T() As Double
  7. Dim p() As Double, g() As Double
  8. Dim i As Integer, j As Integer
  9. Dim x1() As Integer, x2() As Integer
  10. Dim v() As Integer
  11. Dim somme() As Single
  12. Dim forwards_x2_11x7 As Double
  13. Dim forwards_x1_11x7 As Double
  14. k = Cells(Rows.Count, 1).End(xlUp).Row
  15. ReDim x(6 To k), T(6 To k)
  16. ReDim p(6 To k), g(6 To k)
  17. ReDim v(6 To k)
  18. ReDim x1(6 To k), x2(6 To k)
  19. ReDim somme(6 To k)
  20.  
  21. For i = 6 To k
  22. If Cells(i, 15).Value <> "" Then
  23. somme(i) = 0
  24. x(i) = Cells(i, 15).Value 'conversion du nombre de jours en mois a la ligne i
  25. x1(i) = Int(x(i)) 'partie entiere de x(i)
  26. x2(i) = x1(i) + 1
  27. v(i) = Cells(i, 14).Value ' nombre d'année de la ligne i
  28. g(i) = (x(i) - x1(i)) * 30
  29. forwards_x2_11x7 = Worksheets("Forwards").Cells(x2(i) + 11, 7).Value
  30. forwards_x1_11x7 = Worksheets("Forwards").Cells(x1(i) + 11, 7).Value
  31. If v(i) > 0 Then
  32.  
  33. For j = 1 To v(i)
  34. p(j + 5) = x(i) / 12 + (j - 1)
  35. T(j + 5) = (g(i) * (forwards_x2_11x7 + 12 * (j - 1)) + (30 - g(i)) * (forwards_x1_11x7 + 12 * (j - 1))) / 30
  36. somme(i) = Cells(i, 13).Value / (1 + T(j + 5)) ^ p(j + 5) + 100 / (1 + T(v(i) + 5) ^ p(v(i) + 5))
  37. Next j
  38. End If
  39.  
  40.  
  41. somme(i) = somme(i)
  42. Cells(i, 11).Value = somme(i)
  43. End If
  44. Next i
  45. 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

bonjour tout le monde ,bonjour Zed
voici ci dessous le trvail correctement fait :bounce: 

  1. Sub Prixspot()
  2.  
  3.  
  4. Dim k As Long
  5. Dim x() As Double
  6. Dim T() As Double
  7. Dim p() As Double, g() As Double
  8. Dim i As Integer, j As Integer
  9. Dim x1() As Integer, x2() As Integer
  10. Dim v() As Integer
  11. Dim somme() As Single
  12. Dim forwards_x2_11x7 As Double
  13. Dim forwards_x1_11x7 As Double
  14. k = Cells(Rows.Count, 1).End(xlUp).Row
  15. ReDim x(6 To k), T(6 To k)
  16. ReDim p(6 To k), g(6 To k)
  17. ReDim v(6 To k)
  18. ReDim x1(6 To k), x2(6 To k)
  19. ReDim somme(6 To k)
  20.  
  21. For i = 6 To k
  22. If Cells(i, 15).Value <> "" Then
  23. somme(i) = 0
  24. If Cells(i, 15).Value > 360 Then
  25. x(i) = Abs(Cells(i, 15).Value - 360) / 30 'conversion du nombre de jours en mois a la ligne i
  26. Else
  27. x(i) = Cells(i, 15).Value / 30
  28. End If
  29. x1(i) = Int(x(i)) 'partie entiere de x(i)
  30. x2(i) = x1(i) + 1
  31. v(i) = Cells(i, 14).Value ' nombre d'année de la ligne i
  32. g(i) = (x(i) - x1(i)) * 30
  33. forwards_x2_11x7 = Worksheets("Forwards").Cells(x2(i) + 10, 7).Value
  34. forwards_x1_11x7 = Worksheets("Forwards").Cells(x1(i) + 10, 7).Value
  35. If v(i) > 0 Then
  36.  
  37. For j = 1 To v(i)
  38. p(j + 5) = x(i) / 12 + (j - 1)
  39. T(j + 5) = (g(i) * (forwards_x2_11x7 + 12 * (j - 1)) + (30 - g(i)) * (forwards_x1_11x7 + 12 * (j - 1))) / 3000
  40. somme(i) = somme(i) + Cells(i, 13).Value / (1 + T(j + 5)) ^ p(j + 5)
  41. Next j
  42. somme(i) = somme(i) + 100 / (1 + T(v(i) + 5) ^ p(v(i) + 5))
  43. Cells(i, 11).Value = somme(i)
  44.  
  45. End If
  46.  
  47.  
  48.  
  49.  
  50. End If
  51. Next i
  52.  
  53.  
  54.  
  55.  
  56. End Sub


voila et merci pour tout
grace a toi je commence a comprendre :sol: 
Expert Programmation

M'enfin, pourquoi utilises-tu des tableaux ?
Retire tous les indices de i.

Je t'ai dit que la ligne 41 ne servait à rien. Tu m'écoutes ?

A la ligne 36, tu utilises T(v(i) + 5) et p(v(i) + 5). Or ces nombres ne sont pas encore calculés !
Et tu écrases à chaque tour le contenu de somme(i). :/ 

Bon, tu m'as fait dire une connerie. Dans ton code, le If de la ligne 31 ne sert à rien. Par ce que le For ne tournera pas si v(i) est nul. Mais ne le retire pas tout de suite, il est possible que d'autres lignes devraient s'y trouver.

Citation :
grace a toi je commence a comprendre :sol: 
Ça, ça pardonne tous les énervements que tu m'as causé ;) 

BONJOUR :) 
LA JE COMPREND PAS :??: 
Retire tous les indices de i.

LA AUSSI JE NE COMPREND PAS :??: 
Et tu écrases à chaque tour le contenu de somme(i). :/


PAR CONTRE ICI
A la ligne 36, tu utilises T(v(i) + 5) et p(v(i) + 5). Or ces nombres ne sont pas encore calculés !


je fais une boucle jusqu'a v(i) pourquoi tu dis qu'il n'est pas calculé?

:sol:  là j'ai tout compris
Dans ton code, le If de la ligne 31 ne sert à rien. Par ce que le For ne tournera pas si v(i) est nul


merci bien de m'eclairer un peu plus
Expert Programmation

Retire ton doigt de la touche [Maj] :lol: 

Ça ne sert à rien d'indicer tes variables. A chaque tour de boucle, tu les réinitialises et jamais tu ne les réutilises.

Citation :
zebEt tu écrases à chaque tour le contenu de somme(i). :/ 
LA AUSSI JE NE COMPREND PAS :??: 

PAR CONTRE ICI
zebA la ligne 36, tu utilises T(v(i) + 5) et p(v(i) + 5). Or ces nombres ne sont pas encore calculés !
je fais une boucle jusqu'a v(i) pourquoi tu dis qu'il n'est pas calculé?
Bah t'as qu'à éditer tes posts et après dire que tu ne comprends pas [:zeb:4]



  1. Dim k As Long
  2. Dim i As Long
  3. Dim j As Integer
  4. Dim T() As Double
  5. Dim P() As Double
  6. Dim x As Double
  7. Dim g As Double
  8. Dim nb_annee As Integer
  9. Dim somme As Single
  10. Dim forwards_10x7 As Double
  11. Dim forwards_11x7 As Double
  12.  
  13. k = Cells(Rows.Count, 1).End(xlUp).Row
  14. ReDim P(0 To k - 6), T(0 To k - 6)
  15.  
  16. For i = 6 To k
  17. If Cells(i, 15).Value <> "" Then
  18. ' // nombre d'année de la ligne courante
  19. nb_annee = Cells(i, 14).Value
  20. If nb_annee > 0 Then
  21. If Cells(i, 15).Value > 360 Then
  22. ' // conversion du nombre de jours en mois a la ligne courante
  23. x = Abs(Cells(i, 15).Value - 360) / 30
  24. Else
  25. x = Cells(i, 15).Value / 30
  26. End If
  27. somme = 0
  28. g = (x - Int(x)) * 30
  29. forwards_10x7 = Worksheets("Forwards").Cells(Int(x) + 10, 7).Value
  30. forwards_11x7 = Worksheets("Forwards").Cells(Int(x) + 11, 7).Value
  31. For j = 0 To nb_annee - 1
  32. P(j + 6) = x / 12 + j
  33. T(j + 6) = (g * (forwards_10x7 + 12 * j) + (30 - g) * (forwards_11x7 + 12 * j)) / 3000
  34. somme = somme + Cells(i, 13).Value / (1 + T(j + 6)) ^ P(j + 6)
  35. Next
  36. somme = somme + 100 / (1 + T(nb_annee + 6) ^ P(nb_annee + 6))
  37. Cells(i, 11).Value = somme
  38. End If
  39. End If
  40. Next

Revoilà ton code, sans tableau sur i puisque je te dis que ça ne sert à rien.

Ligne 23, qu'est ce Abs fait là. On sait que la valeur est supérieure à 360, donc c'est inutile.
T'aime ça les trucs qui servent à rien, hein. :D 

Bon, j'ai mis dans le If tout ce qui n'avait pas besoin d'être en dehors.
T'as compris pourquoi ?
(La bonne réponse est "Oui, j'ai bien regardé et j'ai tout compris", sinon, regarde encore).

Et i, ce sont des lignes. Comme il peut y en avoir plus que la taille d'un Integer, j'ai mis un long.
Quelle est le domaine d'un Integer, d'un long ? Quelle est la taille d'une feuille ?

J'ai viré tes superbes beaux calculs sur x1 et x2. Ce n'est utilisé qu'une fois, on va pas se faire chier.

v est un nombre d'années ? Ah bon. Et bien je renomme la variable en nb_annee. Tu devrais faire pareil pour les autres.

Bon, je n'aime vraiment pas les lignes 21 à 26.
Et tes tableaux de T et P, c'est pareil.
On va revoir ça.

bonjour tout le monde ,bonjour Zed
c'est claire comme de l'eau de roche . mais je voudrais ajouter une condition mais elle est sur une colonne qui contient des caractères .
en fait je veux que l'exécution soit faite seulement lorsqu'on rencontre ce caractère dans une des cellules de la colonne 7.
ce caractère est
  1. An

du coup jai pensé a ecrire comme ci-dessous
  1. For i=o to K-6
  2. If Cells(i + 6, 15).Value <> "" Then
  3. If Cells(i,7).Value="An" Then...


MAIS J'ai des doutes en ecrivant If Cells(i,7).Value="An" Then...[/cpp] puisque ce sont des caracteres qui sont en colonne 7 et non des nombres

merci de corriger mon erreur .
:sol: 

Bonjour :) 
j'ai regardé l'aide et j'ai trouvé une façon d'ecrire la condition :

  1. For i=o to K-6
  2. If Cells(i + 6, 15).Value <> "" Then
  3. If Cells(i, 9).Value Like " *AnLD*" Or Cells(i, 9).Value Like "*An*" Or Cells(i, 9).Value Like "*AnRD*" Or Cells(i, 9).Value Like "*AnRDFo*" Or Cells(i, 9).Value Like "*In Fine*" Then...


c'est elle que je veux inclure dans ma boucle .

mais j'ai une erreur a cette ligne : "erreur definie par l'application ou l'objet "

comment faire ? pour y remedier? :??: 

merci d'avance

j'ai corrigé l'erreur :bounce: 
j'avais pas fait attention a l'indice dans ma boucle :
voilà ce que je devais ecrire:

  1. If Cells(i+6, 9).Value Like " *AnLD*" Or Cells(i+6, 9).Value Like "*An*" Or Cells(i+6, 9).Value Like "*AnRD*" Or Cells(i+6, 9).Value Like "*AnRDFo*" Or Cells(i+6, 9).Value Like "*In Fine*" Then


merci bien :wahoo: 
Expert Programmation

Ah, c'est résolu :) 

Regarde bien tes conditions :
  1. Cells(i, 9).Value Like "*AnLD*" Or
  2. Cells(i, 9).Value Like "*An*" Or
  3. Cells(i, 9).Value Like "*AnRD*" Or
  4. Cells(i, 9).Value Like "*AnRDFo*" Or
  5. Cells(i, 9).Value Like "*In Fine*"

La condition 4 est contenue dans la condition 3.
Les conditions 1, 3 et 4 sont contenue dans la condition 2.

!
Lassé par la pub ? Créez un compte