Astuce VBA : OnTime

La méthode OnTime permet d'exécuter du code après une durée déterminée ou à une heure prédéfinie.

Utilisation :

Application.OnTime heure_d_exécution, "procédure_à_exécuter"

Par exemple, exécution de la procédure nommée "bonjour" à 10h30 :

Application.OnTime TimeValue("10:30:00"), "bonjour"


Exemple d'utilisation : exécuter une procédure dans 10 secondes

La méthode OnTime a besoin d'une heure d'exécution précise.

Pour exécuter un code dans 10 secondes, il faut donc commencer par déterminer l'heure actuelle avec Now puis ajouter les 10 secondes d'attente + TimeValue("00:00:10"), ce qui donne :

Application.OnTime Now + TimeValue("00:00:10"), "attente"

Dans cet exemple, OnTime lance la procédure "attente" après 10 secondes :

Sub exemple()
    Application.OnTime Now + TimeValue("00:00:10"), "attente"
End Sub

Sub attente()
    MsgBox "10 secondes se sont écoulées !"
End Sub
Remarque : il n'est pas possible de définir une durée inférieure à 1 seconde avec OnTime.

Annuler une exécution

En cas de besoin, il est possible d'annuler une exécution programmée en ajoutant un 4e argument avec la valeur False :

Sub exemple()

    'Time
    temps = Now + TimeValue("00:00:10")
    
    'Programmation
    Application.OnTime temps, "attente"
    
    'Annulation
    Application.OnTime temps, "attente", , False
    
    '=> la procédure "attente" ne sera donc pas exécutée
	
End Sub

Exécuter une procédure avec des arguments

Bien souvent, la procédure qui doit être exécutée par OnTime nécessite de renseigner un ou plusieurs arguments.

Par exemple pour programmer l'exécution de la procédure suivante, le nombre de secondes doit être renseigné :

Sub attente(secondes)
    MsgBox secondes & " secondes se sont écoulées !"
End Sub

Dans ce cas, au lieu d'entrer "attente" comme dans les exemples précédents, il faut commencer par insérer des apostrophes "'attente'" puis ajouter le ou les arguments (séparés par des virgules s'il y en a plusieurs) "'attente 5'", ce qui donne :

Sub exemple()
    Application.OnTime Now + TimeValue("00:00:05"), "'attente 5'"
End Sub

Si l'argument est une valeur texte, il ne faut pas oublier les guillemets :

Sub exemple()
    Application.OnTime Now + TimeValue("00:00:05"), "'attente ""Cinq""'"
End Sub

Si l'argument est une variable, il faut l'entrer comme ceci :

Sub exemple()
    duree = 5
    Application.OnTime Now + TimeValue("00:00:05"), "'attente " & duree & "'"
End Sub

Sans oublier les guillemets s'il s'agit d'une valeur texte :

Sub exemple()
    duree = "Cinq"
    Application.OnTime Now + TimeValue("00:00:05"), "'attente """ & duree & """'"
End Sub