Accelerer les calculs

Bonjour,

Ces trois macros tournent bien mais retardent au maximum l’exécution de tout le programme. J’ai joins à ce message le fichier avec lequel vous pourrez faire des test pour le calcul des « Alpha ». alpha n’est rien d’autre qu’un nombre tel que la différence entre le prix (Cvalorisis & prix spot ) soit très proche c'est-à-dire avec une différence de 10e-2 en gros dans les différentes macros je fais un test sur chacun des alphas appartenant à ]-1;1[ avec un pas de 10E-6.

si quelqu’un a une meilleur façon de calculer ces alphas merci

De m’aider.

code:

Sub calcul_des_spread_ANNUELS() 'calcul des spread pour les obligations à coupons annuels
 'lorsque le prix à l'émission est supérieure au prix spot trouvé
 'cette macro intervient en colonne V sur la feuille "Synthèse"
Dim i As Long, j As Long
Dim g As Double, T As Double, p As Double, alpha As Double, nb_mois As Double
Dim nb_annee As Double, nb_trim As Double, nb_jr As Double
Dim nb_semestre As Double
Dim somme As Single
Dim taux_spot_1 As Double, diff As Double, taux_spot_2 As Double
' prix sur les obligations a coupon annuel
For i = 0 To worksheets("Synthèse").Cells(Rows.Count, 1).End(xlUp).Row - 6
'//ci-dessous je mets une condition sur la ligne pour que ma boucle sur i s'execute lorsqu'on
'rencontre l'un des caracteres An,..,In Fine.
   If worksheets("Synthèse").Cells(i + 6, 9).Text Like "*Annuelle*" Then
        'la condition ci-dessous indique qu'on calcul le spread s'il reste au moins
        'un trimestre avant l'échéance
        If worksheets("Synthèse").Cells(i + 6, 14).Value >= 0.25 Then
                '//il s'agit d'un nombre d'année calculé a partir par exemple d'une date fixe
                'donc c'est en general un nombre decimal
                    nb_annee = worksheets("Synthèse").Cells(i + 6, 14).Value
                    'bien evidemment le nombre de mois restant avant la prochaine année en enlevant les années pleine c'est
                    'la partie decimale du nombre d'années multiplié par 12
                    nb_mois = (nb_annee - Int(nb_annee)) * 12 'nombre de mois avant la prochaine année
                    If (nb_annee - Int(nb_annee)) > 0 Then
                    nb_annee = Int(nb_annee) + 1
                    Else
                    nb_annee = nb_annee
                    End If
                    somme = 0
                    'g represente le nombre de jours (partie decimale du nombre de mois)
                    g = (nb_mois - Int(nb_mois)) * 30
    '// ci-dessous je veux faire une boucle sur alpha pour comparer la somme de ma boucle sur j
    'a un nombre positif .et comme alpha est tres petit raison pour laquelle je prend un pas de 0.0001

        For alpha = 0 To 1 Step 0.000001
       '// ici j'initialise la somme a zero pour chaque nouveau alpha
        somme = 0
        If worksheets("Synthèse").Cells(i + 6, "J").Value > _
        worksheets("Synthèse").Cells(i + 6, "K").Value Then
            alpha = -alpha
        Else
            alpha = alpha
        End If
            For j = 0 To nb_annee - 1
            '// ce if c'est pour prendre des données dans une feuille noté Forwards
                If Int(nb_mois) = 0 Then
                    If j = 0 Then
                        taux_spot_1 = worksheets("Forwards").Cells(7, 7).Value
                    Else
                        taux_spot_1 = worksheets("Forwards").Cells(10 + 12 * j, 7).Value
                    End If
                    taux_spot_2 = worksheets("Forwards").Cells(11 + 12 * j, 7).Value
                    Else
                    taux_spot_1 = worksheets("Forwards").Cells(Int(nb_mois) + 10 + 12 * j, 7).Value
                    taux_spot_2 = worksheets("Forwards").Cells(Int(nb_mois) + 11 + 12 * j, 7).Value
                End If
                p = nb_mois / 12 + j
         '// alpha ne peu toujours pas etre positif cela depend de la somme trouvée et du nombre fixe en colonne J
              'si je veux que les deux nombres se rapprochent il va falloir prendre alpha positif si ma somme est > au nombre
              'avec lequel je fait ma comparaison situé en colonne J sinon je prend alpha negatif
                T = alpha + (g * taux_spot_2 + (30 - g) * taux_spot_1) / 3000
                '// je calcule une partie de ma somme a l'aide d'une formule ,T et P se calculent aussi par des formules
                somme = somme + worksheets("Synthèse").Cells(i + 6, 13).Value / (1 + T) ^ p
                If j = nb_annee - 1 Then
                Exit For
                End If
        Next
        p = nb_mois / 12 + nb_annee - 1
        T = alpha + (g * taux_spot_2 + (30 - g) * taux_spot_1) / 3000
    '// resultat final de ma somme
        somme = somme + 100 / ((1 + T) ^ p)
    '// une fois ma somme calculé je fais le test pour chaque alpha ,j'ajoute alpha
    'dans T ainsi pour un certain alpha je vais trouver que ma somme est tres proche
    'du nombre qui est :Worksheets("Synthèse").Cells(i + 6, "J").Value j'ai donc mi une condition d'arret
    'lorsque la differrence entre les deux nombres est <=0.01 ,c'est pourquoi je fait
    'le "diff" ci -dessous:
        If worksheets("Synthèse").Cells(i + 6, "J").Value > _
            worksheets("Synthèse").Cells(i + 6, "K").Value Then
            diff = worksheets("Synthèse").Cells(i + 6, "J").Value - somme
        Else
            diff = somme - worksheets("Synthèse").Cells(i + 6, "J").Value
        End If
    'une fois la condition est verifier mettre la valeur de cet alpha qui
    'me verifie au mieux la condition "diff"en colonne V et sortir de la boucle puis
    'aller a l'indice i suivant .
        If diff <= 0.01 Then
           worksheets("Synthèse").Cells(i + 6, "V").Value = alpha
            Exit For
        End If
            If worksheets("Synthèse").Cells(i + 6, "J").Value > _
                                worksheets("Synthèse").Cells(i + 6, "K").Value Then
                alpha = -alpha
            End If
       Next
     End If
   End If
Next
End Sub

code 2:

Sub calcul_des_spread_TRIM()  'calcul des spread d'obligations a coupons trimestriels
 'lorsque le prix à l'emission est inferieur au prix spot trouvé
 'cette macro intervient en colonne V sur la feuille "Synthèse"
Dim i As Long
Dim j As Long
Dim g As Double
Dim T As Double
Dim p As Double, alpha As Double
Dim nb_mois As Double
Dim nb_annee As Double
Dim nb_trim As Double
Dim nb_jr As Double
Dim nb_semestre As Double
Dim somme As Single
Dim taux_spot_1 As Double, diff As Double
Dim taux_spot_2 As Double
 For i = 0 To worksheets("Synthèse").Cells(Rows.Count, 1).End(xlUp).Row - 6
'//Prix spot sur les obligations  a coupons trimestriels
 If worksheets("Synthèse").Cells(i + 6, 9).Text Like "*Trimestrielle*" Then
    If worksheets("Synthèse").Cells(i + 6, 14).Value >= 0.25 Then
        nb_trim = worksheets("Synthèse").Cells(i + 6, 14).Value * 4
            'nombre de mois avant le prochain trimestre
            nb_mois = (nb_trim - Int(nb_trim)) * 3
            'nombre de jour dans ces mois
            nb_jr = (nb_mois - Int(nb_mois)) * 30
            'utilisition du taux spot par la methode ci-dessous
                If nb_trim - Int(nb_trim) > 0 Then
                    nb_trim = Int(nb_trim) + 1
                Else
                    nb_trim = nb_trim 'nb_trim represente le nombre de trimestres jusqu'a l'échéance
                End If
                somme = 0
    For alpha = 0 To 1 Step 0.000001
        '// ici j'initialise la somme a zero pour chaque nouveau alpha
        somme = 0
            If worksheets("Synthèse").Cells(i + 6, "J").Value < _
                worksheets("Synthèse").Cells(i + 6, "K").Value Then
                alpha = alpha
            Else
                alpha = -alpha
            End If
            For j = 0 To nb_trim - 1
                If Int(nb_mois) = 0 Then
                    If j = 0 Then
                        taux_spot_1 = worksheets("Forwards").Cells(7, 7).Value
                    Else
                        taux_spot_1 = worksheets("Forwards").Cells(10 + 3 * j, 7).Value
                    End If
                        taux_spot_2 = worksheets("Forwards").Cells(11 + 3 * j, 7).Value
                Else
                    taux_spot_1 = worksheets("Forwards").Cells(Int(nb_mois) + 10 + 3 * j, 7).Value
                    taux_spot_2 = worksheets("Forwards").Cells(Int(nb_mois) + 11 + 3 * j, 7).Value
                End If
                p = nb_mois / 12 + j / 4
                T = alpha + (nb_jr * taux_spot_2 + (30 - nb_jr) * taux_spot_1) / 3000
                somme = somme + worksheets("Synthèse").Cells(i + 6, 13).Value / (4 * (1 + T) ^ p)
                If j = nb_trim - 1 Then
                Exit For
                End If
            Next
            p = nb_mois / 12 + (nb_trim - 1) / 4
            T = alpha + (nb_jr * taux_spot_2 + (30 - nb_jr) * taux_spot_1) / 3000
            somme = somme + 100 / ((1 + T) ^ p)
            If worksheets("Synthèse").Cells(i + 6, "J").Value < _
                worksheets("Synthèse").Cells(i + 6, "K").Value Then
                diff = somme - worksheets("Synthèse").Cells(i + 6, "J").Value
            Else
                diff = worksheets("Synthèse").Cells(i + 6, "J").Value - somme
            End If

    'une fois la condition est verifier mettre la valeur de cet alpha qui
    'me verifie au mieux la condition "diff"en colonne V et sortir de la boucle puis
    'aller a l'indice i suivant .
            If diff <= 0.01 Then
            worksheets("Synthèse").Cells(i + 6, "V").Value = alpha
            Exit For
            End If
                If worksheets("Synthèse").Cells(i + 6, "J").Value > _
                                worksheets("Synthèse").Cells(i + 6, "K").Value Then
                alpha = -alpha
            End If
        Next
        End If
    End If
Next
End Sub

code 3:

Sub calcul_des_spreads_SEM() 'calcul des spread pour les obligations à coupons semestriels
 'lorsque le prix à l'emission est inférieur au prix spot trouvé
 'cette macro intervient en colonne V sur la feuille "Synthèse"
Dim i As Long
Dim j As Long
Dim g As Double
Dim T As Double
Dim p As Double, alpha As Double
Dim nb_mois As Double
Dim nb_annee As Double
Dim nb_trim As Double
Dim nb_jr As Double
Dim nb_semestre As Double
Dim somme As Single
Dim taux_spot_1 As Double, diff As Double
Dim taux_spot_2 As Double
For i = 0 To worksheets("Synthèse").Cells(Rows.Count, 1).End(xlUp).Row - 6
 '//prix spot sur les obligations a coupon semestriels
 If worksheets("Synthèse").Cells(i + 6, 9).Text Like "*Semestrielle*" Then
    If worksheets("Synthèse").Cells(i + 6, 14).Value >= 0.25 Then
            nb_semestre = worksheets("Synthèse").Cells(i + 6, 14).Value * 2
            ' nombre de mois ....................................
            nb_mois = (nb_semestre - Int(nb_semestre)) * 6
            nb_jr = (nb_mois - Int(nb_mois)) * 30
            'taux spot utilisé st ci- dessous
            If nb_semestre - Int(nb_semestre) > 0 Then
            nb_semestre = Int(nb_semestre) + 1
            Else
            nb_semestre = Int(nb_semestre) '  nb_semestre represente le nombre de trimestres jusqu'a l'échéance
            End If
            somme = 0
     For alpha = 0 To 1 Step 0.000001
        '// ici j'initialise la somme a zero pour chaque nouveau alpha
        somme = 0
        If worksheets("Synthèse").Cells(i + 6, "J").Value < _
                worksheets("Synthèse").Cells(i + 6, "K").Value Then
                alpha = alpha
            Else
                alpha = -alpha
            End If
        For j = 0 To nb_semestre - 1
                If Int(nb_mois) = 0 Then
                    If j = 0 Then
                     taux_spot_1 = worksheets("Forwards").Cells(7, 7).Value
                     Else
                     taux_spot_1 = worksheets("Forwards").Cells(10 + 6 * j, 7).Value
                     End If
                     taux_spot_2 = worksheets("Forwards").Cells(11 + 6 * j, 7).Value
                Else
                    taux_spot_1 = worksheets("Forwards").Cells(Int(nb_mois) + 10 + 6 * j, 7).Value
                    taux_spot_2 = worksheets("Forwards").Cells(Int(nb_mois) + 11 + 6 * j, 7).Value
                End If
                p = nb_mois / 12 + j / 2
                T = alpha + (nb_jr * taux_spot_2 + (30 - nb_jr) * taux_spot_1) / 3000
                somme = somme + worksheets("Synthèse").Cells(i + 6, 13).Value / (2 * (1 + T) ^ p)
                If j = nb_semestre - 1 Then
                Exit For
                End If
            Next
            p = nb_mois / 12 + (nb_semestre - 1) / 2
            T = alpha + (nb_jr * taux_spot_2 + (30 - nb_jr) * taux_spot_1) / 3000
            somme = somme + 100 / ((1 + T) ^ p)
            If worksheets("Synthèse").Cells(i + 6, "J").Value < _
                worksheets("Synthèse").Cells(i + 6, "K").Value Then
                diff = somme - worksheets("Synthèse").Cells(i + 6, "J").Value
            Else
                diff = worksheets("Synthèse").Cells(i + 6, "J").Value - somme
            End If
            If diff <= 0.01 Then
                worksheets("Synthèse").Cells(i + 6, "V").Value = alpha
                Exit For
            End If
                If worksheets("Synthèse").Cells(i + 6, "J").Value > _
                                worksheets("Synthèse").Cells(i + 6, "K").Value Then
                alpha = -alpha
            End If
         Next
          End If
        End If
    Next
End Sub

merci bien de m'aider

Bonjour,

Pas vu le fichier joint !

As-tu testé en plaçant Application.ScreenUpdating = False au début de la macro même si je doute de son efficacité dans ta macro car il y a surtout des calculs et pas de manipulations de cellules/feuilles/classeurs.

A+

Rechercher des sujets similaires à "accelerer calculs"