Optimiser le temps de calcul
Hello à tous,
Comme le titre le suggère, je souhaite gagner du temps (beaucoup de temps) sur une macro. Chaque jour, la base de donnée grossit, aujourd'hui 10-15 minutes de calcul, au 31 décembre on peut partir sur une journée complète x)
Problème j'ai optimisé au maximum suivant mes compétences:
Calcul manuel
ScreenUpdating false
Utilisation de dictionnaire (qui prends 15sec à être créé)
Je dois, en fonction de critère, réaliser des calculs et je ne vois pas comment éviter l'excès de boucle.
Voilà le code de l'enfer, si jamais vous avez des idées:
Application.ScreenUpdating = False
Set wk = Workbooks("Repo_PR.xlsm")
Set sh_pos = wk.Sheets("Positions complètes")
Set sh_Ref = wk.Sheets("Référence")
Set sh_tab = wk.Sheets("Tableau de bord")
Set sh_EONIA = wk.Sheets("EONIA")
Call AddRef
Call DictionnaireExtraction(dicExtraction)
'Print les différentes contre partie dans le tableau de bord colonne B'
LastRowRef = sh_Ref.Range("A" & Rows.Count).End(xlUp).Row
sh_Ref.Range("A2:A" & LastRowRef).Copy Destination:=sh_tab.Range("B4")
'print les colonnes ajoutées pour le calcul'
sh_pos.Range("V:Y").ClearContents
'print les colonnes ajoutées pour le calcul'
sh_pos.Cells(1, 22) = "Produit"
sh_pos.Cells(1, 23) = "Produit EONIA"
sh_pos.Cells(1, 24) = "Charge"
sh_pos.Cells(1, 25) = "Charge EONIA"
'Test de contribution au P&L'
'Si le trade à un impact (date) sur la période YTD alors calcul P&L sinon next trade'
i = 2
For Each Trade In dicExtraction
If Not CDbl(dicExtraction(Trade).End_date) < CDbl(sh_EONIA.Range("G1").Value) Then
collateral = dicExtraction(Trade).collateral
durée = CDbl(dicExtraction(Trade).End_date - Application.Max(dicExtraction(Trade).Start_date, sh_EONIA.Range("G1").Value - 1))
marge = dicExtraction(Trade).Fixed_Rate
'Test des affectations
'Cas des S.Lending'
If dicExtraction(Trade).DealClass = "S" Then
If dicExtraction(Trade).DealType = "L" Then
sh_pos.Cells(i, 22) = (collateral * marge * durée) / 36000 'produit'
Else
sh_pos.Cells(i, 24) = (collateral * marge * durée) / 36000 'charge'
End If
End If
'Cas des Repos'
If dicExtraction(Trade).DealClass = "R" Then
'sous-cas taux variable'
If dicExtraction(Trade).Floating_Index = "EONIA_AVG" Then
If dicExtraction(Trade).DealType = "L" Then
sh_pos.Cells(i, 22) = (collateral * Abs(marge) * durée) / 36000 'produit'
Else
sh_pos.Cells(i, 24) = (collateral * Abs(marge) * durée) / 36000 'charge'
End If
Else
'sous-cas taux fixe'
If dicExtraction(Trade).Floating_Index = "" Then
EONIA = Application.Average(Application.VLookup(CDbl(dicExtraction(Trade).End_date), sh_EONIA.Range("A7:B373"), 2, 0), Application.VLookup(CDbl(Application.Max(dicExtraction(Trade).Start_date, sh_EONIA.Range("G1").Value)), sh_EONIA.Range("A7:B373"), 2, 0))
If dicExtraction(Trade).DealType = "L" Then
sh_pos.Cells(i, 23) = (collateral * Abs(EONIA) * durée) / 36000 'produit'
Else
sh_pos.Cells(i, 25) = (collateral * Abs(EONIA) * durée) / 36000 'charge'
End If
End If
End If
End If
End If
i = i + 1
Next Trade
MsgBox ("Mise à jour du tableau")
Application.ScreenUpdating = True
Bonjour,
Sans fichier joint difficile de te répondre exactement.
D'une manière générale il faut éviter de travailler directement sur tes feuilles et utiliser des Arrays.
Idem pour la constitution de ton dictionnaire...
Donc pour gagner du temps, commence donc par mettre un fichier joint qui nous permettra de faire un point exact sur la situation.
A+
Bonjour Galopin,
Merci de ton aide tout d'abord. Je ne peux pas joindre le document car il est confidentiel mais surtout car il necessite l'API bloomberg pour fonctionner.
La création du dictionnaire se fait de façon très rapide, je perds en effet beaucoup de tps lorsque je fais le calcul dans la cellule de la feuille. Je vais voir pour mettre ça dans un tableau virtuelle, meme si après je me sers de ces données en somme prod :/
Les sommeprod c'est pas non plus ce qu'on a inventé de mieux pour accélérer le mouvement :
Si on avait eu que les sommeprod pour aller sur la Lune : On n'aurait pas encore décollé !
A+
Ahah je dis pas, je ne maitrise pas 100% d'excel d'où le fait que je fasse appel à votre savoir.
J'ai réussi à réduire le nombre des conditions, en réalité les formules sont "identiques" dans bien des cas. Et puis ensuite le sommeprod est quasiment instanté. je vais clore le sujet
Merci de ton aide Galopin !