Correction de l'erreur

dianbobo Messages postés 167 Statut Membre -  
dianbobo Messages postés 167 Statut Membre -
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

  1. Lazarey Messages postés 3255 Date d'inscription   Statut Membre Dernière intervention   745
     
    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 !!
    0
  2. dianbobo Messages postés 167 Statut Membre 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
    0
  3. dianbobo Messages postés 167 Statut Membre 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
    0
  4. dianbobo Messages postés 167 Statut Membre 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.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. MrDupond Messages postés 10 Statut Membre 39
     
    pour la premiere question
    chaine = "Range(""L" & (i) & """) - Range(""A2"")"
    0
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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+
    0
  8. dianbobo Messages postés 167 Statut Membre 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
    0
  9. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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.
    0
  10. dianbobo Messages postés 167 Statut Membre 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
    0
  11. dianbobo Messages postés 167 Statut Membre 1
     
    comment mettre :
    Cjoint et mettre le lien dans un poste suivant.
    ???

    merci bien
    0
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      a cer adresse
      Quand ru a déposer ton classeur il te donne le lien à communiquer.
      0
  12. dianbobo Messages postés 167 Statut Membre 1
     
    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
    0