En fait, je lance le calcul par l'intermédiaire d'un bouton (qui lance un
procédure) sur une UserForm.
Le problème est que je n'arrive plus à avoir la main après le lancement du
calcul...
Comment faut-il faire pour reprendre la main ?
Quelle est celle de vos méthodes qui convient le mieux ?
---------------------------------
Il s'agit d'arrêter un long calcul itératif en appuyant sur une touche (par
ex ESC)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Pascal Engelmajer
Salut, on ne sait toujours rien sur l'essentiel : dans quel contrôle de structure est le calcul ? do...loop, while...wend, for...next ? dans un userform les trois méthodes sont possibles 1= méthode Micheldenis============================= un bouton (btnStop) "Cesser le calcul" dans l'userform qui commute un drapeau (flFin) déclaré public dans un module. standard Pour stopper le calcul il faut cliquer sur le bouton... Option Explicit Public flFin as Boolean
dans le module de code de l'userform Private Sub btnStop_Click() flFin=True End Sub
dans la procédure de calcul (où quelle soit) Sub boucle1() 'début du calcul For i = 1 To 1000 'simule un calcul infini DoEvents 'indispensable If flFin Then 'teste l'état du drapeau flFin flFin úlse 'réinitialise flFin MsgBox "Fin provoquée par l'utilisateur", vbCritical, "Calcul" Exit Sub 'teste l'état du drapeau flFin end if On Error GoTo fin i = 100 Next i 'fin du calcul End sub '2 === avec appel à GetKeyState Lib "user32" ======================== Pour stopper le calcul il faut maintenir la touche ESC dans un module standard Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Const VK_ESCAPE = 27 'echap.
dans la procédure de calcul (où quelle soit) Sub boucle2() Application.EnableCancelKey = xlDisabled ' empêche le passage en mode debug 'début du calcul For i = 1 To 1000 'simule un calcul infini i = 100 DoEvents If GetKeyState(VK_ESCAPE) = -127 Then MsgBox "Fin provoquée par l'utilisateur", vbCritical, "Calcul" Application.EnableCancelKey = xlInterrupt 'réinitialise le mode debug Exit Sub End If Next i
'fin du calcul Application.EnableCancelKey = xlInterrupt 'réinitialise le mode debug End Sub
3 === en utilisant Application.EnableCancelKey = xlErrorHandler ============= Pour stopper le calcul il faut combiner CTRL + BREAK. Sub boucle3() 'début du calcul Application.EnableCancelKey = xlErrorHandler 'passe en mode récupération de l'erreur For i = 1 To 1000 'simule un calcul infini DoEvents On Error GoTo fin i = 100 Next i On Error GoTo 0 Application.EnableCancelKey = xlInterrupt 'réinitialise le mode debug 'fin du calcul Exit Sub fin: If Err.Number = 18 Then MsgBox "Fin provoquée par l'utilisateur", vbCritical, "Calcul" Else MsgBox "Erreur " & Err.Description, vbCritical, "Calcul" End If Application.EnableCancelKey = xlInterrupt End Sub sous réserve d'autres moyens... -- Amicalement. Pascal "il n'y a pas de vent favorable pour celui qui ne sait pas ou il va." Sénèque. http://www.ilyapa.net/excel http://www.ilyapa.net/baseExcel "Alfred" a écrit dans le message de news:
Bonjour,
Je vous remercie pour toutes ces réponses.
En fait, je lance le calcul par l'intermédiaire d'un bouton (qui lance un procédure) sur une UserForm. Le problème est que je n'arrive plus à avoir la main après le lancement du calcul... Comment faut-il faire pour reprendre la main ? Quelle est celle de vos méthodes qui convient le mieux ?
--------------------------------- Il s'agit d'arrêter un long calcul itératif en appuyant sur une touche (par
ex ESC)
Merci pour votre aide Al
Salut,
on ne sait toujours rien sur l'essentiel : dans quel contrôle de structure
est le calcul ?
do...loop, while...wend, for...next ?
dans un userform les trois méthodes sont possibles
1= méthode Micheldenis============================= un bouton (btnStop) "Cesser le calcul" dans l'userform qui commute un
drapeau (flFin) déclaré public dans un module.
standard
Pour stopper le calcul il faut cliquer sur le bouton...
Option Explicit
Public flFin as Boolean
dans le module de code de l'userform
Private Sub btnStop_Click()
flFin=True
End Sub
dans la procédure de calcul (où quelle soit)
Sub boucle1()
'début du calcul
For i = 1 To 1000 'simule un calcul infini
DoEvents 'indispensable
If flFin Then 'teste l'état du drapeau flFin
flFin úlse 'réinitialise flFin
MsgBox "Fin provoquée par l'utilisateur", vbCritical,
"Calcul"
Exit Sub 'teste l'état du drapeau flFin
end if
On Error GoTo fin
i = 100
Next i
'fin du calcul
End sub
'2 === avec appel à GetKeyState Lib "user32" ======================== Pour stopper le calcul il faut maintenir la touche ESC
dans un module standard
Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long)
As Integer
Const VK_ESCAPE = 27 'echap.
dans la procédure de calcul (où quelle soit)
Sub boucle2()
Application.EnableCancelKey = xlDisabled ' empêche le passage en mode
debug
'début du calcul
For i = 1 To 1000 'simule un calcul infini
i = 100
DoEvents
If GetKeyState(VK_ESCAPE) = -127 Then
MsgBox "Fin provoquée par l'utilisateur", vbCritical, "Calcul"
Application.EnableCancelKey = xlInterrupt 'réinitialise le mode
debug
Exit Sub
End If
Next i
'fin du calcul
Application.EnableCancelKey = xlInterrupt 'réinitialise le mode debug
End Sub
3 === en utilisant Application.EnableCancelKey = xlErrorHandler
============= Pour stopper le calcul il faut combiner CTRL + BREAK.
Sub boucle3()
'début du calcul
Application.EnableCancelKey = xlErrorHandler 'passe en mode récupération
de l'erreur
For i = 1 To 1000 'simule un calcul infini
DoEvents
On Error GoTo fin
i = 100
Next i
On Error GoTo 0
Application.EnableCancelKey = xlInterrupt 'réinitialise le mode debug
'fin du calcul
Exit Sub
fin:
If Err.Number = 18 Then
MsgBox "Fin provoquée par l'utilisateur", vbCritical, "Calcul"
Else
MsgBox "Erreur " & Err.Description, vbCritical, "Calcul"
End If
Application.EnableCancelKey = xlInterrupt
End Sub
sous réserve d'autres moyens...
--
Amicalement.
Pascal
"il n'y a pas de vent favorable pour celui qui ne sait pas ou il va."
Sénèque.
http://www.ilyapa.net/excel
http://www.ilyapa.net/baseExcel
"Alfred" <Alfred@savoie.fr> a écrit dans le message de news:
eeVWcyjPEHA.620@TK2MSFTNGP10.phx.gbl...
Bonjour,
Je vous remercie pour toutes ces réponses.
En fait, je lance le calcul par l'intermédiaire d'un bouton (qui lance un
procédure) sur une UserForm.
Le problème est que je n'arrive plus à avoir la main après le lancement du
calcul...
Comment faut-il faire pour reprendre la main ?
Quelle est celle de vos méthodes qui convient le mieux ?
---------------------------------
Il s'agit d'arrêter un long calcul itératif en appuyant sur une touche
(par
Salut, on ne sait toujours rien sur l'essentiel : dans quel contrôle de structure est le calcul ? do...loop, while...wend, for...next ? dans un userform les trois méthodes sont possibles 1= méthode Micheldenis============================= un bouton (btnStop) "Cesser le calcul" dans l'userform qui commute un drapeau (flFin) déclaré public dans un module. standard Pour stopper le calcul il faut cliquer sur le bouton... Option Explicit Public flFin as Boolean
dans le module de code de l'userform Private Sub btnStop_Click() flFin=True End Sub
dans la procédure de calcul (où quelle soit) Sub boucle1() 'début du calcul For i = 1 To 1000 'simule un calcul infini DoEvents 'indispensable If flFin Then 'teste l'état du drapeau flFin flFin úlse 'réinitialise flFin MsgBox "Fin provoquée par l'utilisateur", vbCritical, "Calcul" Exit Sub 'teste l'état du drapeau flFin end if On Error GoTo fin i = 100 Next i 'fin du calcul End sub '2 === avec appel à GetKeyState Lib "user32" ======================== Pour stopper le calcul il faut maintenir la touche ESC dans un module standard Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Const VK_ESCAPE = 27 'echap.
dans la procédure de calcul (où quelle soit) Sub boucle2() Application.EnableCancelKey = xlDisabled ' empêche le passage en mode debug 'début du calcul For i = 1 To 1000 'simule un calcul infini i = 100 DoEvents If GetKeyState(VK_ESCAPE) = -127 Then MsgBox "Fin provoquée par l'utilisateur", vbCritical, "Calcul" Application.EnableCancelKey = xlInterrupt 'réinitialise le mode debug Exit Sub End If Next i
'fin du calcul Application.EnableCancelKey = xlInterrupt 'réinitialise le mode debug End Sub
3 === en utilisant Application.EnableCancelKey = xlErrorHandler ============= Pour stopper le calcul il faut combiner CTRL + BREAK. Sub boucle3() 'début du calcul Application.EnableCancelKey = xlErrorHandler 'passe en mode récupération de l'erreur For i = 1 To 1000 'simule un calcul infini DoEvents On Error GoTo fin i = 100 Next i On Error GoTo 0 Application.EnableCancelKey = xlInterrupt 'réinitialise le mode debug 'fin du calcul Exit Sub fin: If Err.Number = 18 Then MsgBox "Fin provoquée par l'utilisateur", vbCritical, "Calcul" Else MsgBox "Erreur " & Err.Description, vbCritical, "Calcul" End If Application.EnableCancelKey = xlInterrupt End Sub sous réserve d'autres moyens... -- Amicalement. Pascal "il n'y a pas de vent favorable pour celui qui ne sait pas ou il va." Sénèque. http://www.ilyapa.net/excel http://www.ilyapa.net/baseExcel "Alfred" a écrit dans le message de news:
Bonjour,
Je vous remercie pour toutes ces réponses.
En fait, je lance le calcul par l'intermédiaire d'un bouton (qui lance un procédure) sur une UserForm. Le problème est que je n'arrive plus à avoir la main après le lancement du calcul... Comment faut-il faire pour reprendre la main ? Quelle est celle de vos méthodes qui convient le mieux ?
--------------------------------- Il s'agit d'arrêter un long calcul itératif en appuyant sur une touche (par