PC SOFT
Accueil
Nouveau contenu
[WD16] lenteur Excel 2010
Débuté par Yves Bottero, 03 aoû. 2012 13:32 - 6 réponses
http://hostimage.webdev.info/avatars/default.gif
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
http://hostimage.webdev.info/avatars/384GgB4ahdbQbxdRHXazQ
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 ;-)
http://hostimage.webdev.info/avatars/default.gif
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.
http://hostimage.webdev.info/avatars/default.gif
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
http://hostimage.webdev.info/avatars/384GgB4ahdbQbxdRHXazQ
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
// méthode par cellule
ChronoDébut()
POUR sRow=1 A 10

POUR sColumn=1 A 10
QUAND EXCEPTION DANS
// on met au format conditionnel voulu
XlActive>>Cells(sRow , sColumn)>>FormatConditions>>Add(1,4,"0") // Condition pour valeur 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")
// méthode par plage
ChronoDébut()
QUAND EXCEPTION DANS
// on met au format conditionnel voulu
XlActive>>Range("A20","J30")>>FormatConditions>>Add(1,4,"0") // Condition pour valeur 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 ;-)
http://hostimage.webdev.info/avatars/default.gif
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.
http://hostimage.webdev.info/avatars/default.gif
Posté le 16 février 2013 - 00:11
Merci Beaucoup