problème lancement et arrêt de boucle avec les boutons des userforms

J

Jéjé

Guest
Bonjour.

Je sollicite l'aide d'un super crack d'excel pour m'aider à résoudre un probème que je rencontre, et qui me met dans l'impasse.

Cela concerne le lancement et l'arrêt d'une boucle en cliquant sur les boutons d'une fenêtre "userform" :

Au clic sur un bouton "lancer", je souhaite lancer une boucle au nombre d'itérations indeterminé. Cette boucle s'arrêterra quand je le déciderai en cliquant sur un bouton "stop".


private sub lancer_click()
do while ?? ' le type de boucle en question n'a pas d'importance(?)
a=a+1 ' calcul itératif quelconque
loop
end sub

private sub stop_click()
unload userform1
end sub


Bien entendu, le code ci-dessus ne fonctionne pas. Je ne sais pas comment faire pour pouvoir lancer une boucle avec un bouton, et l'arrêter avec un autre

Aussi je cherche une bonne âme pouvant m'aider.
A tous ceux qui ont pris la peine de lire ce message, merci
A tous ceux qui me répondront, merci beaucoup.

PS : j'ai un niveau débutant, je me suis mis au vba il y a une semaine...
J'ai effectué une recherche d'item correspondant, mais n'ai pas trouvé qqchose qui concordait.
 
J

JyM

Guest
salut JéJé,
...tentons...

je ne suis pas un crack mais

je mettrais la boucle dans un module
sub FRISETTE()
do while aa<beaucoup trop
a=a+1 ' calcul itératif quelconque
loop
end sub

le bouton appelle le module
private sub lancer_click()
FRISETTE
end sub

le module doit faire la pause
sub FRISETTE()
do while aa<beaucoup trop
a=a+1 'calcul itératif quelconque
if aa mod 1000 =0 then 'toutes les 1000 boucles
userform1.show 'appelle le formulaire
end if
loop
end sub

le bouton stop stoppe
private sub stop_click()
end 'tue la macro
'unload userform1
'je crois que tu ne peux pas décharger le formulaire depuis lui-même
end sub
 
J

Jéjé

Guest
Re2: problème lancement et arrêt de boucle avec les boutons des userforms

->JyM

Merci beaucoup pour ta réponse, mais malheureusement ça ne marche pas.

Pour le userform.show, il me dit que la feuille est déjà affichée et qu'un affichage modal est impossible.

J'ai modifié comme ça :
...
userform1.hide
userform1.show
...
La boucle s'arrête bien mais ne se relance pas toute seule, il faut cliquer.

En fait, je voudrais que la boucle fasse une pause et prenne le temps de regarder l'état du bouton stop, mais qu'elle reprenne là où elle en était sans intervention de ma part.

Entre temps, j'ai pensé à une autre solution :
Je ne met pas de boucle mais un calcul simple.
Au lieu d'utiliser l'evenement "clic sur bouton", j'utilise un évenement qui soit permanent, par exemple "userform a le focus" ou qqchose comme ça...

La boucle sert en fait à régler un capteur, l'opérateur clique sur lancer et règle son capteur en lisant la valeur à l'écran. Ce réglage peut durer très longtemps, j'en sais qqchose !

Au fait, il est possible de décharger un userform depuis lui-même.

En tout cas, merci d'avoir répondu.
 
S

sousou

Guest
Bonour jéjé.

Dans ce type de besoin utilise un drapeau.
-quand tu clic sur lancer, le drapeau passe à 1
-quant tu clic sur stop, il passe à 0
-ta boucle tourne tant que le drapeau =1
ne pas oublier de déclarer la variable flag en début de procédure
sub lancer_click()
flag=1
while flag=1
tu fais tous ce que tu veux...
wend
end sub

sub stop_click()
flag=0
end sub
Cela devrait marcher.
Bonne chance
 
J

Jéjé

Guest
Re2: problème lancement et arrêt de boucle avec les boutons des userforms

->sousou

Merci d'avoir répondu !

Malheureusement, ça ne marche pas non plus...

En effet, le programme ne peut pas faire 2 choses à la fois :
-faire tourner la boucle avec le flag en condition de loop
-et surveiller les boutons pour voir lequel se fait cliqué

Le problème est que la boucle de calcul se trouve en tant que code de l'évenement lancer_click, et que la commande pour l'arrêter est le code de l'évenement stop_click. Quand la boucle de lancer_click tourne, l'évenement stop_click est ignoré, car le programme fait tourner la boucle et ne peut pas surveiller les évenement en même temps.
Le flag n'est jamais mis à zero, et la commande pour arrêter la boucle est Ctrl + Alt + Suppr ;-)

En tout cas, merci d'avoir répondu.
 
J

jmps

Guest
Salut Jéjé,

Essaye ça :

private sub lancer_click()
do while true ' boucle infinie
a=a+1 ' calcul itératif quelconque
if a mod 1000 = 0 then
doevents
end if
loop
end sub

private sub stop_click()
unload userform1
end
end sub


Ca devrait marcher.
 
J

Jéjé

Guest
-> jmps

YYYESSSSSS !!!

Merci ça marche !
Ha vraiment merci beaucoup !

Voilà la solution à mon problème qui m'empoissonne la vie !


Donc en conclusion, pour ceux qui ne savent pas encore, la fonction DoEvents permet au programme d'arrêter momentanement ce qu'il est en train de faire, pour regarder ce qui se passe du coté des boutons, et du reste...

Merci à tous ceux qui m'ont aidés
 

Discussions similaires

Statistiques des forums

Discussions
312 457
Messages
2 088 564
Membres
103 882
dernier inscrit
jregis13