Date: prev next · Thread: first prev next last
2012 Archives by date, by thread · List index


Le 04/02/12 19:08, Michel Rudelle nous a écrit :
Bonsoir,

De : lutch [mailto:lutch@free.fr]
Envoyé : samedi 4 février 2012 18:52

[...]
Par curiosité, j'ai inséré la formule sans le signe "=",
le temps d'exécution descend à 0,519s

Puis-je en déduire que Calc recalculant la formule à chaque insertion
par la macro, c'est ce qui ralentit le tout ?

Suspendre le recalcul en début de macro et le réactiver à la fin
apporterait un gain, mais est-ce bien là que réside le problème ?
Je ne sais pas -encore- faire ceci, mais ça viendra…

C_Lucien
Je l'ai déjà utilisé et ça m'a fait gagner beaucoup de temps dans une macro
travaillant sur un classeur avec un très grand nombre de calculs.

Pour inhiber le recalcul automatique:
Nom_du_Classeur.enableAutomaticCalculation(False)

Pour autoriser le recalcul automatique après avoir tout recalculé
Nom_du_Classeur.CalculateAll
Nom_du_Classeur.enableAutomaticCalculation(True)

Ceci à condition de ne pas avoir besoin de valeurs calculées entre temps ...

Bonne soirée,

Michel


en effet ! Merci.
Temps d'exécution 0,506s

À toutes fins utiles, voici la macro modifiée
Function show_number(ByVal nr As Integer,ByVal empty As Boolean) As String
show_number = ""
If Not empty Then
show_number = Trim(Str(nr))+ "."
End If
End Function
'********************
Sub test
Const END_ROW As Integer = 199

Dim document As Object
Dim dispatcher As Object

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim oDoc As Object
Dim oSheet As Object
Dim oRange As Object
Dim oCell As Object

oDoc = ThisComponent
oSheet = oDoc.getCurrentController.ActiveSheet
oDoc.enableAutomaticCalculation(False)

' Select and clean the test cell range

oRange = oSheet.getCellRangeByPosition(0, 0, 1, END_ROW)
oDoc.CurrentController.select(oRange)

dispatcher.executeDispatch(document, ".uno:ClearContents", "", 0, Array())

Dim fun As String

fun = "=show_number(ROW(); isblank(indirect(""B"" & ROW())))"

Dim start_time As Long

start_time = GetSystemTicks()

' Fill the test cell range:
' column 1: formula for displaying the row number
' column 2: a constant string

Dim row As Integer

For row = 0 To END_ROW
oRange = oSheet.getCellRangeByPosition(0, row, 0, row)
oDoc.CurrentController.select(oRange)
oCell = oSheet.getCellByPosition(0, row)
oCell.setFormula(fun)
oCell = oSheet.getCellByPosition(1, row)
oCell.String = "abc"
Next row

oRange = oSheet.getCellRangeByPosition(0, 0, 0, 0)
oDoc.CurrentController.select(oRange)

oRange = oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")
oDoc.CurrentController.select(oRange)

Print "Test executed in " + (GetSystemTicks() - start_time)/1000 + " s"
oDoc.enableAutomaticCalculation(true)
End Sub


J'ai appris quelque chose ce soir…
C_Lucien

--


--
Envoyez un mail à users+help@fr.libreoffice.org pour savoir comment vous désinscrire
Les archives de la liste sont disponibles à http://listarchives.libreoffice.org/fr/users/
Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être 
supprimés

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.