Bonjour,
Michel Grentzinger a écrit :
Bonjour,
Dans mon classeur qui me sert à gérer un cross, j'ai des soucis de temps
d'exécution. Avec une exécution pas à pas, j'ai identifié 3 points de
freeze...
il s'agit de :
oCellule.Value = dTempsCoureur
oCellule.NumberFormat = nFormatId
oCelluleHeure.Value = dHeureArrivee
Le code pour formater la cellule peut être enlevé mais ça ne résoud pas mon
problème complètement...
Je ne comprend pas cette lenteur car il me semble qu'avec OOo version 2.2 et
antérieure, je n'avais pas ce soucis. J'ai testé sous Linux Debian, Ubuntu et
Windows avec OOo version 2.4 et le comportement est similaire.
D'où ce problème peut-il venir et est-ce possible de le contourner ?
Ci-dessous, la macro déclenchée par un bouton.
Sub ArriveeCoureur()
Dim oDocument As Object, oControleur As Object, oFeuille As Object
Dim oCellule As Object, oCelluleFocus As Object, oCelluleHeure As Object
Dim dHeureArrivee As Date, dHeureDepart As Date, dTempsCoureur As Date
oDocument = ThisComponent
oControleur = oDocument.CurrentController
oFeuille = oControleur.activeSheet
' Enregistrement de l'heure d'arrivée du coureur
dHeureArrivee = Time()
dHeureDepart = oFeuille.getCellRangeByName("H4").Value
dTempsCoureur = dHeureArrivee - dHeureDepart
' Vérification de bon lancement du chronomètre... Coloration de la cellule du
chrono
' si l'heure d'arrivée est inférieure à l'heure de départ.
If dHeureArrivee < dHeureDepart Then
oFeuille.getCellRangeByName("H4").CellBackColor = RGB(255,0,0)
End If
' Recherche de la prochaine cellule vide
Dim x As Integer, y As Integer
x = 2
y = 6
While oFeuille.getCellByPosition(x,y).String <> ""
y = y + 1
Wend
' On note le temps du coureur dans la cellule libre
oCellule = oFeuille.getCellByPosition(x,y)
oCellule.Value = dTempsCoureur
' Cette cellule sera au format MM'SS
Dim oLocale As New com.sun.star.lang.Locale
Dim nTemps As Integer, nFormatId As Integer
oLocale.Language="fr"
oLocale.Country="FR"
nFormatId = oDocument.NumberFormats.queryKey("MM'SS''", oLocale, True)
' Si le format MM'SS'' n'existe pas, on l'ajoute à la liste des format
' personalisés
If nFormatId = -1 then
nFormatId = oDocument.NumberFormats.AddNew("MM'SS''", oLocale)
End If
' ATTENTION : prend beaucoup de temps avec OOo > 2.3 !
' oCellule.NumberFormat = nFormatId
'On note l'heure par sécurité dans une autre colonne
oCelluleHeure = oFeuille.getCellByPosition(12,y)
' freeze avec OOo > 2.3
oCelluleHeure.Value = dHeureArrivee
' Formatage identique de cette cellule
' ATTENTION : prend beaucoup de temps avec OOo > 2.3 !
' oCelluleHeure.NumberFormat = nFormatId
'Ancien code (utilisation des formats standards)
'==============================================
'Dim oFormats As Object, nTemps As Integer
'oFormats = ThisComponent.getNumberFormats()
'nTemps = oFormats.getStandardFormat( com.sun.star.util.NumberFormat.TIME,
oLocale )
'oCellule.NumberFormat = nTemps
' On déplace la vue du classeur afin de visualiser la ligne du coureur qui
arrive
oControleur.FirstVisibleRow = y - 5
' On place le focus sur la cellule du temps
oCelluleFocus = oFeuille.GetCellByPosition(0, y + 1)
oControleur.Select(oCelluleFocus)
End Sub
Je n'ai pas constaté ce genre de problème sous Linux FC8 OOo-2.4
(officile), ni sous FC9 OOo-2.4.1 (fedora).
Par contre, dans ta dernière partie :
' On déplace la vue du classeur afin de visualiser la ligne du coureur
' qui arrive
Il me semble que cela est de nature à engendrer des aller-retour
pénalisant, tant au point de vue affichage que de saisie. J'aurai plutôt
effectuer un retour sur le bouton de prise de temps et plus exactement
je supprimerai cette portion de code.
J'avais également travaillé sur ce thème et avais privilégié un
affichage inversé qui permettait justement d'avoir en haut d'écran les
derniers temps.
Une autre piste serait peut-être de verrouiller toute ou partie des
procédures via une instruction du genre :
oDocument.lockControllers/oDocument.unlockControllers
voir également des possibilités via :
oDocument.enableAutomaticCalculation(False)
ou le verrouillage des controllers.
François Gatto
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]