VBA : La fonction OnTime




Comment déclencher l’exécution d’une macro commande ou d’une procédure VBA en fonction du temps, c’est-à-dire comment créer un minuteur pouvant déclencher l’exécution d’une action à une date précise ou après un intervalle de temps déterminé. Nous allons étudier ici la méthode OnTime de l’objet application qui permet d’arrivée à ce résultat. Cette méthode es décrite à l’aide de 4 paramètres que nous allons décrire ici. La syntaxe en est :


Application.OnTime EarliestTime, Procedure, [LatestTime], [Schedule]

 

EarliestTime

 

(Argument obligatoire) est la valeur temps qui indique le moment de démarrage d’une procédure. Cette programmation horaire peut s’écrire et se concevoir e deux manières :

 

Lancer une procédure à une heure précise : 

 

Dans ce premier exemple (Sub attendre_exemple1) l’exécution de la macro aura lieu à 10 h et 53’. Nous utilisons la fonction TimeValue( ) qui va retourner une variable de type date contenant l’heure. Ensuite la méthode OnTime exécutera la procédure affiche_1 (noter que le nom de la procédure est utilisé sous la forme d’une chaîne de texte). La boite de dialogue affiche alors l’heure courante.

Public heure As Date ‘ou Variant
Sub attendre_exemple1() ‘la macro est ici accrochée à un bouton de commande de la feuille de calcul
heure = TimeValue("10:53:00")
Application.OnTime heure, "affiche_1", , True
End Sub
Sub affiche_1()
MsgBox "ll est : " & heure, vbOKOnly + vbInformation, "Horloge : "
End Sub

 

Lancer une procédure après un délai imposé :

 

Dans ce deuxième exemple il faudra attendre 10 secondes pour voir la macro s’exécuter. Nous utilisons la fonction Now qui va retourner une variable de type date contenant l’heure et la date système de l’ordinateur à laquelle nous allons ajouter le délai. OnTime exécutera la procédure affiche_2. La boite de dialogue affiche ici la date système complète.

Public heure As Date
Sub attendre_exemple_2()‘la macro est ici accrochée à un bouton de commande de la feuille de calcul
heure = Now + TimeValue("00:00:10")
Application.OnTime heure, "affiche_2", , True
End Sub
Sub affiche_2()
MsgBox heure, vbOKOnly + vbInformation, "Horloge : "
End Sub

 

Procedure

 

(Argument obligatoire) est la valeur de type chaîne de texte qui contient le nom de la procédure à exécuter.

LatestTime


(Argument facultatif) est la valeur temps qui indique le délai maximal d’attente d’Excel en cas d’indisponibilité de ce dernier (exécution d’une autre procédure en cours). Si le logiciel n'est pas disponible au bout de ce délai, la procédure ne s'exécutera pas. Si ce paramètre est omis, le logiciel peut attendre indéfiniment avant l’exécution de OnTime, il semble donc que cette seconde option soit recommandable.
Si vous devez indiquer une valeur LatestTime, vous pouvez la calculer à partir de EarliestTime.


LatestTime = EarliestTime + 10 'pour attendre 10 secondes la disponibilité d’Excel.

Schedule

 

 (Argument facultatif) est la valeur de type booléen qui indique si la procédure doit être exécutée ou non. La valeur par défaut est True. Le problème est que pour stopper une procédure OnTime il faut renvoyer à nouveau cette dernière en paramétrant la valeur de Schedule à False. Cette opération générant une erreur il faudra utiliser le processus habituel en matière de gestion d’erreur « On Error Resume Next » qui détournera tous messages d’erreurs liés aux instructions suivantes.

Dans ce troisième et dernier exemple, nous allons afficher à quatre reprises (pendant une minute) l’heure courante dans la cellule A1 (mise en format hh:mm:ss) avec un intervalle de 15 secondes entre chaque nouvel affichage, puis nous interromprons la procédure en passant l’argument Schedule à False, c’est seulement de cette manière que l’arrêt de la méthode OnTime s’effectue convenablement.

Public heure As Date
Public compteur As Byte
Sub attendre_exemple_3()()‘la macro est ici accrochée à un bouton de commande de la feuille de calcul
heure = Now + TimeValue("00:00:15")
Application.OnTime heure, "affiche_3", , True
End Sub
Sub affiche_3()
Dim EcrireH As String
Range("a1").ClearContents
EcrireH = heure
Range("a1").Value = EcrireH
compteur = compteur + 1
If compteur = 4 Then
MsgBox "TERMINE", vbOKOnly + vbInformation, "Horloge : "
Range("a1").ClearContents
compteur = 0
On Error Resume Next
Application.OnTime heure, "affiche_3", , False
Else
attendre_exemple_3
End If
End Sub

Bon courage pour vos tests et vos adaptations...


2 commentaires:

Anonyme a dit…

Bonjour, je suis embêté avec un calcul.
Je dois décrémenter de -1 sur un total de 200, toutes les 12m30 ?
Comment retranscrire cela avec ces fonctions s'il vous plait ?
Merci d'avance de votre aide qui serait très précieuse !

Olivier Picot a dit…

Bonjour

Cette fonction n'est pas adapté à votre problématique mais il me semble que l'on pourrait résoudre cela par un simple calcul conditionnel,
si vous pouvez m'adresser un fichier exemple pour que je me rende mieux compte.

Merci

Enregistrer un commentaire

top