XL 2016 Boucle interminable ( prémisses au mouvement perpétuel ? )

Pounet95

XLDnaute Occasionnel
Bonjour,
J'espère que vous aurez, malgré les contraintes, passé un bon WE Pascal.
Je sais depuis hier soir 20h et des broquilles que je vais encore avoir du temps avant de mettre un bout d'orteil dehors, mais plutôt que d'attendre la fin du phénomène, je préférerais que vous me donniez l'astuce, si elle existe, pour stopper l'exécution d'une macro qui est partie "en vrille" suite à un mauvais code et/ou lancée par erreur à la place d'un pas à pas.
Pour le moment, j'en suis ) Ctrl + Alt +Supp qui me permet d'accéder au Gestionnaire des tâches et donc d'arrêter la session Excel en cours.
y aurait-il moins brutal ?
Merci de me dire

Oups : j'ai oublié de préciser que Ctrl C, Ctrl Q, Ctrl Pause restent inactifs
Quant à la recherche avec la liste à droite, bof !!!!
 

Staple1600

XLDnaute Barbatruc
Bonjour le fil

Moi j'ai une solution radicale...;)

1)Eviter les boucles autant que faire se peut
2)Eviter les macros
3) Privilégier l'usage classique d'Excel, exprimer pleinement sa nature de tableur avec ses seules fonctions natives
4) Ne respecter aucun des 3 points précédents , parce que, confinés jusqu'au 11 mai, on va pouvoir over-boucler à donf et dénaturer Excel à loisir
5)Bonne journée à tous, mon café vient de finir de se faire
;)
 

Dranreb

XLDnaute Barbatruc
Bonjour.
À l'examen de vos autres discussions, j'y ai trouvé des indices qui me donnent à penser que le classeur que je joins pourrait vous intéresser.
Il est en effet bourré de procédures récursives qu'il faut pouvoir arrêter à tout moment, la durée d'exécution de l'ensemble étant imprévisible, avec une très forte probabilité de n'avoir besoin que de quelques millisecondes, et une très faible de nécessiter pour aller jusqu'au bout seulement quelques microsecondes ou au contraire plusieurs semaines …
La solution est un UFmVisu affichant une barre d'activité à 4 régions de couleurs, conçu pour avertir l'environnement qui y fait appel qu'une demande d'abandon s'est exprimée par sa fermeture par la croix.
 

Pièces jointes

  • ListeAléat.xlsm
    347.3 KB · Affichages: 14
Dernière édition:

eriiic

XLDnaute Barbatruc
Bonjour,

tu peux mettre un checkbox sur une feuille et parsemer dans tes boucles :
VB:
        DoEvents
        If Feuil1.CheckBox1 Then Stop
si tu n'as pas oublié la fautive tu t'arrêteras dessus en cochant ta checkbox.
Plus qu'à voir le pourquoi et mettre une condition supplémentaire de sortie.
En tenant compte du fait que ça peut être une supérieure si plusieurs imbriquées, voir aussi la pile des appels (Ctrl+L)
Ca t'évitera au moins le Ctrl+Alt+Supp le temps de trouver
eric
 

Pounet95

XLDnaute Occasionnel
Bonjour Staple1600, DranreB,eriiiic ( rien qu'à saisir vos pseudos, ça prend un temps !!!! )
Avec tout ça, je vais pouvoir occuper mon temps de confinement étant classé dans les "vieux" et "fragiles" et "à risques" .....
Bernard : bien vu pour les autres discussions ( tournoi pétanque ?). C'est effectivement en essayant de répondre aux critères du demandeur ( Calou ) que j'ai ce genre de désagrément. Je pense que je l'ai réglé , surtout le critère "pas de rencontre entre équipes du même club".
Ayant fait tourner ton appli, je vois là une solution ultra rapide pour y parvenir. Il faut par contre que je parcoure le code pour voir où paramétrer cette option.

En tout cas, merci à tout le monde pour vos suggestions, commentaires et tout et tout
 

jmfmarques

XLDnaute Accro
Salut eriiiic
C'est sous une autre forme (une checkbox au lieu d'un bouton de commande) en effet la solution (proposée en mon message 10).
Nous verrons par contre bientôt (le tuto promis plus haut) son caractère très chronophage et comment y remédier de manière significative.
Amitiés
 

Dranreb

XLDnaute Barbatruc
Mon UFmVisu vole très peu de temps CPU au processus qui y fait appel dans la mesure où il ne rectifie son affichage que toute les 40 millisecondes.
C'est d'ailleurs pour ça que la barre d'activité a 4 zones de couleurs, alors que le procéssus ne lui indique qu'un stade d'avancement instantané, qui est en même temps une profondeur de récursion. Chaque coté de ce stade au moment de l'appel est en effet divisé par les stades mini et maxi annoncés au cours des 40 dernières millisecondes.
 

jmfmarques

XLDnaute Accro
Bonjour Dranreb
Comme tu le sais (ou peut-être pas) je n'ouvre jamais un classeur tiers et ignore donc ce que ton mécanisme met en place.
Juste 3 questions :
question 1 : ce mécanisme nécessite-t-il un ou plusieurs compteurs additionnels ?
question 2 : ce mécanisme utilise-t-il un/des Doevents ?
question 3 : ce mécanisme nécessite-t-il l'utilisation d'un timer (ou équivalent) ajouté ?
(ce n'est pas l'explication du mécanisme, qui m'éclairerait sur son caractère éventuellement chronophage, mais la seule réponse à chacune de ces 3 questions)
 

eriiic

XLDnaute Barbatruc
Salut eriiiic
C'est sous une autre forme (une checkbox au lieu d'un bouton de commande) en effet la solution (proposée en mon message 10).
Ah oui, en effet, j'ai lu trop en diagonale :) Désolé
Quant au coté chronophage il sera toujours gagnant contre un départ pour l'éternité. C'est long l'éternité, surtout vers la fin (Desproges je crois) ;)

La description de Dranreb parait intéressante. Dès que j'ai un moment j'y jetterai un oeil.
 

Dranreb

XLDnaute Barbatruc
1) — Non, à moins qu'on puisse considérer comme tel l'empoi de QueryPerformanceCounter
2) — Oui, juste pour permettre la détection de UserForm_QueryClose et ce seulement toutes les 40 ms.
3) — Même réponse qu'à la 1ère question.
Dans l'immense majorité des cas la méthode UFmVisu.Montre S rend aussitôt la main après avoir exécuté seulement 4 instructions très élémentaires.
 

jmfmarques

XLDnaute Accro
La réponse à la question 2 m'éclaire suffisamment.
Les Doevents sont très chronophages en leur état brut d'utilisation.
Tu en réduis le nombre d'utilisation (toutes les 40 ms) , mais à un autre coût additionnel.
Mon petit doigt me dit que tu vas être intéressé par le petit tuto que je pense être en mesure de déposer ce soir. :)
 

jmfmarques

XLDnaute Accro
et c'est n'importe quoi de dire que DoEvents est chronophage.
J'adore les assertions et assurances de l'espèce.
Ma manière d'y répondre sans autre commentaire, donc :
deux toutes petites comparaisons --->>
1)
VB:
Dim deb As Double
deb = Timer
 For k = 1 To 500000
    toto = k / 2
 Next
 MsgBox Timer - deb
Code:
2) apprécions le coût des doevents, maintenant --->>
Dim deb As Double
deb = Timer
 For k = 1 To 500000
  toto = k / 2
  DoEvents '------>> on va avoir l'occasion d'apprécier le "n'importe quoi" ...
 Next
 MsgBox Timer - deb

Sur ce : bon appétit ;)
 

Membres actuellement en ligne

Statistiques des forums

Discussions
312 472
Messages
2 088 709
Membres
103 928
dernier inscrit
MIKETUAU