Optimisation de macro avec un tableau
Bonjour le forum
J'ai lu différents cours vba expliquant que pour optimiser le temps d'exécution d'une macro il vaut mieux passer par une variable de type tableau.
Ma macro à ce jour met 1 minute à s'exécuter. (sur la base de 26 000 lignes)
Que dois-je changer dans mon code afin d'utiliser une variable de type tableau ?
Merci pour vos réponses.
Je mets en PJ mon fichier et mon code ci dessous
Option Explicit
Sub calcul()
Dim i As Integer
Dim Dernl As Long
Dernl = Range("A" & Rows.Count).End(xlUp).Row
Sheets("catalogue prev").Activate
ActiveSheet.Calculate
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For i = 4 To Dernl
Cells(i, 9) = "=TEXT(RC[-2],""mmmm"")&"" ""&TEXT(RC[-2],""aaaa"")"
Cells(i, 10) = "=RIGHT(RC[2],2)"
Cells(i, 11) = "=LEFT(RC[1],4)"
Cells(i, 22) = "=INDEX(table!C1:C2,MATCH('catalogue prev'!RC[1],table!C2,0),1)"
Cells(i, 25) = "=LEFT(RC[1],4)"
Cells(i, 37) = "=RC[-3]*RC87"
Cells(i, 38) = "=RC[-3]*RC87"
Cells(i, 39) = "=RC[-3]*RC87"
Cells(i, 48) = "=IF(AND(RC[-2]="""",COUNTA(RC[-1])=1),""a enlever de la base"",IF(RC[-2]="""",RC[-3],RC[-2]))"
Cells(i, 59) = "=RC[-6]&RC[-5]&RC[-4]&RC[-3]&RC[-2]&RC[-1]"
Cells(i, 64) = "=IFERROR(IF(MID(RC[-5],SEARCH(""t"",RC[-5],1),1)=""t"",""produit tracté"",""""),""non tracté"")"
Cells(i, 65) = "=IFERROR(IF(MID(RC[-6],SEARCH(""U"",RC[-6],1),1)=""U"",""RI financée"",""""),"""")"
Cells(i, 66) = "=IFERROR(IF(MID(RC[-7],SEARCH(""W"",RC[-7],1),1)=""W"",""RI non financée"",""""),"""")"
Cells(i, 67) = "=IFERROR(IF(MID(RC[-8],SEARCH(""Z"",RC[-8],1),1)=""Z"",""lot viruel tous conso non financé"",""""),"""")"
Cells(i, 68) = "=IFERROR(IF(MID(RC[-9],SEARCH(""Y"",RC[-9],1),1)=""Y"",""lot viruel tous conso financé"",""""),"""")"
Cells(i, 69) = "=IFERROR(IF(MID(RC[-10],SEARCH(""L"",RC[-10],1),1)=""L"",""remise différée Eurocarte u"",""""),"""")"
Cells(i, 69) = "=IFERROR(IF(MID(RC[-11],SEARCH(""M"",RC[-11],1),1)=""M"",""Eurocarte u lot virtuel"",""""),"""")"
Cells(i, 71) = "=IF(RC[-6]&RC[-5]&RC[-4]&RC[-3]&RC[-2]&RC[-1]="""",""pas de méca"",RC[-6]&RC[-5]&RC[-4]&RC[-3]&RC[-2]&RC[-1])"
Cells(i, 87) = "=IF(RC[-1]=""probleme de remontée"",0,RC[-1]*RC[-39])"
Cells(i, 90) = "=IF(RC[-26]=""produit tracté"",RC[-3]*RC[-41],0)"
Cells(i, 91) = "=IF(RC[-27]=""non tracté"",RC[-4]*RC[-41],0)"
Cells(i, 92) = "=IF(RC[-28]=""non tracté"",RC[-5]*RC[-41],0)"
Cells(i, 93) = "=IF(RC[-29]=""non tracté"",RC[-6]*RC[-41],0)"
Cells(i, 94) = "=IF(RC[-23]=""pas de méca"",0,((RC[-34]/RC[-31])*RC[-7])*RC[-21])"
Cells(i, 108) = "=IF(RC[-32]=0,0,RC[-32]/100)"
Cells(i, 109) = "=IF(RC[-32]=0,0,RC[-32]/100)"
Cells(i, 110) = "=IF(RC[-32]=0,0,RC[-32]/100)"
Cells(i, 111) = "=IF(RC[-32]=0,0,RC[-32]/100)"
Cells(i, 112) = "=IF(RC[-32]=0,0,RC[-32]/100)"
Cells(i, 113) = "=IF(RC[-32]=0,0,RC[-32]/100)"
Cells(i, 114) = "=RC[-6]*RC38"
Cells(i, 115) = "=RC[-6]*RC38"
Cells(i, 116) = "=RC[-6]*RC38"
Cells(i, 117) = "=RC[-6]*RC38"
Cells(i, 118) = "=RC[-6]*RC38"
Cells(i, 119) = "=RC[-6]*RC38"
Next i
Application.Calculation = xlCalculationAutomatic
End Sub
Bonjour,
La macro ne met pas une minute à s'exécuter elle ne met qu'une fraction de seconde.
Ce sont les calculs que vous lui demandez ensuite qui prennent plus de temps...
Dans ces conditions il n'y a (presque) rien à gagner car le temps de calcul de ces formules sera toujours le même.
A+
Bonjour galopin01,
La macro est rapide dans cet exemple car j'ai supprimé des lignes afin de joindre le fichier.
Mais dans la "réalité" mon fichier à 26 000 lignes est là la macro met 1 minute
J'ai bien compris... mais si vous supprimez cette ligne à la fin :
Application.Calculation = xlCalculationAutomatic
... Je suppose que c'est plus rapide ?
936000 formules à calculer ç'est pas rien !
Je serai très étonné que quelqu'un annonce un gain de temps significatif, même si c'est vrai on pourrait peut-être optimiser des bricoles... Mais pas de tableau en vue ici.