Améliorer un programme

Bonjour,

j'ai un devoir dans lequel je dois créer un programme qui calcule pour plusieurs indices leur performance, leur perf annualisée et le maximum drawdown.

J'ai utilisé l'enregistreur de macro pour essayer d'obtenir un programme mais ça créé un code illisible que je n'arrive pas à comprendre. Est-ce que quelqu'un saurait interpréter le code créé ainsi pour m'aider à la transformer en quelque chose de lisible?

Je n'arrive pas à joindre le fichier, donc voici mon code:

Sub Macro6()

'

' Macro6 Macro

'

'

Range("C3").Select

Application.CutCopyMode = False

ActiveCell.FormulaR1C1 = "=RC[-1]/R[-1]C[-1]-1"

Range("C3").Select

Selection.AutoFill Destination:=Range("C3:C31"), Type:=xlFillDefault

Range("C3:C31").Select

Range("D2").Select

ActiveCell.FormulaR1C1 = "100"

Range("D3").Select

ActiveCell.FormulaR1C1 = "=R[-1]C*(1+RC[-1])"

Range("D3").Select

Selection.AutoFill Destination:=Range("D3:D31"), Type:=xlFillDefault

Range("D3:D31").Select

Range("F2").Select

ActiveCell.FormulaR1C1 = "0"

Range("F3").Select

ActiveCell.FormulaR1C1 = "=RC[-2]/MAX(R2C4:R[-1]C[-2])-1"

Range("F3").Select

Selection.AutoFill Destination:=Range("F3:F33"), Type:=xlFillDefault

Range("F3:F33").Select

Range("H2").Select

ActiveCell.FormulaR1C1 = "=R[28]C[-4]/RC[-4]-1"

Range("H3").Select

ActiveCell.FormulaR1C1 = "=(R[27]C[-4]/R[-1]C[-4])^(360/(R30C1-R2C1))-1"

Range("H5").Select

ActiveCell.FormulaR1C1 = "=MIN(R[-3]C[-2]:R[25]C[-2])"

Range("H6").Select

End Sub

En gros, il y a des dates en colonne A, des performances en colonne B, je créé une colonne C à partir de la colonne B, puis une colonne D à partir de la colonne C, et ensuite je calcule mes performances à partir de la colonne D.

Il y a t-il quelque chose à faire?

Cordialement,

Re-bonsoir,

pour info, voici le code que j'ai essayé de faire (la même chose sauf que j'affiche les résultats dans un msgbox).

Il y a des erreurs que je n'arrive pas à identifier!

Sub Bouton1_cliquer()

Dim plage As Range
Dim duree As Integer
Dim pa As Single
Dim pae As Single
Dim vol As Single
Dim mdd As Single

Dim ligne As Integer
    For ligne = 3 To 10192
                    Cells(ligne, 7).Value = Range(ligne, 2).Value / Range(ligne - 1, 2).Value - 1
    Next ligne
Range("H2").Value = 100
    For ligne = 3 To 10192
                    Cells(ligne, 8).Value = Range("H2") * (1 + (Range(ligne, 7).Value))
    Next ligne
Range("I2").Value = 0
    For ligne = 3 To 10192
                    Cells(ligne, 9).Value = Range(ligne, 8).Value / WorksheetFunction.Max(H2, ligne, 8) - 1
    Next ligne

pa = Range("H10192").Value / Range("H2").Value - 1
pae = (Range("H10192").Value / Range("H2").Value) ^ (360 / (A10192 - A2)) - 1
mdd = WorksheetFunction.Min(I2, I10192)

plage = Range("A2: A10192")

duree = plage.Rows.Count

MsgBox "La durée est de " & duree & " jours, la performance absolue est de " & pa & ", la performance annualisée est de " & pae & ", la volatilité " & vol & " et le maximum drawdown est de " & mdd & "."

bonsoir le forum et joyeux noël,

une proposition de correction de ton code. tu mélanges cells et range et tu oublies parfois d'indiquer cells, je n'ai ps pu tester ne disposant pas de tes données. les 2 codes que tu as proposés ne travaillent pas sur les mêmes colonnes/cellules. est-ce normal ?

Sub Bouton1_cliquer()
    Dim plage As Range
    Dim duree As Integer
    Dim pa As Single
    Dim pae As Single
    Dim vol As Single
    Dim mdd As Single
    Dim ligne As Integer
    For ligne = 3 To 10192
        Cells(ligne, 7).Value = Cells(ligne, 2).Value / Cells(ligne - 1, 2).Value - 1
    Next ligne
    Range("H2").Value = 100
    For ligne = 3 To 10192
        Cells(ligne, 8).Value = Range("H2") * (1 + (Cells(ligne, 7).Value))
    Next ligne
    Range("I2").Value = 0
    For ligne = 3 To 10192
        Cells(ligne, 9).Value = Cells(ligne, 8).Value / WorksheetFunction.Max(Range("H2:H" & ligne)) - 1
    Next ligne
    pa = Range("H10192").Value / Range("H2").Value - 1
    pae = (Range("H10192").Value / Range("H2").Value) ^ (360 / (Range("A10192") - Range("A2"))) - 1
    mdd = WorksheetFunction.Min(Range("I2:I10192"))
    plage = Range("A2:A10192")
    duree = plage.Rows.Count
    MsgBox "La durée est de " & duree & " jours, la performance absolue est de " & pa & ", la performance annualisée est de " & pae & ", la volatilité " & vol & " et le maximum drawdown est de " & mdd & "."
End Sub

Merci beaucoup, je m'empresse d'essayer!!

Juste une petite question, est-ce que le fait de monter dans les lignes jusqu'à 10192 peut rendre le programme trop lourd et les boucles trop longues selon vous? Mon excel a tendance a cracher et je ne sais pas si c'est à cause du programme ou de l'âge de mon ordi

Bonjour,

10200 lignes passées en revue 3 fois (3 boucles), je ne pense pas que cela alourdisse considérablement. le problème de crash doit venir d'ailleurs.

j'ai modifié la macro pour quelle s'adapte à un nombre de lignes variables (nombre de lignes déterminé par la colonne 2, à toi de changer s'il faut prendre en compte une autre colonne pour déterminer le nombre de lignes de ton tableau). j'ai également sorti le calcul du maximum de la colonne H de la boucle, en effet il n'est pas nécessaire de faire ce calcul lors de chaque itération.

Sub Bouton1_cliquer()
    Dim duree As Long
    Dim pa As Single
    Dim pae As Single
    Dim mdd As Single
    Dim vol As Single
    Dim ligne As Long
    Dim derlig As Long
    Dim maxh As Single
    With Sheets("feuil1") 'on travaille avec la feuille feuil1 à adapter éventuellement
        derlig = .Cells(Rows.Count, 2).End(xlUp).Row ' ligne de la dernière cellule utilisée en colonne 2
        duree = derlig - 1
        For ligne = 3 To derlig
            .Cells(ligne, 7).Value = .Cells(ligne, 2).Value / .Cells(ligne - 1, 2).Value - 1
        Next ligne
        .Range("H2").Value = 100
        For ligne = 3 To derlig
            .Cells(ligne, 8).Value = .Range("H2") * (1 + (.Cells(ligne, 7).Value))
        Next ligne
        .Range("I2").Value = 0
        maxh = WorksheetFunction.Max(.Range("H2:H" & ligne)) - 1 ' maxh maximum de la colonne H
        For ligne = 3 To derlig
            .Cells(ligne, 9).Value = .Cells(ligne, 8).Value / maxh
        Next ligne
        pa = .Range("H" & derlig).Value / .Range("H2").Value - 1
        pae = (.Range("H" & derlig).Value / .Range("H2").Value) ^ (360 / (.Range("A" & derlig) - .Range("A2"))) - 1
        mdd = WorksheetFunction.Min(.Range("I2:I" & derlig))
        MsgBox "La durée est de " & duree & " jours, la performance absolue est de " & pa & ", la performance annualisée est de " & pae & ", la volatilité " & vol & " et le maximum drawdown est de " & mdd & "."
    End With
End Sub

Merci!

EXCEL plante avec ce code aussi..

Bonjour,

y a-t-il d'autres macros (événementielles entre autres) dans ton classeur ?

non je ne crois pas. enfin il y a d'autres macros mais je ne les lance pas!

Bonjour,

en tout cas ce code ne fait pas planter excel chez moi. (avec mon fichier de test, avec tes données je ne sais pas ... )

Rechercher des sujets similaires à "ameliorer programme"