Navigatie

Contact

Send mail to the author(s) E-mail

View Richard Soeteman's profile on LinkedIn

RSS 2.0 | Atom 1.0 | CDF

Archief

Categorieën

Blogroll

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

Sign In

Zoeken

# Monday, August 21, 2006
Monday, August 21, 2006 2:42:16 PM (GMT Daylight Time, UTC+01:00) ( )

This Blog is not active anymore, further posts will be available on my company website. Read new posts here

Normaliter blog ik niet over Excel, echter een probleemmelding waar ik vandaag betrokken bij was heeft me doen besluiten deze blogpost te plaatsen.

Een Excel document met vele Worksheets wordt geopend daarin worden 28 cellen aangepast waar de berekening van afhankelijk is. De output cellen worden door een applicatie gevuld en uitgelezen. Dit hele proces doet er ongeveer 5 seconde over. Na een aantal tests kwam ik erachter dat dit komt doordat de berekening elke keer uitgevoerd wordt wanneer een cel wordt aangepast. Dus de berekening werd 28 maal uitgevoerd.

In Excel kan je aangeven hoe berekeningen uitgevoerd moeten worden, dit gaat door property Calculation op Excel.Application te initialiseren, deze verwacht enumerator XlCalculation. XlCalculation kent de volgende waarden:

- XlCalculation.xlCalculationAutomatic, het berekenen start automatisch an het aanpassen van een cel. De standaard instelling van Excel
- XlCalculation.xlCalculationSemiautomatic, het berekenen start automatisch an het aanpassen van een cel. Echter worden tabellen worden niet meegenomen in berekening.
- XlCalculation.xlCalculationManual, Automatisch berekenen is uitgeschakeld. Berekenen dient handmatig te gebeuren.

Uiteraard wil ik uiteindelijk wel de berekening uitvoeren. Excel.Application kent hiervoor de volgende methoden:

- Calculate(), de berekening wordt uitgevoerd. De Calculate methode kan je overigens ook gebruiken op worksheets, cellen etc. Met de Calculate methode is het dus mogelijk een aparte cel opnieuw te berekenen
- CalculateFull(),de berekening wordt uitgevoerd op alle geopende workbooks
- CalculateFullRebuild(),de berekening wordt uitgevoerd en berekend tevens alle afhankelijke worksheets opnieuw.

Verder kent Excel.Application de property CalculateBeforeSave, waarmeer je aangeeft of de Calculate methode uitgevoerd moet worden voordat het Excel sheet opgeslagen wordt.Onderstaand mijn applicatie in VB.Net, de relevante regels heb ik in bold weergegeven.

Dim
excelApp As New Excel.Application()
Dim excelWorkBook As Excel.Workbook()
Dim excelworkSheet As Excel.Worksheet()

excelApp.Workbooks.Open("C:\Exceldoc.xls")
excelWorkBook = excelApp.ActiveWorkbook
excelworkSheet = excelWorkBook.Worksheets.Item(1) 'Eerste sheet

excelApp.Calculation = XlCalculation.xlCalculationManual
'Zet waarden…..

excelApp.CalculateFullRebuild() 'Bereken het Excel sheet opnieuw

excelApp.ActiveWorkbook.Saved = True
excelApp.ActiveWindow.Close()
excelApp.Quit()

'Release objects
Marshal.ReleaseComObject(excelworkSheet)
Marshal.ReleaseComObject(excelWorkBook)
Marshal.ReleaseComObject(excelApp)

Door bovenstaande aanpassing duurt het proces nog geen seconde. Een aardige performance boost door het plaatsen van twee regels code.

Comments [0] | | #