Interruption de macro VBA
Résolu/Fermé
kurth
Messages postés
21
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
24 septembre 2013
-
11 mai 2010 à 14:38
commentcamarcheeay Messages postés 667 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 30 mars 2020 - 12 mai 2010 à 12:16
commentcamarcheeay Messages postés 667 Date d'inscription mercredi 24 février 2010 Statut Membre Dernière intervention 30 mars 2020 - 12 mai 2010 à 12:16
A voir également:
- Interruption de macro VBA
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Macro word - Guide
- Macro logiciel - Télécharger - Organisation
- Macro recorder - Télécharger - Confidentialité
- Vba attendre 1 seconde ✓ - Forum VB / VBA
8 réponses
commentcamarcheeay
Messages postés
667
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
11 mai 2010 à 15:21
11 mai 2010 à 15:21
Bonjour,
On peut essayer la fonction "Now"
Le fait d'appuyer sur une touche met une variable globale "decalage" à Now + 3s
decalage = Now + 0.00003
Et quand puis il faut ajouter une boucle à ta méthode
Do while Now < decalage
Loop
Cela permettra d'exécuter une boucle vide jusqu'à l'épuisement de 3 secondes. Le code s'exécutera dès que le décalage est atteint.
On peut essayer la fonction "Now"
Le fait d'appuyer sur une touche met une variable globale "decalage" à Now + 3s
decalage = Now + 0.00003
Et quand puis il faut ajouter une boucle à ta méthode
Do while Now < decalage
Loop
Cela permettra d'exécuter une boucle vide jusqu'à l'épuisement de 3 secondes. Le code s'exécutera dès que le décalage est atteint.
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
11 mai 2010 à 15:46
11 mai 2010 à 15:46
Bonjour,
teste ça :
Private Sub TextBox1_Change()
Application.OnTime Now + TimeValue("00:00:02"), "Macro1"
End Sub
Je pense qu'un nouvel évènement écrasera la précédente tempo, si ce n'est pas le cas il faudra auparavant supprimer la précédente (dont on aura mémorisé l'heure de déclenchement) avec Schedule:=False (voir aide vba de ontime)
eric
teste ça :
Private Sub TextBox1_Change()
Application.OnTime Now + TimeValue("00:00:02"), "Macro1"
End Sub
Je pense qu'un nouvel évènement écrasera la précédente tempo, si ce n'est pas le cas il faudra auparavant supprimer la précédente (dont on aura mémorisé l'heure de déclenchement) avec Schedule:=False (voir aide vba de ontime)
eric
commentcamarcheeay
Messages postés
667
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
11 mai 2010 à 17:32
11 mai 2010 à 17:32
Une fois le "End Sub" de "TextBox1_Change()" atteint, la fonction OnTime n'a plus d'effet.
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
11 mai 2010 à 18:42
11 mai 2010 à 18:42
Ah oui ?
As-tu déjà utilisé ontime et peux-tu développer un peu stp ?
As-tu déjà utilisé ontime et peux-tu développer un peu stp ?
commentcamarcheeay
Messages postés
667
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
11 mai 2010 à 20:51
11 mai 2010 à 20:51
Bonjour
J'avais fait une mauvaise application à OnTime. En fait, le code de la macro que je voulais exécuter se trouvait dans un UserForm. Et là, en effet, il n'arrive pas à le trouver. J'avais tord de dire que OnTime n'a pas d'effet, en vérité, il n'arrive pas à trouver la procédure.
Quand j'ai mis la procédure sur un module simple séparé, il n'y avait pas de mal à exécuter la procédure. Même quand la UserForm est déchargée de la mémoire.
Effectivement, OnTime pourrait bien fonctionner pour ce programme. Mais, comme tu as fait remarquer, un nouvel événement n'écrase pas son précédent. Effectivement, il faut mettre la valeur de Schedule := False. Je vais essayer de mettre cela forme dans le prochaine post.
J'avais fait une mauvaise application à OnTime. En fait, le code de la macro que je voulais exécuter se trouvait dans un UserForm. Et là, en effet, il n'arrive pas à le trouver. J'avais tord de dire que OnTime n'a pas d'effet, en vérité, il n'arrive pas à trouver la procédure.
Quand j'ai mis la procédure sur un module simple séparé, il n'y avait pas de mal à exécuter la procédure. Même quand la UserForm est déchargée de la mémoire.
Effectivement, OnTime pourrait bien fonctionner pour ce programme. Mais, comme tu as fait remarquer, un nouvel événement n'écrase pas son précédent. Effectivement, il faut mettre la valeur de Schedule := False. Je vais essayer de mettre cela forme dans le prochaine post.
commentcamarcheeay
Messages postés
667
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
11 mai 2010 à 21:00
11 mai 2010 à 21:00
Bonjour,
Pour compléter la solution d'eriiic, voici un exemple d'utilisation de Application.OnTime, cela t'évitera, si tu n'as pas l'habitude de l'utiliser, de multiplier les tests.
Dim t As Date
Private Sub TextBox1_Change()
On Error Resume Next
Application.OnTime t, "test", , False
t = Now + TimeValue("00:00:03")
Application.OnTime t, "test"
End Sub
La procédure 'test' est à mettre dans un module simple.
A chaque itération, on efface l'événement précédent avec "Schedule := False" et on relance un autre à partir de ce moment.
Je rappelle juste que cette application a fait le sujet de remarque d'eriiic quand il a proposé cette solution.
Pour compléter la solution d'eriiic, voici un exemple d'utilisation de Application.OnTime, cela t'évitera, si tu n'as pas l'habitude de l'utiliser, de multiplier les tests.
Dim t As Date
Private Sub TextBox1_Change()
On Error Resume Next
Application.OnTime t, "test", , False
t = Now + TimeValue("00:00:03")
Application.OnTime t, "test"
End Sub
La procédure 'test' est à mettre dans un module simple.
A chaque itération, on efface l'événement précédent avec "Schedule := False" et on relance un autre à partir de ce moment.
Je rappelle juste que cette application a fait le sujet de remarque d'eriiic quand il a proposé cette solution.
kurth
Messages postés
21
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
24 septembre 2013
1
12 mai 2010 à 10:04
12 mai 2010 à 10:04
Merci à vous pour vos idées.
j'ai fais le test de la dernière proposition qui à l'air de porter quelques fruits mais il reste encore des petits soucis.
le fais de mettre le shedule à False n'a pas l'air d'annuler les procédures "Test" lancées avant la fin de la tempo mais juste de les inhiber et donc elles se lancent toutes à la fin de la tempo.
Si l'un de vous à une solution pour annuler, la solution sera trouvé.
j'ai fais le test de la dernière proposition qui à l'air de porter quelques fruits mais il reste encore des petits soucis.
le fais de mettre le shedule à False n'a pas l'air d'annuler les procédures "Test" lancées avant la fin de la tempo mais juste de les inhiber et donc elles se lancent toutes à la fin de la tempo.
Si l'un de vous à une solution pour annuler, la solution sera trouvé.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
kurth
Messages postés
21
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
24 septembre 2013
1
12 mai 2010 à 10:21
12 mai 2010 à 10:21
l'autre soucis c'est que la 1ère tempo lancé au premier changement n'est pas annulée donc quoi qu'il arrive, la procédure "test" ce lance à la fin de la tempo même si des changements sont fait dans la textbox.
commentcamarcheeay
Messages postés
667
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
12 mai 2010 à 10:46
12 mai 2010 à 10:46
Bonjour,
J'espère que tu as bien définit la variable t comme variable globale. Il faut qu'elle soit déclarée dans le champs des déclarations, tout en haut du texte du code, en dehors de la procédure TextBox1_Change(). Sinon, à chaque fois elle va être initialisée à TimeValue("00:00:00").
En fait, si on porte la valeur Schedule de OnTime à False, il faut qu'elle soit précédée par un événement qui se déroule dans le même temps annulé. Quand cependant t est réinitialisée, on risque de demander l'annulation d'un événement qui n'a pas été déclaré au préalable.
Si tu remarque, à la première exécution du code dans le permalink #7, t n'est pas encore initialisée. Si on n'avait pas mis l'instruction "On Error Resume Next", cela engendrerait un arrêt de programme. Ce n'est qu'à la seconde frappe de clavier que cette ligne a un effet. Et pour que d'une frappe à une autre t garde la valeur précédente, il faut qu'elle soit globale par rapport à la procédure.
J'ai tester de nouveau ce bout de code, la procédure ne s'exécute que si j'arrête d'écrire pendant la durée prescrite.
J'espère que tu as bien définit la variable t comme variable globale. Il faut qu'elle soit déclarée dans le champs des déclarations, tout en haut du texte du code, en dehors de la procédure TextBox1_Change(). Sinon, à chaque fois elle va être initialisée à TimeValue("00:00:00").
En fait, si on porte la valeur Schedule de OnTime à False, il faut qu'elle soit précédée par un événement qui se déroule dans le même temps annulé. Quand cependant t est réinitialisée, on risque de demander l'annulation d'un événement qui n'a pas été déclaré au préalable.
Si tu remarque, à la première exécution du code dans le permalink #7, t n'est pas encore initialisée. Si on n'avait pas mis l'instruction "On Error Resume Next", cela engendrerait un arrêt de programme. Ce n'est qu'à la seconde frappe de clavier que cette ligne a un effet. Et pour que d'une frappe à une autre t garde la valeur précédente, il faut qu'elle soit globale par rapport à la procédure.
J'ai tester de nouveau ce bout de code, la procédure ne s'exécute que si j'arrête d'écrire pendant la durée prescrite.
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
Modifié par eriiic le 12/05/2010 à 11:16
Modifié par eriiic le 12/05/2010 à 11:16
Bonjour,
Je rejoint ccmay, si tu as bien déclaré t à l'extérieur de la procédure pas de raison qu'elle ne s'annule pas.
Si tu la déclares à l'extérieur du module met :
Je rejoint ccmay, si tu as bien déclaré t à l'extérieur de la procédure pas de raison qu'elle ne s'annule pas.
Si tu la déclares à l'extérieur du module met :
public t as datequ'elle soit visible de tous les modules (mais rallonge un peu le nom...)
kurth
Messages postés
21
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
24 septembre 2013
1
12 mai 2010 à 11:20
12 mai 2010 à 11:20
Nickel!
Je n'avais pas déclaré "t" en global mais une fois fait, ça fonctionne.
Un grand merci à toi.
PS: y a t'il moyen de mettre un temps de 0.1s? ("00:00:00:1")??????
Je n'avais pas déclaré "t" en global mais une fois fait, ça fonctionne.
Un grand merci à toi.
PS: y a t'il moyen de mettre un temps de 0.1s? ("00:00:00:1")??????
eriiic
Messages postés
24600
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 octobre 2024
7 239
12 mai 2010 à 11:29
12 mai 2010 à 11:29
tu tapes rapidement toi...
essaie avec "00:00:00.1"
essaie avec "00:00:00.1"
commentcamarcheeay
Messages postés
667
Date d'inscription
mercredi 24 février 2010
Statut
Membre
Dernière intervention
30 mars 2020
86
12 mai 2010 à 12:16
12 mai 2010 à 12:16
Je viens de voir hier dans un forum qu'OnTime est limitée aux secondes vu que son premier argument est de type Date. Et ce type ne prends en compte que les secondes.
kurth
Messages postés
21
Date d'inscription
lundi 4 janvier 2010
Statut
Membre
Dernière intervention
24 septembre 2013
1
12 mai 2010 à 11:37
12 mai 2010 à 11:37
ça marche pas avec ("00:00:00.1")
Pas grave, merci quand même
Pas grave, merci quand même
11 mai 2010 à 15:32
Tout ce qu'elle permet de faire c'est de tout arrêter jusqu'au temps requis puis passer à la suite du code.
Si quelqu'un a une autre idée, je suis également intéressé.