Application.OnTime

Davidc57

XLDnaute Occasionnel
Bonjour le forum,

J'aimerai faire un point concernant la fonction Application.OnTime qui permet d'exécuter une macro excel à une heure prédéterminée.

Mon besoin :

Exécuter une macro excel tous les jours à 17h15 sauf le samedi et le dimanche.
A savoir que le PC est constamment allumé, excel est toujours ouvert de même que le fichier contenant la macro.

Ma méthode actuelle :

J'ai joint un fichier excel pour l'exemple ...

Sous l'objet, ThisWorkbook, je donne une première instruction Application.OnTime dans une procédure Workbook_Open()
Sous l'objet Module1, se trouve la macro 'macro1' qui doit être exécutée chaque jour. A la fin de cette macro je redonne une instruction Application.OnTime pour l'exécution du lendemain.

Mon problème :

1. La 'macro1' s'exécute bien à l'heure prévue, le jour de l'ouverture du fichier. Donc la procédure Private Sub Workbook_Open() fonctionne parfaitement bien, cependant à la fin de la 'macro1' je redonne l'instruction pour le lendemain à la même heure mais parfois (pas tous les jours) la 'macro1' s'exécute deux fois de suite. Pourtant la dernière instruction, Application.OnTime, de la 'macro1', qui indique à Excel de relancer la macro 'macro1' à 17h15m00s s'exécute quelques secondes après 17h15m car il faut le temps d'exécuter toutes les instructions de la 'macro1'. Là il n'y a qu'une MsgBox mais dans mon cas précis la macro1 tourne en environ 15 secondes.

Donc si à 17h15m15s je reéxecute une instruction Application.OnTime à 17h15m00s je m'attend à ce qu'elle ne s'exécute que le lendemain et pas une deuxième fois juste après la première !!!!


2. Ma macro a tourné le samedi et le dimanche me causant des problèmes de dates dans mes fichiers de sorties .... car dans ma vraie 'macro1' celle-ci créé des fichiers csv

Conclusion :

Je ne parviens pas à stabiliser cette instruction Application.OnTime, si vous avez des conseils pour moi, peut-être que je l'utilise mal ou que j'ai oublié quelque chose ?

La solution que j'espère ne doit pas faire appel au Gestionnaire des tâches de Windows.
je epux éventuellement faire tourner la macro toutes les heures et en début de macro faire des tests (jour de la semaine et heure) pour vérifier s'il faut vraiment exécuter le code ou pas ... qu'en pensez-vous ?

merci d'avance de votre soutien,
David
 

Pièces jointes

  • Test Scheduler Macro.xls
    26 KB · Affichages: 221

tototiti2008

XLDnaute Barbatruc
Re : Application.OnTime

Bonjour David, Bonjour Pierrot,

Peut-être comme ça

Code:
Sub macro1()
    If Weekday(Date, vbMonday) < 6 Then
        MsgBox ("Ca marche")
    End If
    ' Une fois la macro exécutée, on reschedule pour le lendemain ...
    Application.OnTime Now + TimeValue("23:59:59"), "macro1", , True
    
End Sub
 

Davidc57

XLDnaute Occasionnel
Re : Application.OnTime

Bonjour tototiti,

C'est sympa ca ! Je vais essayer ...

Donc la première fois ca va tourner à 17h15m00s ... admettons que la macro dure 15secondes, on va rescheduler à la fin pour dans 23h59m59s cad que normalement la macro tournera le lendemain à 17h15m14s ... le surlendemain à 17h15m28s etc ...

Si ca marche moi ca me va.

Bon faut du temps pour tester, faut 24 heures en fait. Je démarre mon test en changeant l'heure, je bais faire tourner à 9h40m00s car cela ne change rien au problème et j'aurai le résultat du test demain matin comem cela.

Je reviendrai avec les résultats du test. En attendant si vous avez d'autres idées de tests à faire dites le je ferai plusieurs tests en parallèle car j'aimerai éviter d'attendre 24h entre chaque test ...

Encore merci,
 

Davidc57

XLDnaute Occasionnel
Re : Application.OnTime

Bonjour le forum,

Alors hier j'ai monopolisé un PC pour faire mes tests. J'ai demandé une première exécution de la macro à 9h53m00s via la procédure workbook_Open(). Cela a fonctionné mais je ne m'explique pas pourquoi la macro1 a tourné une deuxième fois à 9h55m00s.

J'attends maintenant 9h55 pour voir ce qu'il va se passer mais tout de même il se passe des choses étranges avec cette fonction .OnTime !!!

Ma macro1 inscrit dans la colonne A de ma Sheet1 à quelle heure elle tourne ce qui me permet d'avoir une tracabilité précise. C'est comme cela que j'ai vu qu'elle avait tourné 2 minutes après la première exécution.

Est-il 'bon' ou recommandé de neutraliser les Application.OnTime en donnant une instruction avec le paramètre False (à la fin) puis juste après de redonner l'instruction Application.OnTime avec le paramètre True ?

A+
 

Pierrot93

XLDnaute Barbatruc
Re : Application.OnTime

Bonjour David, Toto

Est-il 'bon' ou recommandé de neutraliser les Application.OnTime en donnant une instruction avec le paramètre False (à la fin) puis juste après de redonner l'instruction Application.OnTime avec le paramètre True ?

Perso vois pas trop l'intérêt... il me semble par contre important que la procédure soit à "false" lors de la fermeture du classeur...

bonne jorunée
@+
 

Davidc57

XLDnaute Occasionnel
Re : Application.OnTime

Bonjour Pierrot,

Merci de ton avis.
J'attends de voir ce qu'il va se passer .... dans un peu plus d'une heure maintenant ... mais je m'oriente de plus en plus vers un`contrôle complet (quel jour sommes nous ?, quelle heure est-il ?, et quand le programme a t'il tourné la dernière fois ?)

Les réponses à ces questions devraient me permettre de donner un feu vert ou un feu rouge pour l'exécution du code de ma macro1.

Je peux scheduler ma macro toutes les heures et faire les 3 tests successifs :

Test 1 : Sommes nous un samedi ou un dimanche -> Si OUI alors STOP la macro
Test 2 : Sommes nous entre 17h et 18h -> Si NON alors STOP la macro
Test 3 : La macro a t'elle fait son job il y a moins de une heure -> Si OUI alors STOP la macro

Comme ca j'empêche que la macro tourne 2 minutes après une exécution complète (ce qui entre nous n'est pqs un trop gros problème) mais surtout je m'assure ainsi qu'elle ne va pas tourner à mon insu à un moment plus critique, par exemple si elle tourne après minuit, les dates change et là c'est un problème pour moi.

Va me falloir encore un peu de patience avant d'aboutir à quelque chose de stable mais ca va venir ...

Je vous tiens au courant mais je reste à l'écoute de vos propositions ...

David
 

tototiti2008

XLDnaute Barbatruc
Re : Application.OnTime

Bonjour David, Pierrot,

Tant que ta macro se lance 2 fois d'affilée, et se relancera 2 fois la prochaine fois, puisque chaque exécution programme une autre execution 1 heure plus tard...
donc tes tests pourraient être utiles (ou bien fermer Excel plus d'une heure pour être sûr qu'il arrête tous les appels programmés)

Est-il 'bon' ou recommandé de neutraliser les Application.OnTime

Pourquoi pas dans certains cas mais ça nécessite de connaitre l'heure exacte à laquelle ils ont été programmés...
 

Davidc57

XLDnaute Occasionnel
Re : Application.OnTime

Un petit update avec les résultats du jour.

Rappel : Hier j'ai ouvert mon fichier excel en demandant l'exécution de la macro à 9h53m00s, puis je lui demande de tourner toutes les 23h59m59s ... voilà les résultats :

Le programme a été exécuté :

A. Le 25/10/2010 à 9h53m00s
B. Le 25/10/2010 à 9h55m00s -> JE NE COMPREND PAS POURQUOI
C. Le 26/10/2010 à 9h52m01s -> JE NE COMPREND PAS POURQUOI
D. Le 26/10/2010 à 9h52m59s -> OK, c'est bien 23h59m59s après l'exécution en A
E. Le 26/10/2010 à 9h54m59s -> OK, c'est bien 23h59m59s après l'exécution en B, nien que je n'avais pas demandé B !!

Donc si je ne touche à rien, je m'attend à ce qu'il tourne au moins 3 fois demain, et peut-être 4 fois. 3 exécutions correspondraient à 23h59m59s de plus que C, D et E et peut être une 4è exécution car chaque jour il y a une exécution que je ne comprend pas ....

Je vais donc mettre en place mes 3 tests successifs .... réponse demain même heure !

A+
David
 

Discussions similaires

Réponses
9
Affichages
665

Statistiques des forums

Discussions
312 331
Messages
2 087 352
Membres
103 526
dernier inscrit
HEC