Arrêter l'exécution d'un Timer - VBA

Bonjour au forum,

J'utilise un timer pour une fermeture automatique du fichier qui me convient parfaitement, mis à part un petit détail :

Je n'arrive pas à trouver comment faire pour stopper l'exécution de la macro "Decompte" (du moins il me semble que c'est celle-ci) une fois le Timer relancé.

Concrètement, après que l'userform du compte à rebours s'affiche dès 30 secondes d'inactivité, en cliquant dans une cellule d'une feuille celui-ci disparait.

Mais dans la fenêtre VBA, on voit que le code est toujours "en

28timer-fof.xlsm (25.89 Ko)

cours d'exécution", jusqu'à la fin du décompte (soit 5 sec).

Comment pourrais-je faire pour stopper cette exécution ? Est-ce possible ?

Merci d'avance !

hello,

for example

Private Sub Workbook_SheetSelectionChange(ByVal sh As Object, _
  ByVal Target As Excel.Range)
      ' --------------- Une modification à été effectuée, relancer le timer
    Application.Run ("FinTimer"):
    Application.Run ("StartTimer")
    If CRebours.Visible Then Unload CRebours
End Sub

Bonjour BsAlv,

Merci pour la réponse.

Malheureusement cela ne fonctionne pas.

On ne par exemple pas modifier une macro juste après avoir cliqué sur "Revenir au fichier" quand l'userform CRebours s'affiche, le temps que le compte à rebours finisse de tourner en tâche de fond, malgré que l'userform soit fermé.

Je n'arrive pas à arrêter ce décompte en tâche de fond.

alors pour ce bouton, il faut aussi ajouter ce "unload me"

Private Sub CommandButton1_Click()
     ThisWorkbook.Activate

     Application.Run ("FinTimer"):
     Application.Run ("StartTimer")
     Unload Me
End Sub

Malheureusement toujours le même problème

alors il faut ajouter une option pour arrêter (temporairement) ce cycle avec la macro "HorsAlerts" et plus tard, on peut redemarrer ce cycle avec la macro "StartTimer". Cette macro "HorsAlerts" est par exemple lancée par le bouton "CommandButton4_Click" de l'userform. Donc il faut ajouter quelque boutons, pour résoudre votre problème.

6timer-fof-1.xlsm (32.52 Ko)
Sub HorsAlerts()
     On Error Resume Next
     CRebours.Hide     ' ------------------ ferme l'userform
     Application.OnTime Attente, "Avertissement", , 0
     On Error GoTo 0
End Sub

Bonjour à tous,

pourquoi as-tu mis

'    Application.OnTime EarliestTime:=Attente, Procedure:="Decompte", Schedule:=False

en commentaire ?

Difficile de tester ton bouzin d'autant plus qu'il est difficile de deviner le fonctionnement voulu exact.

Cependant une chose me turlupine.
Tu me mets les 3 arrêts dans un même On Error Resume Next
Selon moi, si un des deux premier est en erreur tu restes dans le traitement d'erreur et il n'y a pas de pile, VBA est incapable de prendre en compte les suivants.
Je testerai ainsi

Private Sub FinTimer()
' ---------------- Stoppe la procédure d'attente
    CRebours.Hide ' ------------------ ferme l'userform
    On Error Resume Next
    Application.OnTime EarliestTime:=Attente, Procedure:="Avertissement", Schedule:=False
    On Error GoTo 0
    On Error Resume Next
    Application.OnTime EarliestTime:=Attente, Procedure:="Minuterie", Schedule:=False
    On Error GoTo 0
    On Error Resume Next
    Application.OnTime EarliestTime:=Attente, Procedure:="Decompte", Schedule:=False
    On Error GoTo 0
End Sub

Si ça ne suffit pas je tenterai des On Error Goto -1 qui réinitialise en plus le gestionnaire d'erreur, et si pas suffisant encore ajouterai des err.clear après les goto 0 (au cas où mais sans trop y croire).
eric

alors il faut ajouter une option pour arrêter (temporairement) ce cycle avec la macro "HorsAlerts" et plus tard, on peut redemarrer ce cycle avec la macro "StartTimer". Cette macro "HorsAlerts" est par exemple lancée par le bouton "CommandButton4_Click" de l'userform. Donc il faut ajouter quelque boutons, pour résoudre votre problème.

@ BsAlv : Toujours le même soucis malgré cette macro "HorsAlert", le code n'est pas libéré pendant le décompte restant...

@Eriiic : bonjour et merci de jeter un œil sur mon problème.

' Application.OnTime EarliestTime:=Attente, Procedure:="Decompte", Schedule:=False

J'ai mis ce code en commentaire car c'était un test pour voir si cela réglait mon problème, mais ce n'est pas le cas...

Difficile de tester ton bouzin d'autant plus qu'il est difficile de deviner le fonctionnement voulu exact.

J'en conviens parfaitement, et vais essayer d'éclaircir la chose :

J'utilise un fichier contenant une soixantaine de feuilles pour la gestion des horaires de mon équipe, sur l'année, avec beaucoup de subtilités. Ce fichier est, pour l'instant, partagé, donc pas de macros possible.

Pour diverses raisons, je suis obligé d'y intégrer des macros, donc plus de partages possibles. Il me faut donc un moyen pour qu'en cas d'inactivité sur le fichier, celui-ci puisse se fermer automatiquement. J'aimerais que le compte à rebours soit remis à zéro quelque soit l'action de l'utilisateur (clique dans cellule, changement de feuille, etc.).

Mon problème avec le fichier en l'état est que quand on clique sur "Revenir sur le fichier" de l'userform CRebours, le décompte continue de s'executer, ce qui fait qu'aucune autre action ne peut s'effectuer par macro pendant ce temps, ce qui me génère une erreur car ce fichier contient également une macro qui me permet de tracer chaque modification effectuée par l'utilisateur.

Donc si une modif est faite pendant ce temps, j'ai une erreur.

Cependant une chose me turlupine.

Tu me mets les 3 arrêts dans un même On Error Resume Next

Selon moi, si un des deux premier est en erreur tu restes dans le traitement d'erreur et il n'y a pas de pile, VBA est incapable de prendre en compte les suivants.

C'est un code qui m'a été fourni par un des piliers du forum, malheureusement je ne me souviens plus de qui...

j'ai ajouté une ligne FinTimer dans les 2 macros StartTimer et StartLongTimer.

Puis il faut arrêter l'alarme avec un bouton ou manuellement avec la macro "FinTimer". Quand l'userform est visible, c'est facile avec le bouton4, mais autremente vous devez créer un bouton qui appèle cette macro "FinTimer"

12timer-fof-1.xlsm (30.68 Ko)

Puis il faut arrêter l'alarme avec un bouton ou manuellement avec la macro "FinTimer". Quand l'userform est visible, c'est facile avec le bouton4, mais autremente vous devez créer un bouton qui appèle cette macro "FinTimer"

Je ne comprends pas vraiment la différence avec ce qu'il y a déjà d'existant, car la procédure FinTimer est de toute façon appelée si on modifie quelque chose dans une feuille ou lors d'un autre évènement.

as-tu testé ce que je te proposais ?
Pour arrêter le timer c'est

    On Error Resume Next
    Application.OnTime EarliestTime:=Attente, Procedure:="Decompte", Schedule:=False
    On Error GoTo 0

Je précise encore que lorsque l'on clique sur "Revenir au fichier", l'userform se ferme bien, la procédure FinTimer joue bien son rôle car le fichier ne se ferme pas automatiquement à la fin du décompte (et la procédure StartTimer relance bien le Timer une autre fois comme voulu), mais le problème vient juste du fait que pendant ce laps de temps, c'est à dire juste après que l'userform CRebours se soit fermé, il est impossible de faire des modifications dans la fenêtre VBA projet car il y a une exécution en cours (qui dure le temps de la Constante "Alert", il me semble.

C'est seulement après ces quelques secondes que l'on peut modifier le code.

as-tu testé ce que je te proposais ?

Pour arrêter le timer c'est

On Error Resume Next

Application.OnTime EarliestTime:=Attente, Procedure:="Decompte", Schedule:=False

On Error GoTo 0

Oui Eric, j'ai testé mais cela ne résoud pas mon problème non plus.

Comme expliqué dans mon post précédant, le Timer s'arrête bien et se relance bien, mais il reste une exécution en cours pendant quelques secondes juste après avoir cliqué sur "Revenir au fichier"...

n'essayez pas d'être plus malin.

Ces application.Ontime assignent un alarme, qui doit se derouler ou être supprimer le même Application.OnTime avec le même "Earliest time" & procedure et le "Schedule" false. Donc, il faut sortir du cycle en appelant "FinTimer" sans appeler "StartTimer" : au moment où l'userform n'est pas visible appelez "FinTimer" avec un bouton ou manuel ou quand il est visible avec le commandbutton4. Si vous n'êtes pas capable à comprendre cela, dommage, mais alors faitez-le sans hésister et sans penser.

Si vous appelez 5 fois consécutif la macro "StartTimer", il y aura 5 alarmes en même temps actif pour "Avertissement" avec quelque temps de différence. En ajoutant ce FinTimer au début de StartTimer, on évite cela.

Bonjour Nrev74, Bslv, Eriiic,

Si ton besoin est seulement d'arrêter ton Timer. Pour pouvoir accéder à ton éditeur VBA et tes lignes de code.

Voir en retour ton fichier vite modifié. Un clic sur le checkBox (Force) à gauche de ton bouton stoppera ton Timer.

Voire te donnera une autre possibilité selon tout autre besoin.

Je n'essaie pas d'être plus malin comme vous dites. J'essaie de comprendre, et d'apprendre tout simplement.

Je comprends votre explication mais si on appelle FinTimer sans relancer StartTimer, le fichier ne pourra plus se fermer automatiquement n'est-ce pas ?

mais alors faitez-le sans hésister et sans penser.

C'est bien ce que j'ai fait, mais comme expliqué plus haut, ça ne fonctionne malheureusement pas.

Si vous appelez 5 fois consécutif la macro "StartTimer", il y aura 5 alarmes en même temps actif pour "Avertissement" avec quelque temps de différence. En ajoutant ce FinTimer au début de StartTimer, on évite cela.

Je comprends également, mais StartTimer n'est jamais appelé 5 fois consécutivement sans un FinTimer juste avant, ce n'est donc pas une situation qui peut se présenter, du moins il me semble. D'où mon interrogation sur l'intérêt de rajouter le FinTimer en début de procédure du StartTimer.

Étant un amateur débutant en VBA, je ne connais pas toutes les subtilités et m'en excuse, je cherche simplement à comprendre pour apprendre.

Bonjour X Cellus,

Merci également pour ton message et de ton intérêt pour mon problème.

Pour te résumer mon problème :

Je précise encore que lorsque l'on clique sur "Revenir au fichier", l'userform se ferme bien, la procédure FinTimer joue bien son rôle car le fichier ne se ferme pas automatiquement à la fin du décompte (et la procédure StartTimer relance bien le Timer une autre fois comme voulu), mais le problème vient juste du fait que pendant ce laps de temps, c'est à dire juste après que l'userform CRebours se soit fermé, il est impossible de faire des modifications dans la fenêtre VBA projet car il y a une exécution en cours (qui dure le temps de la Constante "Alert", il me semble.

C'est seulement après ces quelques secondes que l'on peut modifier le code.

Ce problème empêche une autre procédure me permettant de tracer toutes modifications du fichier par les utilisateurs de fonctionner, si toutefois cette modification se fait dans ces quelques secondes après la fermeture de l'USF CRebours.

J'espère être assez clair dans mes explications, ce n'est pas évident...

bonjour, la cellule A1 de la feuil1 est utilisé pour temporairement suspendre les events quand cette cellule n'est pas vide. Donc on pourrait utiliser cette option quand on détecte encore de changements au bout du comptage, mais je ne crois pas que c'est nécessaire. Quand les utilisateurs ou VBA font encore quelque chose, cela cause un event dans ThisWorkbook ...

2timer-fof-2.xlsm (30.83 Ko)

On Time ne peut bloquer VBA puisqu'il est géré par le planificateur de tâches ce qui libère totalement VBA.
Ca doit être une autre procédure qui occupe VBA.

Avec le fichier modifié comme indiqué je ne constate pas ton soucis (je n'ai pas testé avant modif, peut-être déjà ok chez moi)).
Dès la fermeture du UserForm je peux saisir et l'événement Change est bien déclenché.
eric

7timer-fof.xlsm (27.74 Ko)

Bonjour BsAlv, Eriiic,

@Eriiic : Je pense que je m'exprime mal depuis le début et j'en suis désolé... Je parle d'une saisie impossible dans l'éditeur VBA et non dans une feuille du classeur :

Peux-tu essayer ceci stp ? Tu ouvres le fichier sur l'onglet "Feuill1" sur une partie de l'écran et l'éditeur VBA où l'on voit le code sur l'autre partie.

Lorsque l'USF CRebours apparait, clique sur "Revenir au fichier", puis clique tout de suite n'importe où dans le code VBA et tape n'importe quoi sur ton clavier.

L'action ne peut pas se faire chez moi car en haut de la fenêtre de l'éditeur VBA il est inscrit "exécution en cours", et ce blocage dure quelques secondes.

J'ai testé la version du fichier de ton dernier message et ça le fait.

Rechercher des sujets similaires à "arreter execution timer vba"