Correction de l'erreur

Bonjour,

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

NombreDeJour(i) = Range("L6" ) - Range("A2" )

NombreDeJour(i) = Range("L7" ) - Range("A2" )
NombreDeJour(i) = Range("L8" ) - Range("A2" ).........

peut on ecrire :

NombreDeJour(i) = Range("L"&(i)&"" ) - Range("A2" )?


merci de votre aide

11 réponses

  • Votes
  • Date
  • Date décroissante
  1. Salut,

    Oui normalement tu peux l'écrire, mais si ça ne fonctionne pas tu peux écrire :

    NombreDeJour(i) = Cint(Range("L"&(i)&"" )) - Cint(Range("A2" ))


    Tiens moi au courant si ça fonctionne !!
    1. j'ai pas pu verifier si ça fonctionne vu que mon code me marque une erreur ;"erreur de compilation constante requise!!
      je sais qu'il y a un probleme dans le code mais je ne sais pas comment le resoudre
      en effet j'ai declaré des variables qui dependent d'une variable i (i parcours les lignes a partir de la ligne 6)
      mon objectif c'est de fixer i a chaque fois et de faire les calculs .

      Sub prixspot()
          Dim NombreDeJour, NbreAnnées As Variant
          Dim x(i) As Double
          Dim x1(i), x2(i), v(i), T(i), p(i), g(i) As Variant
          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 i = 6 To 10000
              For j = 1 To v(i) + 1
                   p(j) = x(i) / 12 + (j - 1)
                   T(j) = (g(i) * Worksheets("&Forward&").Cells(x2(i) + 11, 7).Value + 12 * (j - 1) + (30 - g(i)) * (Worksheets("&Forward&").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

      si quelqu'un veut bien me guider
      merci
      1. 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

        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
        1. bonjour j'ai modifier le premier code que j'ai posté mais j'ai une erreur ici du type"l'indice n'appartient pas a la selection."
          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


          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.
          1. pour la premiere question
            chaine = "Range(""L" & (i) & """) - Range(""A2"")"
            1. Contributeur
              Bonjopur,
              NombreDeJour(i) = Cells(i, 12).Value - Cells(2, 1).Value 'definir le nombre de jours entre aujourd'hui et la date de fin

              Tu ne te sert nulle part de ce tableau, je verrais plutôt...
              NombreDeJour = (Date - Cells(2, 1))
               pour autant que la cellule 2/1 soit définie en date 

              A+
              1. bonjour tout le monde et merci a MrDupond et a lermite222
                pour votre aide mais le code dans lequel j'utilise les resultats que vous m'avez donné est ci-dessous sauf qu'il plante
                j'ai une erreur d'incompatibilité de type a cette ligne:
                 T(j + 5) = (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

                du coup je ne sais pas comment y remedier aussi j'ai des doutes dans ma fonction ReDim
                car je veux faire chaque tableau de 6 a la derniere ligne non vide ai-je bien ecrit redim?

                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 + 5) = x(i) / 12 + (j - 1)
                                        T(j + 5) = (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
                                        somme(i) = Cells(i, 13).Value / (1 + T(j + 5)) ^ p(j + 5) + 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

                merci de votre aide
                1. Contributeur
                  Sans connaître les nombres qui sont dans tes cellules ni leurs "type" c'est pas possible de décrypter.
                  Pourais-tu mettre un exemple de ton classeur sur Cjoint et mettre le lien dans un poste suivant.
                  1. bonjour voici mon code j'ai pu resoudre le probleme precedent sur dim ,redim et l'incompatibilité de type que j'avais
                    ici:
                    forwards_x2_11x7 = Worksheets("Forwards").Cells(x2(i) + 11, 7).Value
                                forwards_x1_11x7 = Worksheets("Forwards").Cells(x1(i) + 11, 7).Value

                    je recupere dans ma feuille forward des nombres decimaux!!
                    j'ai executé le code il toune mais la somme calculé n'est pas juste
                    dans ma boucje ci-dessous :
                     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
                    

                    je veux faire une somme de 1 à v(i) (les v(i) sont des nombres entiers compris entre 0 et 10) pour chaque valeur de i puis retourner la somme dans
                    Cells(i, 11).Value 
                    a chaque fois

                    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
                    1. comment mettre :
                      Cjoint et mettre le lien dans un poste suivant.
                      ???

                      merci bien
                      1. Contributeur
                        a cer adresse
                        Quand ru a déposer ton classeur il te donne le lien à communiquer.
                    2. cette requete n'est pas autorisée la ou je me trouve

                      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 :
                      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
                      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
                      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 :
                      x1()=Int(x)=[10,11,8,...,12,12] (int=partie entiere de x) donc x1(6)=10,x1(7)=11...

                      x2()=x1()+1=[11,12,9,...,13,13] x2(6)=11,.../codeg()=(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 :
                      x(6)=10.33;x1(6)=10;x2(6)=11;v(6)=5;g(6)=0.33*30
                      donc je calcule selon boucle ci dessous:
                      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

                       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)
                      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
                      somme(6) dans cells(6,11)

                      ensuite je calcule somme(i) pour i=7 jusqu'a 195 selon le meme schema
                      voila j'espere avoir mieux eclairci le probleme
                      dont voici le 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