Chonomètre dans Calc

Discussions à propos du tableur Calc.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est uniquement dédiée au tableur Calc. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
VemoN.fr
Fraîchement OOthentifié
Messages : 2
Inscription : 13 oct. 2006 17:04

Chonomètre dans Calc

Message par VemoN.fr »

Bonjour,
je suis un novice de OOo. :oops:

Je cherche à créer un chronomètre dans Calc, pour saisir des temps de passage pour un cross.
En gros, dans ma feuille, quand je saisis un identifiant élève, il apparait dans la même ligne son nom, sa classe (issus d'une BD), son ordre d'arrivée, et je cherche à faire apparaître son temps d'arrivée.

La fonction "Maintenant" n'est pas adéquat, puisque sa valeur se met à jour à chaque saisie. :cry: je me retrouve avec les même temps pour tous les élèves.

J'ai cherché un peu partout, et j'ai trouvé cette macro, que j'ai transformé en fonction :

Code : Tout sélectionner

function donnetemps
   Dim aLocale as new com.sun.star.lang.Locale, vNumFormat 
   Dim oDoc as Object : oDoc = ThisComponent 
   Dim oCell as Object : oCell = oDoc.CurrentSelection 
   Dim sFormat as String : sFormat = "HH:MM:SS,00" 
   If oCell.supportsService( "com.sun.star.sheet.SheetCell" ) Then 
      oCell.setValue( Now() ) 
      vNumFormat = oDoc.getNumberFormats().queryKey( sFormat, aLocale, TRUE ) 
      If ( vNumFormat = -1 ) Then 
         vNumFormat = oDoc.getNumberFormats().addNew( sFormat, aLocale )  
      End If 
      oCell.NumberFormat = vNumFormat
   End If 
End function
Et quand je mets la fonction
=SI(($A10<>"");DONNETEMPS();"")
dans ma cellule, ça ne me donne rien.
Où est mon erreur?
Comment puis-je faire ?
Connaîtriez-vous un autre moyen ?

Merci de votre aide.

[EDIT] OOo 2.0.4 sous Win XP Pro SP2
VemoN.fr
Jeff
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 10007
Inscription : 18 sept. 2006 09:40
Localisation : France

Message par Jeff »

En enregistrant une macro,j'obtiens ceci :

Code : Tout sélectionner

REM  *****  BASIC  *****


sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "StringName"
args1(0).Value = "=maintenant()"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args3(5) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Flags"
args3(0).Value = "SVDNT"
args3(1).Name = "FormulaCommand"
args3(1).Value = 0
args3(2).Name = "SkipEmptyCells"
args3(2).Value = false
args3(3).Name = "Transpose"
args3(3).Value = false
args3(4).Name = "AsLink"
args3(4).Value = false
args3(5).Name = "MoveMode"
args3(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "NumberFormatValue"
args4(0).Value = 107

dispatcher.executeDispatch(document, ".uno:NumberFormatValue", "", 0, args4())


end sub
qui prend en fait le collage spécial de la fonction MAINTENANT() sans copier la formule.
Il ya sûrement moyen de faire plus simple,l'idée de base étant de dire que l'on copie la fonction MAINTENANT() puis collage spécial pour ne pas coller la formule mais seulement le résultat.
La cellule d'accueuil doit avoir le format JJ/MM/AA_HH:MM:SS
À lire avant tout !

Pour télécharger Apache OpenOffice

AOO 4.1.16 / Debian 13 "Trixie" / Xfce
AOO 4.1.15 / Debian 11 "Bullseye" / Cinnamon
VemoN.fr
Fraîchement OOthentifié
Messages : 2
Inscription : 13 oct. 2006 17:04

Message par VemoN.fr »

Merci de m'aider.

J'ai transformé ta macro en fonction, et ça me donne "impossible de modifier les cellules protégées"... ?

Si toutefois je fais bien : voila la fonction :

Code : Tout sélectionner

REM  *****  BASIC  *****

function donnetps
rem ---------------------------------------------------------------------- 
rem define variables 
dim document as object 
dim dispatcher as object 
rem ---------------------------------------------------------------------- 
rem get access to the document 
document = ThisComponent.CurrentController.Frame 
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 

rem ---------------------------------------------------------------------- 
dim args1(0) as new com.sun.star.beans.PropertyValue 
args1(0).Name = "StringName" 
args1(0).Value = "=maintenant()" 

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args1()) 

rem ---------------------------------------------------------------------- 
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array()) 

rem ---------------------------------------------------------------------- 
dim args3(5) as new com.sun.star.beans.PropertyValue 
args3(0).Name = "Flags" 
args3(0).Value = "SVDNT" 
args3(1).Name = "FormulaCommand" 
args3(1).Value = 0 
args3(2).Name = "SkipEmptyCells" 
args3(2).Value = false 
args3(3).Name = "Transpose" 
args3(3).Value = false 
args3(4).Name = "AsLink" 
args3(4).Value = false 
args3(5).Name = "MoveMode" 
args3(5).Value = 4 

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args3()) 

rem ---------------------------------------------------------------------- 
dim args4(0) as new com.sun.star.beans.PropertyValue 
args4(0).Name = "HeureFormatValue" 
args4(0).Value = 107 

dispatcher.executeDispatch(document, ".uno:HeureFormatValue", "", 0, args4())


End function
et dans la cellule, je lance ma condtion et si VRAI, =donnetps()
VemoN.fr
Jeff
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 10007
Inscription : 18 sept. 2006 09:40
Localisation : France

Message par Jeff »

Au risque de faire courir un frisson de tes cervicales à tes lombaires,je suis assez nul en macros (!) et je me contente d'en enregistrer quand j'en ai besoin.
Je suis donc totalement incompétent pour savoir comment modifier la macro envoyée.
Si tes cellules sont protégées, il faut appeler en début de macro la commande Outils->Protection puis en fin de macro ré-installer la protection.
Cependant,je ne doute pas que si tu patiente un peu,des professionnels de la macro ne tarde à te renseigner
À lire avant tout !

Pour télécharger Apache OpenOffice

AOO 4.1.16 / Debian 13 "Trixie" / Xfce
AOO 4.1.15 / Debian 11 "Bullseye" / Cinnamon
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 11276
Inscription : 02 mai 2006 08:42

Message par Pierre-Yves Samyn »

Bonjour

Ce qui est demandé n'est pas si simple car les fonctions créées par macro sont en quelque sorte confrontées au même problème de "références circulaires" que les fonctions standards. Je dis cela pour simplifier... Pour dire autrement, ces fonctions ne peuvent recevoir en paramètre que les valeurs des cellules mises entre parenthèses et ne peuvent travailler "sur elles-mêmes".

Par exemple : =MAFONCTION(A10)

La fonction MAFONCTION "recevra" 2310 si la cellule A10 contient ce nombre, mais elle ne recevra que cela (pas les autres propriétés), et par ailleurs il faut que cet appel de fonction soit dans une cellule autre que A10.

Une solution assez complexe reposerait sur l'utilisation de gestionnaire d'événements (rechercher sur "listener" dans le forum macro). Par ce biais, on pourrait associer à l'événement "modification" d'une plage le déclenchement d'une macro qui, elle, pourrait "tout" faire.

La question étant "simple", je propose toutefois ici une solution "simple" : au lieu de provoquer la saisie du temps dans une cellule par la saisie dans une autre cellule, pourquoi ne pas faire l'inverse, c'est-à-dire saisir le temps puis éventuellement une autre chose. A y réfléchir, cela me parait d'ailleurs plus "juste" vis à vis du temps : on appuie sur le chronomètre puis on écrit le nom.

Ceci peut se faire plus simplement. La macro ci-dessous insère l'heure dans la cellule courante.

Code : Tout sélectionner

sub chrono

on error goto chrono_Err										'Si erreur aller à la ligne chrono_Err

thisComponent.currentSelection.value=cdate(cstr(time))			'Convertit l'heure en texte, puis en date, puis insertion dans la cellule courante

chrono_Exit:													'Sortie si tout est ok
exit sub

chrono_Err:														'Arrive ici en cas d'erreur (on avait sélectionné une plage, un objet, etc.)
msgbox "Ne fonctionne pas sur cette sélection"
resume chrono_Exit

end sub


Pour exécuter rapidement cette macro, il suffit de l'associer à un raccourci-clavier : lancer Outils / Personnaliser onglet Clavier
Vérifier l'étendue sélectionnée par le bouton radio (choisir Calc et non OpenOffice)
Sélectionner le raccourci-clavier
Faire défiler la liste Catégorie jusqu'à Macros OpenOffice
Ouvrir l'arborescence et aller "rechercher" la macro.

Nota : si la macro est dans un module du classeur il faut que le classeur apparaisse dans la liste. Il peut arriver que ce ne soit pas le cas et qu'il n'y ait que User et Share. Dans ce cas, il suffit en général que le classeur soit enregistré et d'éxécuter une fois la fonction puis de refaire Outils Personnaliser pour que ce soit le cas.

Une fois la macro sélectionnée, cliquer sur le bouton Modifier puis valider le dialogue.