VBA Optimisation formules qui prend du tps

Résolu/Fermé
Jon - 29 juil. 2009 à 16:12
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 - 29 juil. 2009 à 19:18
Bonjour,

Bonjour,

J'ai créé une macro, mais elle prend pas mal de temps à cause des formules.

Voilà ce que j'ai fait à ce niveau:

Wbk2.Sheets("DataPrimeTerminal").Activate
For i = 7 To 65000
If Cells(i, 1) <> "" Then
Cells(i, 2).FormulaR1C1 = "=IF(ISERROR(VLOOKUP(RC1,DataGPMS!R7C4:R154C24,2,FALSE)),"" "",(VLOOKUP(RC1,DataGPMS!R7C4:R154C24,2,FALSE)))"
Cells(i, 3).FormulaR1C1 = "=IF(ISERROR(VLOOKUP(RC1,DataGPMS!R7C4:R154C24,4,FALSE)),"" "",(VLOOKUP(RC1,DataGPMS!R7C4:R154C24,4,FALSE)))"
Cells(i, 4).FormulaR1C1 = "=IF(ISERROR(VLOOKUP(RC1,DataGPMS!R7C4:R154C24,6,FALSE)/1000),"" "",(VLOOKUP(RC1,DataGPMS!R7C4:R154C24,6,FALSE)/1000))"
Cells(i, 5).FormulaR1C1 = "=IF(ISERROR(VLOOKUP(RC1,DataGPMS!R2C4:R149C21,14,FALSE)),"" "",(VLOOKUP(RC1,DataGPMS!R2C4:R149C21,14,FALSE)))"
Cells(i, 6).FormulaR1C1 = "=IF(ISERROR(RTD(""MdgServer"","""",""AUTO"",RC5,""NAME_SECURITY"")),"" "",(RTD(""MdgServer"","""",""AUTO"",RC5,""NAME_SECURITY"")))"
Cells(i, 7).FormulaR1C1 = "=IF(ISERROR(RTD(""MdgServer"","""",""AUTO"",RC5,""ID_CURRENCY"")),"" "",(RTD(""MdgServer"","""",""AUTO"",RC5,""ID_CURRENCY"")))"
Cells(i, 8).FormulaR1C1 = "=IF(ISERROR(RTD(""MdgServer"","""",""AUTO"",RC5,""ISIN"")),"" "",(RTD(""MdgServer"","""",""AUTO"",RC5,""ISIN"")))"
Cells(i, 9).FormulaR1C1 = "=IF(ISERROR(RTD(""MdgServer"","""",""AUTO"",RC5,""DATE_TODAY"")),"" "",(RTD(""MdgServer"","""",""AUTO"",RC5,""DATE_TODAY"")))"
Cells(i, 10).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""DATE_TIME""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""DATE_TIME""))))"
Cells(i, 11).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""PREV_PRICE""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""PREV_PRICE""))))"
Cells(i, 12).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""LAST_PRICE_WO_ADDENDUM""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""LAST_PRICE_WO_ADDENDUM""))))"
Cells(i, 13).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL""))))"
Cells(i, 14).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""TODAY_VOLUME""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""TODAY_VOLUME""))))"
Cells(i, 15).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""VWAP_PRICE""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""VWAP_PRICE""))))"
Cells(i, 16).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL""))))"
Cells(i, 17).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_W1""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_W1""))))"
Cells(i, 18).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_W4""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_W4""))))"
Cells(i, 19).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_M3""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_M3""))))"
Cells(i, 20).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_W52""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_W52""))))"
Cells(i, 21).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_CM""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_CM""))))"
Cells(i, 22).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_CY""))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_DIFF_REL_CY""))))"
Cells(i, 23).FormulaR1C1 = "=IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_MARKET_CAP_REDOM""))/1000000/RC[2]),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,""CN_MARKET_CAP_REDOM""))/1000000/RC[2]))"
Cells(i, 24).FormulaR1C1 = "=+IF(Performance!R3C9=""EUR"",VLOOKUP(DataPrimeTerminal!RC[-22],Markets!R5C2:R100C4,2,FALSE),VLOOKUP(DataPrimeTerminal!RC[-22],Markets!R5C2:R100C4,3,FALSE))"
Cells(i, 25).FormulaR1C1 = "=IF(ISERROR(VLOOKUP(RC[-18],Markets!R4C1:R58C6,6,FALSE)),"" "",(VLOOKUP(RC[-18],Markets!R4C1:R58C6,6,FALSE)))"
Cells(i, 26).FormulaR1C1 = "=IF(ISERROR((RC[-23]*RC[-14]/RC[-2])/RC[-1]/1000),RC[-22],(RC[-23]*RC[-14]/RC[-2])/RC[-1]/1000)"
Cells(i, 27).FormulaR1C1 = "=IF(ISERROR(RC[-4]/RC[-3]),"" "",(RC[-4]/RC[-3]))"
Cells(i, 28).FormulaR1C1 = "=IF(ISERROR((RC[-5]/RC[-17])*1000*RC[-3]),"" "",(RC[-5]/RC[-17])*1000*RC[-3])"
Else
Exit For
End If

Existe-il un moyen d'optimiser celà?

Merci d'avance!
A voir également:

5 réponses

eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
29 juil. 2009 à 17:25
Bonjour,

As-tu pensé à désactiver le rafraichissement écran et le calcul automatique ?
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

remettre à True et xlCalculationAutomatic à la fin.

Et tant qu'à faire une macro les formules sont-elles nécessaires ?
Autant coller juste le résultat, surtout qu'apparemment tout est recalculé à l'activation de la feuille.

eric
2
Eric,

Ca change tout!
Et tu as même réussi à régler un de mes autres problèmes indirectement !

merci beaucoup!
0
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
29 juil. 2009 à 16:52
Es-tu obligé de faire tout le traitement dans un seul et même for ??

Ce ne sont pas les formules qui prennent beaucoup de temps, ce sont les nombreuses validations, ainsi que la boucle de 65 000 tours :O

P.S.: Tu aurai probablement plus de chance dans le forum programmation ;)
0
Merci pour ta réponse :)

J'ai donc posté dans le forum programmation où on m'a aussi fait les gros yeux pour les 65000 lignes, mais ce n'est pas vraiment celà qui prend du temps.

En revanche, je suis interessé par ce que tu dis concernant la séparation en plusieurs boucles for. En quoi celà rendrait la macro plus rapide?

Merci encore!
0
Bonjour eric, et merci!
Je vais tout de suite essayer de désactiver tout ça.

Sinon je ne pense pas avoir bien compris ce que tu entends par "juste coller le résultat", mais en effet tout est recalculé (tout le temps, en temps réèl).

Est-il possible de faire un autofill dans la macro, cela ferait-il gagner du temps?
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 214
29 juil. 2009 à 19:18
je ne pense pas avoir bien compris ce que tu entends par "juste coller le résultat"
Il s'agit de calculer le résultat dans la macro et de mettre ce résultat dans la cellule au lieu de la formule qui est recalculée régulièrement.
Mais bon, il faut bien gérer les mises à jour et l'ordre de calcul des résultats. Si le temps te parait correct maintenant laisse comme ça.

Est-il possible de faire un autofill dans la macro, cela ferait-il gagner du temps?
Oui, mais sûrement minime car ce qui te prenait du temps c'était l'évaluation des formules à chaque collé. Maintenant elles ne sont évaluées qu"une fois lorsque tu réactives le calcul automatique.

N'oublie pas de mettre en résolu stp

eric
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SilverM-A Messages postés 82 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 10 avril 2011 76
29 juil. 2009 à 17:56
Si je comprend bien, si la première colonne n'est pas vide, tu fais le traitement sur les 28 colonnes ?

Ce que t'a conseillé ériiic peut aider. Le conseil qui t'a été donné dans ton post du forum programmation semble bien aussi, car 65 000, si tu en possède moins, c'est déjà du temps de gagné.

Selon ce que je vois, il n'y a pas vraiment de moyen d'optimiser les opérations sur chaque colonne autre que d'utilisé des fonctions. Exemple tu pourrais utiliser une fonction pour ta colonne 2-3-4 et même 5, passer en paramètre les membres de ton opération qui diffèrent d'une fois à l'autre. Tu pourra aussi faire de même pour les colonnes 6 à 23.

ex:
function NOMFONCTION (param1){

NOMFONCTION = IF(ISERROR(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,param1))),"" "",(VALUE(RTD(""MdgServer"","""",""AUTO"",RC5,param1)))) 

}


Ensuite reste à savoir, est-ce que tu possède toujours 28 colonnes ? Sinon, il suffit de réduire le nombre d'opération au nombre de colonne que tu possède dans la ligne.

Je ne suis pas très évolué en VBA, mais je crois que tu devrais t'en sortir ! :P
0