OVH Cloud OVH Cloud

Arrêter une macro, sortir boucle for

2 réponses
Avatar
Podgers_95
Voilà mon problème :

J'ai plusieurs boucles "for" imbriqué les unes derrières les autres :

For a = 1 To 1 + Nb_iteration_A * 5
For b = 1 To 1 + Nb_iteration_B * 5
For c = 1 To 1 + Nb_iteration_C * 5
For d = 1 To 1 + Nb_iteration_D * 5 etc...

somme = Cells(4, a + 2).Value * Nb_iteration_A +
Cells(4, b + 2).Value * Nb_iteration_B + Cells(4, c + 2).Value *
Nb_iteration_C + Cells(4, d + 2).Value * Nb_iteration_D etc....

Cela peut donc faire des calculs long, trés long.... J'aimerais mettre fin à
ces calculs à n'importe quel moment (quand j'en ai marre d'attendre) en
appuyant sur "ESCAPE" ou "F1" ou sur n'imprte quoi, une touche, un bouton, le
bouton RESET de ma tour....

J'ai essayer ça :
1) -> Application.OnKey "{F1}", "Arret"
mais le saut à la procédure "Arret" ne se fait qu'aprés tous les calculs
effectués.

Et ça :
2) -> On Error GoTo handleCancel
Application.EnableCancelKey = xlErrorHandler

handleCancel:
If Err = 18 Then
a = b = c = d = e = f = g = 6
MsgBox "erreur 18"
Exit Sub
End If

Mais le problème reste le même, l'erreur n'est prise en compte qu'a la
sortie des boucles for, une fois tous les calculs faits !!!


Alors, je sèche, je n'ai plus d'idée ?!
Quelqun à déjà eu ce genre de problème ?
J'attends votre aide !!!

MERCI ;-)

2 réponses

Avatar
AV
Très étonnant que la touche Echap n'arrête pas l'exécution !

Vérifie que en début de macro tu n'aies pas la ligne suivante :
Application.EnableCancelKey = xlDisabled

AV
Avatar
PMO
Bonjour,

Vous pouvez essayer ceci:
Pressez Ctrl+Alt+Pause (en principe ça arrète net)

Sinon par programmation (et pour le fun) voici un code qui
installe/désinstalle un bouton pour stopper la macro.
J'ai fait une boucle infinie pour tester. Je vous invite à l'essayer.

'************************************
Option Explicit
'_________________________________________
Sub BoucleInfinie()
Dim i&
Dim j&
'---- Destruction du bouton Stop ----
Call DelButton
'---- Création du bouton Stop ----
Call AddButton
'---- Ci-dessous votre traitement ----
Do While j& = 0
i& = i& + 1
'#### NECESSAIRE POUR REDONNER LA MAIN ####
DoEvents
'##########################################
[a1] = i&
Loop
End Sub
'_________________________________________
Private Sub StoppeMacro()
Application.VBE.Windows(1).SetFocus
SendKeys ("%xr")
End Sub
'_________________________________________
Private Sub AddButton()
Dim myBar As CommandBarControls
Dim myButton As CommandBarControl
Set myBar = _
Application.CommandBars("Standard").Controls
Set myButton = myBar.Add _
(Type:=msoControlButton, _
ID:)50, _
before:=myBar.Count + 1, _
temporary:=True)
With myButton
.Caption = "Stoppe la macro en cours"
.OnAction = "StoppeMacro"
.DescriptionText = "pourRetrouverCeBouton"
End With
End Sub
'_________________________________________
Private Sub DelButton()
Dim C As CommandBarControl
For Each C In _
Application.CommandBars("Standard").Controls
If C.DescriptionText = _
"pourRetrouverCeBouton" Then
C.Delete
Exit For
End If
Next C
End Sub
'*******************************

Est-ce amusant ?

Cordialement.

PMO
Patrick Morange





Voilà mon problème :

J'ai plusieurs boucles "for" imbriqué les unes derrières les autres :

For a = 1 To 1 + Nb_iteration_A * 5
For b = 1 To 1 + Nb_iteration_B * 5
For c = 1 To 1 + Nb_iteration_C * 5
For d = 1 To 1 + Nb_iteration_D * 5 etc...

somme = Cells(4, a + 2).Value * Nb_iteration_A +
Cells(4, b + 2).Value * Nb_iteration_B + Cells(4, c + 2).Value *
Nb_iteration_C + Cells(4, d + 2).Value * Nb_iteration_D etc....

Cela peut donc faire des calculs long, trés long.... J'aimerais mettre fin à
ces calculs à n'importe quel moment (quand j'en ai marre d'attendre) en
appuyant sur "ESCAPE" ou "F1" ou sur n'imprte quoi, une touche, un bouton, le
bouton RESET de ma tour....

J'ai essayer ça :
1) -> Application.OnKey "{F1}", "Arret"
mais le saut à la procédure "Arret" ne se fait qu'aprés tous les calculs
effectués.

Et ça :
2) -> On Error GoTo handleCancel
Application.EnableCancelKey = xlErrorHandler

handleCancel:
If Err = 18 Then
a = b = c = d = e = f = g = 6
MsgBox "erreur 18"
Exit Sub
End If

Mais le problème reste le même, l'erreur n'est prise en compte qu'a la
sortie des boucles for, une fois tous les calculs faits !!!


Alors, je sèche, je n'ai plus d'idée ?!
Quelqun à déjà eu ce genre de problème ?
J'attends votre aide !!!

MERCI ;-)