Rechercher : dans
Par :

VBA Optimisation formules qui prend du tps

Dernière réponse le 29 jui 2009 à 19:18:26 Jon, le 29 jui 2009 à 16:12:02 
 Signaler ce message aux modérateurs

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!

Configuration: Windows 2003 Internet Explorer 7.0

Meilleures réponses pour « VBA Optimisation formules qui prend du tps » dans :
VB6/VBA Transformer nombre en texte VoirIntroduction Préliminaires VB6 Dans le module de la forme Dans Module1 Introduction La fonction peut transformer des nombres de l'unité jusqu'à 999 tera. Prend en compte la syntaxe pour le français de France, de Belgique et de...
Copier une formule VoirAprès avoir laborieusement composé une formule dans une cellule, il est fréquent de vouloir la recopier d’autres cellules. Vous pouvez procéder de plusieurs façons. COPIER-COLLER La méthode la plus primaire consiste à sélectionner la cellule...

1

SilverM-A, le 29 jui 2009 à 16:52:02

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 ;)

Répondre à SilverM-A

2

Jon, le 29 jui 2009 à 17:13:24

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!

Répondre à Jon

3

eriiic, le 29 jui 2009 à 17:25:31
  • +2

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

Répondre à eriiic

6

Jon, le 29 jui 2009 à 18:19:16

Eric,

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

merci beaucoup!

Répondre à Jon

4

Jon, le 29 jui 2009 à 17:49:02

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?

Répondre à Jon

7

 eriiic, le 29 jui 2009 à 19:18:26

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

Répondre à eriiic

5

SilverM-A, le 29 jui 2009 à 17:56:47

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

Répondre à SilverM-A
Collection CommentÇaMarche.net