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

De : lutch [mailto:lu...@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+h...@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

Reply via email to