Arrêter une macro en cours avec un panneau d'arrêt

Bonjour à toutes et à tous,

J'ai actuellement une macro qui travaille sur un ERP et qui effectue des tâches avec beaucoup de sendkeys dans une boucle For and next qui peut aller jusqu'à 100 et +.

La macro fonctionne très bien, mais j'aimerai tout de même avoir la possibilité d'arrêter la Macro en tout temps avec un panneau qui a un bouton "Cancel" ou "stop", comment est-ce possible ? Car par exemple un message BOX met le code en arrêt, peut-être avec une API windows ??

J'ai éventuellement ce code ci-dessous trouver sur INTERNET, mais il ne trouve pas le fichier DDL et je ne le comprends pas trop.

Option Explicit
Declare Function getkeystate Lib "user32" (ByVal nvirtkey As Long) As Integer
Public stp As Boolean
If getkeystate(27) > 0 Then
If MsgBox("Confirmation arrêt macro", vbOKCancel + vbQuestion) = vbOK Then
SendKeys Chr(27)
stp = True
Exit Sub
End If
SendKeys Chr(27)
End If
Loop
End Sub

D'avance merci pour votre retour.

Bonjour,

Ctrl+[Pause] ne suffit pas ?

A+

Bonjour,

Malheureusement non, car quand je clique sur le bouton pour lancer le code, ma fenêtre active est celle de l'ERP avec un Appactivate(ERP)

De plus ça effectue des sendkeys sur l'ERP.

J'ai même essayé avec ce code qui fonctionnait uniquement quand j'étais sur Excel :

Sub handleError()
On Error GoTo MyErrorHandler
 Application.EnableCancelKey = xlErrorHandler

 'Just an example to show something is running
 For i = 0 To 900000
 Range("A1") = i
 Next i

MyErrorHandler:
If Err.Number = 18 Then '18 =User interrupt
     MsgBox " You clicked Ctrl + Break "
     Exit Sub

End If
End Sub

Dans ta boucle For tu peux y insérer un DoEvents et une gestion d’erreur (une surveillance de variable) avec un Stop.

Genre :

Public Y As Boolean
Sub TaMacro()
For...
DoEvents
If Y Then GoTo GESTERR
    'longue suite d'instruction…
Next
    'Suite et Fin de la macro
Exit Sub
GESTERR:
Stop
End Sub

...Et dans ton ton bouton tu mets un Y = True

A+

Re,

merci de ta proposition, je viens d'essayer mais ça ne fonctionne pas. J'ai juste pas compris ta dernière phrase "Dans ton bouton tu mets un Y = True" ?

Ce que j'entendais par bouton, c'est un bouton de commande, mais une fois déclenché je bascule sur l'ERP donc Excel n'est plus actif. Il ne suffit pas de presser "Y" sur le clavier pour arrêter la MACRO ?

Non !

Tu parlais d'un panneau qui a un bouton "Cancel" ou "stop" donc je pensais que tu avais un usf qui gardait la main.

Je ne suis pas un adepte des Sendkeys :Moi j'essaierai de poser un bouton dans le ruban qui n'aurait qu'une seule utilité faire basculer ton Y à True.

Après les API, c'est pas mon truc non plus peut-être que quelqu'un sera plus à la coule que moi sur ce sujet. C'est vrai qu'avec VBA c'est pas le 1er truc sur lequel on se jette !

C'est quand même pas clair ton truc : Tu parles d'une boucle For... mais Excel n'a plus la main ? Comment tu veux intervenir sur ton ERP si tu n'as plus la main ?

A+

Sub BoucleERP()
Dim finBoucle As Boolean
Dim cptBoucle
On Error GoTo MyErrorHandler
 Application.EnableCancelKey = xlErrorHandler

'   Boucle réelle du traitement ERP
'   Au lieu d'utiliser un FOR/NEXT tente un WHILE/WEND
cptBoucle = 1
While Not(cptBoucle > maximumBoucle) and not finBoucle
' Traitement ERP
   cptBoucle = cptBoucle +1
Wend

MyErrorHandler:
If Err.Number = 18 Then '18 =User interrupt
     MsgBox " You clicked Ctrl + Break "
     finBoucle = True
     Resume Next
Else
     Exit Sub
End If

End Sub

Peut-être une idée à tenter...

Au lieu de stopper avec le CTRL-BREAK géré par On Error comme je l'ai fait ici, je pense que tu dois pouvoir ouvrir un Userform avant le traitement de la boucle, qui contient ton bouton "STOP" qui active la variable finBoucle !

PS/ Je n'ai rien testé, c'est une tentative de code à la volée !

Au fait, du moment que tu déclenche un Appactivate pour aller sur l'ERP, je ne peux plus revenir sur mon fichier EXCEL pour déclencher un bouton ou même un icône dans barre de raccourci.

UserForm serait "peut-être" une solution, mais je suis très mauvais, je n'arrive jamais à comprendre comment les utiliser etc..

La meilleure des solutions serait un msgbox (question si possible) non-modal qui resterait tout le long de la procédure et si ce msgbox est fermé, il déclencherait un "END" qui permettrait de tout arrêter.

Le seul msgbox en non-modal que j'ai trouvé et celui ci-dessous :

Sub MSGBOX_MSG()
Message = "test non modal"
Shell "MSG " & Environ("username") & " " & Message
End Sub

Y aurait-il un moyen de faire en sorte de mettre une condition que si ce message est fermé = "END" ou sinon il fait rien ?

D'avance merci

Hello Green,

je viens d'essayer d'adapter ton code au mieux, on est d'accord qu'il faut presser sur Escape pour sortir ?

Si, c'est ça le code continue toujours de fonctionner :/

Bonjour Vincent_SL7

Dans la théorie oui ! [Echap] ou [CTRL-PAUSE] selon les cas !

Moi aussi je suis un "nul" avec les Userform, mais je pense qu'un formulaire tout simple avec juste un "gros et beau" bouton "STOP" en plein milieu ferait l'affaire, et il me semble que notre ami galopin01 connait bien mieux que moi les formulaires. Dans mon idée le bouton "STOP" doit mettre ma variable "finBoucle" à VRAI !

Re,

J'ai ressayé, ça fonctionne toujours pas :/

Sacré cas...

Bonjour Vincent_SL7, Le Forum,

Pour certains gros fichiers Excel à tester utilisant des boucles. J'utilise une astuce me permettant de toujours bloquer l'application.

Je crée d'abord dans un dossier ou sur le bureau du PC un fichier de type .Txt même en le laissant vide. Et le nomme avec un nom très court.

Ensuite dans la macro que je veux stopper je place le code ci dessous.

Ne pas oublier avant dans l'éditeur VBA par le menu Outils puis Références d'ajouter par cochage la référence Microsoft Scripting Runtime au projet.

Sub BoucleTest()
Dim oFSO As Scripting.FileSystemObject
Dim oFl As Scripting.File
'Instanciation du FSO
Set oFSO = New Scripting.FileSystemObject
For T = 1 To 9000000
'Instanciation de l'objet Fichier
If Not oFSO.FileExists("C:\Users\Untel\Pictures\AA.txt") Then MsgBox "Stop Hiérarchique"
If Time > TimeValue("11:00:00") Then MsgBox "Stop Horaire" 'Facultatif
Next T
End Sub

Laisser ouvert le dossier contenant le fichier texte. Ici nommé AA.txt (sans ouvrir ce dernier) dans le dossier Images.

Le principe étant de passer par le niveau hiérarchique supérieur. Excel étant d'un niveau Application donc inférieur au Système d'Exploitation.

Pour arrêter le programme il suffit de cibler avec la souris le fichier .txt et de le renommer. Ici en AB.txt ou BA.txt

Cela va lancer la boîte de message. Pas besoin de cliquer sur Ok. Faire un CTRL Pause, et le mode débogage s'activera.

Bonjour X Cellus,

Merci de ton retour,

je suis actuellement en train d'essayer cependant comment je peux combiner les deux boucles correctement ?

Voici un exemple simplifié :

Sub Code_arret_test()

Dim oFSO As Scripting.FileSystemObject
Dim oFl As Scripting.File
'Instanciation du FSO
Set oFSO = New Scripting.FileSystemObject

'procédure dans l'ERP boucle

For x = 1 To 100000

Debug.Print Cells(x, x).Value & x

'procédure dans l'ERP boucle

For t = 1 To 9000000
'Instanciation de l'objet Fichier
If Not oFSO.FileExists("H:\My Pictures\AA.txt") Then MsgBox "Stop Hiérarchique"

Next t

Next x

End Sub
Car avec le code ci-dessous, j'ai toujours une des boucle qui passe en priorité.

Re à tous,

La solution serait ceci ?

Dim oFSO As Scripting.FileSystemObject
Dim oFl As Scripting.File
'Instanciation du FSO
Set oFSO = New Scripting.FileSystemObject

For t = 1 To 9000000

'procédure dans l'ERP boucle

For x = 1 To 100000

Debug.Print Cells(x, x).Value & x

'procédure dans l'ERP boucle

'Instanciation de l'objet Fichier
If Not oFSO.FileExists("H:\My Pictures\AB.txt") Then MsgBox "Stop Hiérarchique"

Next x

Next t

End Sub

Bonjour Vincent_SL7, Le Forum,

Pour montrer le principe j'ai réalisé une boucle afin de simuler un certain temps de fonctionnement de la macro.

Par contre il est inutile de reprendre cette boucle (T) puisque tu en as déjà une dans ton programme. Seul le reste de la macro est a insérer dans ton programme.

Note cependant que lorsque l'ERP aura fini sa procédure en cours et reviendras sur la boucle (X) d'où il est issu.

Toute modification du nom du fichier même anticipé sur le temps de fonctionnement de l'ERP stoppera la macro.

Rechercher des sujets similaires à "arreter macro cours panneau arret"