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 SubMerci 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 SubMerci!
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 ...