Interruption de macro VBA
Résolu
kurth
Messages postés
21
Date d'inscription
Statut
Membre
Dernière intervention
-
commentcamarcheeay Messages postés 667 Date d'inscription Statut Membre Dernière intervention -
commentcamarcheeay Messages postés 667 Date d'inscription Statut Membre Dernière intervention -
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.
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:
- Interruption de macro VBA
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Jitbit macro recorder - Télécharger - Confidentialité
- Télécharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Macro word - Guide
- Excel compter cellule couleur sans vba - Guide
8 réponses
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.
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
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.
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.
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
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.
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.
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é.