[Résolu] [Calc] Macro déclenchée à une heure donnée

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

[Résolu] [Calc] Macro déclenchée à une heure donnée

Message par ThierryM »

Bonjour,
Je souhaiterais créer une macro permettant de déclencher une alarme (sonore ou visuelle) à des heures données à partir d'une heure de départ que j'indiquerais. Le lancement se ferait à partir d'un bouton.
J'ai une table qui me permet d'obtenir automatiquement tous les horaires auxquels je dois intervenir à partir de l'heure de départ.
Maintenant il faudrait que le programme me prévienne à ces moments-là (ou 2 minutes avant, ce que je pourrais paramétrer).
Je pensais utiliser la fonction TIME pour me caler sur l'heure de mon système et je pensais comparer toutes les minutes avec une fonction WAIT (ou une boucle) mes horaires calculés avec l'heure TIME jusqu'à ce qu'il y ait équivalence auquel cas j'aurais une alerte sonore (beep).
Est-ce une solution envisageable ou existe-t-il quelque chose de plus direct ?
Je n'ai rien trouvé sur le web concernant ce genre de fonction.

Merci et à bientôt,
Dernière modification par ThierryM le 15 janv. 2007 00:13, modifié 1 fois.
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
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

Je n'ai pas réalisé ce genre de choses. Quelques idées qui me viennent :

- l'instruction wait interrompt l'exécution du programme (pas le système) pendant la durée spécifiée, donc cela empêche tout autre traitement de l'utilisateur.

- il devrait être possible de créer un listener (gestionnaire d'événements) sur un objet. Ceci permettrait de continuer à travailler... Le listener devrait pouvoir interroger le système régulièrement (voir les fonctions Timer, et GetSystemTicks par exemple ?).
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Message par ThierryM »

Salut,
Merci pour ces approches.
j'avais pensé à un Listener (avantage c'est qu'il travaille en continue sans bloquer le programme contrairement à WAIT) mais je pensais qu'un listener ne réagissait qu'en cas d'action de l'utilisateur (détection d'un changement dans une cellule, action avec la souris, le clavier...) ?
J'avais trouvé les fonctions TIMER et GetSystemTicks mais je ne voyais pas comment les utiliser. De toutes façons je pense qu'il faut faire une comparaison cycliquement (chaque minute) et envisager une échappatoire en appuyant sur un bouton STOP par exemple.

A bientôt,
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Message par ThierryM »

Salut à tous,
Je suis en train de travailler à cette macro.
J'ai une boîte de dialogue dans laquelle j'ai un champ de texte dans lequel s'affiche l'heure en cours : à l'ouverture, pas de problème , l'heure s'affiche. Par contre il faudrait que je puisse rafraîchir (chaque minute) ce champ de façon à avoir une heure dynamique. Comment faire ?

Voici mon code qui ouvre cette boîte de dialogue :

Code : Tout sélectionner

Sub MontreDialogueParametres
'Charge la boîte de dialogue en mémoire
DialogLibraries.LoadLibrary("Standard")
oDlg = CreateUnoDialog(DialogLibraries.Standard.Interface)
'Affiche l'heure actuelle
champHeure=oDlg.getControl("ChampHeure")
champHeureDepart=oDlg.getControl("ChampHeureDepart") 
champHeure.Time=ConvHeureLong(Time)
champHeureDepart.Time=champHeure.Time 'Fixe heure par défaut à l'ouverture
'ouvre la boîte de dialogue
oDlg.Execute()
End Sub
J'ai récupéré un morceau de code (les références sont à l'intérieur) qui pourrait servir.

Code : Tout sélectionner

Sub Horloge
' d'après Danny Brewer sur http://www.ooomacros.org/dev.php
Dim nCurrentTime As Long, heurelong as Long
	nCurrentTime = Timer

	Do While bClockRunning  'état false stoppe la boucle
		If nCurrentTime = Timer Then
			Wait 100
		Else
			nCurrentTime = Timer
			Dim lSec As Long, lMin As Long, lHour As Long
			lSec = nCurrentTime
			lMin = Int( lSec / 60 )
			lSec = lSec Mod 60
			lHour = Int( lMin / 60 )
			lMin = lMin Mod 60
			heurelong=lSec*100+lMin*10000+lHour*1000000
			heure=ConvHeure(heurelong)
		EndIf
	Loop
End Sub
Ci-dessous fonction permettant la conversion d'heure pour un champ horaire

Code : Tout sélectionner

' conversion d'une chaîne sous forme heure, minute, seconde
' en un type long pour pouvoir écrire dans un champ horaire de type Time 
Function ConvHeureLong(chaineHeure As string) As Long
Dim hr As Long, mn As Long, sec As Long
hr  = hour(chaineHeure)*1000000
mn  = minute(chaineHeure)* 10000
sec = second(chaineHeure)*100
ConvHeureLong = hr+mn+sec
End Function
A bientôt
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Message par ThierryM »

Bonjour,
Je suis encore dans ma macro concernant les manipulations de durées et d'horaires.
Quelqu'un aurait-il une formule permettant de convertir une heure sous forme décimale en une heure sous forme HHMMSS (par exemple passer de 0,25 à 6:00) ?

Je trouve la gestion des heures assez laborieuse sous OOo. Notamment dans les boîtes de dialogue avec les TimeFields qui nécessitent des conversions si l'on veut écrire ces valeurs de temps vers une cellule et vice-versa, même si la cellule est formatée en heure.

Merci et A +
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Message par ThierryM »

Salut,

Pour convertir une heure à partir d'une valeur décimale (c'est à dire quand on extrait une valeur d'une cellule contenant une heure formatée, cette valeur est sous forme de décimal <1), il suffit d'utiliser la fonction CDate. En fait je cherchais une fonction du style CTime (qui n'existe pas, mais je comprends maintenant pourquoi).
En effet dans un format de date, l'heure correspond à la partie décimale.

Par exemple :
6:00:00 (dans une cellule sous format HH:MM:SS) est en réalité une valeur égale à 0,25. Si je veux récupérer dans une macro la valeur de la cellule 6:00:00 (et non 0,25), je dois utiliser Cdate(valeur de la cellule) qui me donne 6:00:00 .

Par contre si je veux afficher cette valeur que je viens de récupérer, dans une boîte de dialogue dans un champ horaire "TimeField1", je dois combiner les fonctions CDate et ConvHeureLong (voir cette fonction plus haut dans ce fil de discussion). Ce qui donne :

Code : Tout sélectionner

TimeField1.Time=ConvHeureLong(CDate(valeur de la cellule))
A bientôt
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Message par ThierryM »

Salut,
J'ai un peu avancé dans ma réflexion pour déclencher une alarme à une heure donnée avec un LISTENER.
Je peux mettre un Listener sur une seule cellule. Cette cellule (Format HH:MM) affichant l'heure en cours avec la fonction MAINTENANT().

Maintenant, il faudrait que j'actualise automatiquement toutes les minutes mon document avec une fonction CALCULATE pour mettre à jour cette cellule.

Quelqu'un aurait-il une astuce pour un recalcul s'opérant à intervalle régulier ?

A bientôt
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Message par ThierryM »

:D Ca y est !
J'ai résolu mon problème de défilement du temps (comme une horloge) dans une cellule et dans une boîte de dialogue.

Voici une ébauche de fichier (à adapter selon les besoins) pour déclencher une alarme avec un listener sur une cellule B1. Si vous n'avez pas besoin d'alarme les 4 routines concernant le listener sont inutiles.
Vous pouvez voir le résultat dans le fichier ci-joint à cette adresse.

http://user.services.openoffice.org/fr/ ... 125937.ods

A bientôt,
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16960
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Message par jeanmimi »

Bonjour,
C'est un très beau travail !
Je l'ai sauvegardé sous le titre "Horloge dans Calc".
As tu réussi à déclencher aussi une alarme deux minutes avant l'heure souhaitée ?
Car soit j'ai rien entendu, soit je n'ai pas dû indiquer l'heure au bon endroit.
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Message par ThierryM »

Salut,
En fait, je n'ai pas paramétré l'alarme.
Sur l'exemple, il faudrait rajouter un TimeField (champHeureDepartBox dans le code ci-dessous) dans la boîte de dialogue dans lequel on indiquerait l'heure de l'alarme.

Ensuite, il faudrait écrire un listener de ce style :

Code : Tout sélectionner

Sub LS_modified(evt as object) 'Macro qui se déclenche dès que l'événement est détecté (changement dans les cellules)
 'MsgBox "Changement détecté"
 a=oCells.Value 'récupère l'heure dans la cellule B1
 a1=CDate(a) 
 b=champHeureDepartBox.Time
 b1=ConvHeure(b)
 If a1=b1 Then 'Condition vérifiant l'équivalence des 2 heures
 	 alarme 'déclenche la macro "alarme"
 End If
End Sub
Ensuite dans la macro alarme ce code pour voir le déclenchement (les beep sonnent aléatoirement avec un temps de retard, bref ne sont pas fiables):

Code : Tout sélectionner

Sub Alarme
	msgbox "Alarme déclenchée"
	Horloge 'Redémarre l'horloge
End Sub
Dès que je peux j'essaie de fournir un exemple de ce style (en rajoutant un TimeField permettant d'avertir 2 minutes avant si on le désire : bref un paramétrage).
A+
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Message par ThierryM »

Voici donc la version finale d'une macro permettant de déclencher un événement à une heure donnée (comme une alarme) : dans cette macro il s'agit de l'affichage d'un msgbox à l'heure voulue (c'est en fait la routine "Alarme" qui détermine ce qui doit être fait).

Il y a une cellule (B1) qui affiche le temps qui défile comme une horloge.

Une boîte de dialogue permet d'afficher une horloge qui défile, de déterminer une heure d'alarme, et de paramètrer une anticipation du déclenchement de la macro par rapport à l'heure d'alarme (de manière à être prévenu quelques minutes avant l'échéance).

Voici le lien vers ce fichier
http://user.services.openoffice.org/fr/ ... 102133.ods

J'espère avoir apporté quelques éclairages utiles.
A bientôt
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16960
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Message par jeanmimi »

Comment faudrait il faire pour lancer un fichier, par exemple un son .wav, à l'heure fixée par l'alarme ?
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Jeff
GourOOu
GourOOu
Messages : 9629
Inscription : 18 sept. 2006 09:40
Localisation : France

Message par Jeff »

Bonjour à tous,
jeanmimi a écrit :Comment faudrait il faire pour lancer un fichier
Michel donne ici un bout de code pour ouvrir un fichier.

J'ai pas (encore) vu le code de Thierry, mais on devrait pouvoir "mixer" tout ça, non :?:
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16960
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Message par jeanmimi »

bonjour Jeff,
on devrait pouvoir "mixer" tout ça, non
Je ne suis pas prêt d'avoir un "dring dring" lorsque ce sera l'heure !
J'ai plutôt eu l'impression que le code que tu signales sert à ouvrir un dossier externe à l'application.
Mais bon, je ne suis pas spécialiste. Si ça se trouve, ThierryM est en train de concocter une solution !
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Jeff
GourOOu
GourOOu
Messages : 9629
Inscription : 18 sept. 2006 09:40
Localisation : France

Message par Jeff »

Ch'uis pas spécialiste non plus, apparemment ; j'ai supprimé la msgbox alarme, et, avec le bout de code de MichelXld je lance un fichier wav ; là où tu as tout à fait raison, c'est que j'ouvre Médiaplayer en même temps, et en plus la macro de Thierry éprouve soudain un mal fou à s'arrêter :mrgreen:

Je vais laisser faire le spécialiste...
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Message par ThierryM »

Bonjour,
Ici plutôt le "tatônneur"...:wink:
J'ai exactement le même soucis que vous à savoir ouvrir un son .wav plutôt qu'une msgbox (pour des raisons tout simplement pratique).
Je n'ai pas trouvé de solution mis à par passer par l'ouverture d'une application externe comme Jeff le fait (je ne l'ai pas essayé car je n'avais pas le code de Michel).
Le problème me semble-t-il est de pouvoir "redonner" ensuite la main à OOo Calc (juste après le lancement de l'autre programme pour revenir à OOo) de manière à continuer la macro peut-être pour éviter qu'elle déraille ? Peut-être est-ce un problème au niveau du Listener ?
Je n'ai pas d'autres idées pour l'instant...

Ne vaudrait-il pas mieux ouvrir justement un autre fil pour avoir des éclairages plus précis quant à ce souci à savoir comment jouer un son wav (ou d'un autre type : .mp3, etc) à partir de calc ? En effet, il me semble qu'à partir d'OOo Impress on peut jouer un son, n'est-ce pas ?

A+
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?
ThierryM
Membre enthOOusiaste
Membre enthOOusiaste
Messages : 437
Inscription : 26 nov. 2006 11:29
Localisation : Les Corbières

Message par ThierryM »

Salut,
Voici le nouveau fil concernant ce problème de son :
http://user.services.openoffice.org/fr/ ... c3515.html

A bientôt,
LibreOffice Version: 7.6.2 / Linux Mint Mate Edition 21.2 / Pourquoi privilégier les formats de fichiers ouverts ?