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 !

Rechercher des sujets similaires à "optimiser temps calcul"