Comment déclencher une macro à un horaire donné ?
Peut on lancer un service soffice.bin / soffice.exe à un horaire donné ?
Comment VRAIMENT séparer les process, faire du multithreading ?
Comment être libre d'insérer pendant l'exécution répétée de la routine,
des appuis touches clavier, ou des clics souris ?
Comment laisser courir une barre de progression, simultanément ?
Bref, je cherche l'équivalent de :
Application.OnTime pour MsOffice
DoEvents 'redonne la main au système d'exploitation
le manuel msdn a écrit :Vous pouvez avoir besoin d'exécuter du code périodiquement et automatiquement. Pour cela, vous pouvez faire appel à la méthode OnTime de l'application afin d'exécuter automatiquement une procédure. Cette méthode permet de planifier l'exécution d'une action spécifique lorsqu'un délai donné s'est écoulé ou de planifier l'exécution d'une action à une heure définie. Elle met donc en attente l'exécution d'une action. Contrairement à d'autres méthodes (Application.Wait...), avec Application.Ontime, l'utilisateur ne perd jamais la main.
L'idée ici est de créer un appel, à intervalle régulier, de notre fonction, à partir d'elle-même. En s'auto-appelant toutes les x secondes, elle laisse le temps, à l'utilisateur, de réaliser des actions.
Comme paramètres, la méthode OnTime prend l'heure précise à laquelle elle doit exécuter la procédure et le nom de la procédure à exécuter. Si vous devez annuler un OnTime, vous devez fournir l'heure exacte à laquelle l'événement a été calendrier avoir lieu. Il n'y a pas moyen de dire à Excel d'annuler le prochain événement OnTime ou d'annuler tous les événements OnTime attente. Par conséquent, vous avez besoin de stocker l'heure à laquelle la procédure est à exécuter dans une variable publique et utiliser la valeur de cette variable dans les appels à OnTime.
Bien que des sujets voisins soient traités dans le forum,
je n'ai pas strictement trouvé la réponse.
Finalement, on peut commencer à travailler avec ces 3 sujets, que je n'avais pas trouvé initialement :
1°TIMER
2°INTERVALLEThierryM a écrit :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.
3°ONTIMEPiaf a écrit :une solution ... utilisant la fonction Timer
inconvénient, le classeur doit être fermé par le menu Fichier > Fermer, si la macro alerte tourne. Si le classeur est fermé directement par la fenêtre, le fichier Lock n'est pas détruit.
Pour les tests le message s'affiche toutes les minutes.
Loopingss a écrit : il y aura un très léger décalage par rapport à la minute étalon lié au corps d'instructions que vous effectuez toutes les minutes. S'il vous faut vraiment du 60 secondes précises alors utiliser l'instruction Timer en boucle et faites un test pour sortir de cette boucle et exécuter le reste du code.
1/ un code avec deux macros utilisant une récursivité entre elles :
Code : Tout sélectionner
'déclaration des variables partagées
private i As Integer
'Auteur: loopingss
'modification : martinbrait
Sub LaunchRepetiteur()
'amorce, pour déclencher la routine parametree
Repetiteur
End Sub
Sub Repetiteur(optional i As Integer)
If IsMissing(i) Then
i=0'premier lancement
Call MacroToutesLesMinutes(1)
Else
If i < 3 Then
i = i+1
Wait 3*1000'une minute
Call MacroToutesLesMinutes(i)
Else
Msgbox("Vous avez lancé 3 fois la routine",16+48,"MERCI ET AU REVOIR")
i=0'réinitialisation
End If
'au bout de 3 appels,
'il n'y a plus de lancement
End If
End Sub
Sub MacroToutesLesMinutes(NumPass As Integer)
REM instructions de la macro principale
'ICI ON REPETE L'EXECUTION SUCCESSIVE DE LA MEME ROUTINE
'...
'...
'...
'...
ThisComponent.Sheets(0).getCellByPosition(0,0).String="PASSAGE " & NumPass
' Msgbox "passage " & NumPass
'attention, pas de multithreading.
Call Repetiteur(NumPass)
End Sub
'2/ un code avec une macro récursive sur elle même
Sub MacroTemps2()
REM instructions de la macro
i = i+1
If i <= 3 Then
Call MsgBox("PASSAGE " & i,16+48,"INFO")
Wait 2*1000 'toutes les deux secondes.
Call MacroTemps2
Else
'on cesse la répétition
End If
End Sub
Auriez-vous des suggestions d'améliorations, notamment liées au multithreading,
et aux interruptions, permettant de laisser la main à l'utilisateur tout en
exécutant les actions récursives ?
Merci et à bientôt .