Bouton pour interrompre une macro

  • Initiateur de la discussion LaurentTBT
  • Date de début
L

LaurentTBT

Guest
Bonsoir à tous,

J'ai une macro qui effectue une boucle qui peut être très longue.
Je voudrais mettre sur ma feuille excel un bouton qui, si l'on clique dessus pendant que la boucle tourne, permettrait de l'arrêter, tout en terminant proprement la procédure initiale.
Le problème est: comment intercepter le clic sur le bouton d'arrêt alors que la macro tourne (souris représentée par le sablier)?

Je sais intercepter un appui sur ATTN, mais comme tout le monde ne connaît pas, je préfèrerais pouvoir mettre un bouton!

Merci d'avance et bonne soirée à tous.
 
Y

yeahou

Guest
Salut

Je ne vois pas comment utiliser un bouton.
Tu pourrais par contre utiliser la récupération de l'interruption [Echap] pour fermer proprement, celle la tout le monde la connait ou à peu prés.

sub test()
'redirige la touche echap sur une erreur utilisateur
Application.EnableCancelKey = xlErrorHandler
'sur erreur envoie la routine
on error goto Gere_Erreurs
'boucle d'attente
for compteur=1 to 100000000
next compteur
exit sub
Gere_Erreurs:
'sur erreur 1000 uniquement, envoie la routine fermeture propre
If Err = 1000 then
'fermeture propre
else
'traitement des autres erreurs
end if
end sub

A+
 
L

LaurentTBT

Guest
Bonjour à tous, salut, Yeahou

En effet, le traitement de l'interruption par le bouton ESC est aussi possible, c'était ma solution de replis. Je connaissais en interceptant un appui sur ATTN, et j'ai vu hier soir que c'était aussi possible avec ESC comme tu le dis.
Et ce matin, j'ai trouvé la solution pour passer par des boutons: DoEvents est le mot magique!

Supposons que j'ai un bouton "DEMARRER".
Voici la macro:

Private Sub CmbDémarrer_Click()
Dim i As Integer
Static Arrêt As Boolean

If Me.CmbDémarrer.Caption = "DEMARRER" Then
Me.CmbDémarrer.Caption = "ARRET"
For i = 1 To 10000
' Ici mes codes inclus dans ma boucle

DoEvents 'Permet de laisser excel faire une autre procédure
'Notamment, relancer la même macro après un autre appui
'sur le bouton qui s'appelle maintenant "ARRET"
'et qui va aller mettre le booléen static Arrêt à True
If Arrêt Then
i = 10000 'Permet d'arrêter la boucle
Arrêt = False
'Puis mettre le code pour finir proprement.
End If
Next i

Else
Arrêt = True
Me.CmbImporter.Caption = "IMPORTER"
End If
End Sub

Voilà, je dois encore tester ça plus précisément, pour vérifier que ça marche quelque soit le moment où le clic d'interruption intervient.
Et j'en profite pour voir comment passe la recopie du code (et notamment les tabulations)

Bonne journée à tous.
 
L

LaurentTBT

Guest
Zut, les tabulations ne passent pas!
Tiens et ici, cette ligne commence par 4 espaces. Sont-ils là?
J'ai l'impression que même les espaces ne sont pas pris en compte.
Tant pis. À plus.
 
@

@+Thierry

Guest
Bonjour Laurent, Yeahou, le Forum

Oui Laurent pour le DoEvents, qui permet de rendre la main en cours de boucle, c'est souvent très utile.

Pour les Tabulation, tu parles d'ici, dans le Forum ?, humm c'est pas encore le cas ! Ce serait bien mais je ne pense pas que le PHorum le permette.

Sinon juste une petite réflexion par rapport aux noms utilisés dans le code que tu as mis en ligne Laurent : "CmbDémarrer", "Arrêt "... Je sais que sur un PC en Français avec des codes écrit par des Français c'est parfois choquant de lire "Arret" ou encore "CmbDemarrer", mais j'ai le souvenir d'un Post avec Ti où l'on avait estimé dangereux d'utiliser tout caractères spéciaux, car même si dans certains cas "ça passe", bien souvent la pluspart des Objects refusent d'être nommés de la sorte. Un nom de macro, ou un nom de variable ne semble pas être affecté par un problème, jusqu'au jour où l'on fait tourner sur un PC avec Windows et Office en américain, ou encore une autre Pays qui ne gère pas les accents.

Je vais même jusqu'à faire très attention dans mes noms d'Onglets de Feuilles... Car un accent ou un espace peut parfois faire planter (par exemple pour un RowSource en RunTime)

C'est pour ceci que finalement je nomme tout en anglais avec un "The " ("TheName", "ThePath", "TheStop", "TheString" etc etc..) Chacun a ses propres habitudes de progammation, moi les Maj/Min mélangées dans mes variables, me permet de les taper en Minuscule et de voir en temps réél si elle sont en syntax correcte immédiatement quand VBE me remplace les MAJ ... (Avant même qu' Option Explicit ne se fache !)

Enfin ce n'est rien de grave, juste, peut-être une habitude, car de toute manière en VBA tout est en anglais, et Maître Capello ne viendra pas dans VBE te dire que tu as écrit "Arret" sans accent

Bonne Journée à tous et toutes (T.G.F........ or TGIF !!!)

@+Thierry
 
L

LaurentTBT

Guest
Salut, Thierry,

Oui, tu as 100% raison, d'ailleurs j'en ai fait les frais avec mon grenier v1, puisque des images contenant des accents dans leur nom n'étaient plus reconnues après dézippage.

N'ayant pas eu de problème dans mes codes VBA, je n'avait rien changé, mais je vais suivre tes recommandations et tout modifier.

Pour les MajMin, oui, j'utilise aussi ton truc.

Et enfin, pour les tabulations, oui, je parlais du forum.

Merci, bonne journée.
 

Discussions similaires

Statistiques des forums

Discussions
312 370
Messages
2 087 688
Membres
103 638
dernier inscrit
Pascal29