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
Bonjour,
je cherche un moyen de faire une interruption de macro sur une pression de touche de clavier.
je m'explique, j'ai une macro qui s'exécute sur un changement de textbox1 :

Private Sub TextBox1_Change()
Macro1
End Sub

cette macro1 est relativement longue à s'exécuter et lorsque je tape un mot dans ma TextBox1, la macro s'exécute à chaque lettre frappée ce qui ne gène pas le fonctionnement mais rend très lent l'affichage de la saisie du mot (puisque ma macro s'exécute X fois pour un mot de X lettres)

J'imagine 2 solutions à mon problème/
- faire une iterruption de la macro sur l'événement KeyPress ou
- que l'exécution de la macro ne ce fasse qu'après une tempo déclenchée par une frappe de lettre et que toute nouvelle frappe réinitialise cette tempo.

si quelqu'un à compris mon message et connait une solution, je le remercie d'avance.

A voir également:

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
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.
0
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:32
Je retire cette idée. Elle n'est pas bonne car ne fonctionne pas en événementiel.
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é.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 248
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
0
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
Une fois le "End Sub" de "TextBox1_Change()" atteint, la fonction OnTime n'a plus d'effet.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 248
11 mai 2010 à 18:42
Ah oui ?
As-tu déjà utilisé ontime et peux-tu développer un peu stp ?
0
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
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.
0
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
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.
0
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
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é.
0

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
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.
0
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
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.
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 248
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 :
public t as date
qu'elle soit visible de tous les modules (mais rallonge un peu le nom...)
0
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
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")??????
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 248
12 mai 2010 à 11:29
tu tapes rapidement toi...
essaie avec "00:00:00.1"
0
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
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.
0
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
ça marche pas avec ("00:00:00.1")
Pas grave, merci quand même
0