| |
| [WD16] lenteur Excel 2010 |
| | Débuté par Yves Bottero, 03 aoû. 2012 13:32 - 6 réponses |
| |
| | |
Posté le 03 août 2012 - 13:32 |
Bonjour , j'ai une application qui crée en batch de nuit des classeurs Excel en utilisant les classes Cexcel. Ces classeurs contiennent en moyenne 8.000 à 10.000 lignes avec beaucoup de formules de calcul et de mise en forme. Tant que nous etions en Excel 97 ce type de traitement durait environ 1h00. Depuis que nous sommes passée en Office 2010 , le mème traitement pour le mème volume prend maintenant 4h00 !! Quelqu'un aurait-il une idée de ce que je pourrais faire pour retrouver des temps de traitement supportables ?
Merci |
| |
| |
| | | | |
Membre enregistré 213 messages |
|
Posté le 03 août 2012 - 15:08 |
bonjour, quel genre de traitement fais-tu ? par ligne ? par cellule ? par plage ? peux-tu nous montrer le code de ce traitement ? As-tu utilisé l'analyseur de performance pour voir où où cela coince ?
Ami calmant, J.P  |
| |
| |
| | | | |
Posté le 03 août 2012 - 16:29 |
C'est un mélange de tout ça. Les formules sont par cellule , les mise en formes sont par plages , lignes , colonnes ou cellule c'est selon ... L'analyseur de performances semble faire apparaitre que le plus gourmand est la methode Ecel de mise en format conditionnel. |
| |
| |
| | | | |
Posté le 03 août 2012 - 17:48 |
Yves Bottero a écrit dans le message de news <64b91b3aa868f6a290f3af696e707ee4@news.pcsoft> :
C'est un mélange de tout ça. Les formules sont par cellule , les mise en formes sont par plages , lignes , colonnes ou cellule c'est selon ... L'analyseur de performances semble faire apparaitre que le plus gourmand est la methode Ecel de mise en format conditionnel.
Code de la methode en cause :
PROCEDURE FormatConditionnel(sRow,sColumn)
//sFormat est une chaine QUAND EXCEPTION DANS // on met au format conditionnel voulu :m_xExcel>>Cells(sRow , sColumn)>>FormatConditions>>Add(1,4,"0") // Condition pour valeur 0 :m_xExcel>>Cells(sRow , sColumn)>>FormatConditions(1)>>Interior>>ColorIndex = 4 :m_xExcel>>Cells(sRow , sColumn)>>FormatConditions>>Add(1,3,"?") :m_xExcel>>Cells(sRow , sColumn)>>Interior>>ColorIndex = 35 :m_xExcel>>Cells(sRow , sColumn)>>FormatConditions>>Add(1,4,"0") :m_xExcel>>Cells(sRow , sColumn)>>FormatConditions(2)>>Interior>>ColorIndex = 4 FAIRE :MsgErreur("Impossible de mettre un format conditionnel",ExceptionInfo()) ExceptionActive() RETOUR FIN |
| |
| |
| | | | |
Membre enregistré 213 messages |
|
Posté le 03 août 2012 - 20:18 |
voici quelques astuces que tu utilises peut-être déja pour gagner du temps :
1 - désactiver le rafraîchissement d'écran, les événements excel, le calcul de cellules pendant le traitement.
2 - utiliser plutôt des traitements par plages que par cellules quand c'est possible.
voici un exemple pour un remplissage de 100 cellules avec ton format conditionnel :
XlBook est un objet OLE dynamique XlActive est un objet OLE dynamique ExcelObj est un objet OLE "Excel.Application" ExcelObj>>Application>>Visible = True XlBook = ExcelObj>>Workbooks>>Open("f:\MonClasseur1.xls") XlActive = ExcelObj>>Activesheet
sRow,sColumn sont des entiers ExcelObj>>Application>>ScreenUpdating=False ExcelObj>>Application>>EnableEvents=False ExcelObj>>Application>>Calculation=-4135 elapsedTime est une Durée
ChronoDébut() POUR sRow=1 A 10
POUR sColumn=1 A 10 QUAND EXCEPTION DANS
XlActive>>Cells(sRow , sColumn)>>FormatConditions>>Add(1,4,"0") XlActive>>Cells(sRow , sColumn)>>FormatConditions(1)>>Interior>>ColorIndex = 4 XlActive>>Cells(sRow , sColumn)>>FormatConditions>>Add(1,3,"?") XlActive>>Cells(sRow , sColumn)>>Interior>>ColorIndex = 35 XlActive>>Cells(sRow , sColumn)>>FormatConditions>>Add(1,4,"0") XlActive>>Cells(sRow , sColumn)>>FormatConditions(2)>>Interior>>ColorIndex = 4 FAIRE Erreur("Impossible de mettre un format conditionnel",ExceptionInfo()) ExceptionActive() RETOUR FIN FIN FIN ExcelObj>>Application>>ScreenUpdating=Vrai ExcelObj>>Application>>EnableEvents=Vrai ExcelObj>>Application>>Calculation=-4105 elapsedTime = ChronoFin() Trace ("temps écoulé : " + elapsedTime + " ms")
ChronoDébut() QUAND EXCEPTION DANS
XlActive>>Range("A20","J30")>>FormatConditions>>Add(1,4,"0") XlActive>>Range("A20","J30")>>FormatConditions(1)>>Interior>>ColorIndex = 4 XlActive>>Range("A20","J30")>>FormatConditions>>Add(1,3,"?") XlActive>>Range("A20","J30")>>Interior>>ColorIndex = 35 XlActive>>Range("A20","J30")>>FormatConditions>>Add(1,4,"0") XlActive>>Range("A20","J30")>>FormatConditions(2)>>Interior>>ColorIndex = 4 FAIRE Erreur("Impossible de mettre un format conditionnel",ExceptionInfo()) ExceptionActive() RETOUR FIN
ExcelObj>>Application>>ScreenUpdating=Vrai ExcelObj>>Application>>EnableEvents=Vrai ExcelObj>>Application>>Calculation=-4105 elapsedTime = ChronoFin() Trace ("temps écoulé : " + elapsedTime + " ms")
j' obtiens un temps au moins 10 fois plus court avec la plage de cellules
Ami calmant, J.P  |
| |
| |
| | | | |
Posté le 06 août 2012 - 14:23 |
| merci pour tes conseils. J'avais bien compris que travailler par plage etait très significativement plus rapide que par cellule. Malheureusement dans le cas présent ce n'est pas possible. |
| |
| |
| | | | |
Posté le 16 février 2013 - 00:11 |
| |
| |
| | | | | | | |
| |
| |
| |