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 !!!!
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous,

Ce fil sera bientôt aussi long qu'un confinement sans fin :). Serait il lui aussi les prémices d'un autre mouvement perpétuel ? Quoiqu'on puisse se demander si deux mouvements perpétuels peuvent cohabiter sans se confondre ?

Bon j'attends avec impatience le tuto promis. Il me tarde.:oops:

Concernant le problème que rencontre le demandeur, c'est plus une question de débogage que de temps d'exécution. VBE est doté d'un tas de manières plutôt bien faites pour déboguer un code.
Ne pas oublier qu'un espion peut être ajouté non seulement pour examiner une variable ,mais aussi pour faire un point d'arrêt conditionnel. Mettre un compteur dans la boucle (n = n +1 ). Rajouter l'espion n= 10000 (ou autre) avec l'option "arrêt si la valeur est vraie". On a ainsi un moyen d'arrêter le programme si l’exécution s'éternise et de regarder en pas à pas et avec d'autres espions ce qui se passe.
1586905837264.png

Ceci n'est vrai que pendant la phase de mise au point.

De toute manière, si vous devez utiliser un moyen d'interrompre la boucle car souvent elle s'éternise, c'est que la logique du code est mauvaise, une coquille s'y est glissée ou autre. Et donc, on en revient à un problème de mise au point et de débogage. Et dans cette phase, la durée d'un DoEvents ou autre a peu d'importance. C'est le défaut de logique où bien le cas improbable non envisagé mais qui se présente malgré tout de temps en temps qu'il faut rechercher.

Mais le tutorial promis n'est toujours pas là... Sniff. Nulle intention de vous obliger mais on se dépêche @jmfmarques :);)
 

jmfmarques

XLDnaute Accro
Bonjour mapomme
Mais le tutorial promis n'est toujours pas là... Sniff. Nulle intention de vous obliger mais on se dépêche
Je n'y peux rien. J'ai fait ce qu'il fallait. L'approbation ne relève pas de ma volonté.
Il y a des cas où une longue attente, un abandon éventuel, etc... ne révèlent pas forcément une erreur de conception. L'utilisateur doit alors pouvoir décider un abandon (quitte à retenter plus tard) sans que l'application sorte pour autant en deboggage.
Même certaines applications de Microsoft sont dans ce cas et laissent alors à l'utilisateur la possibilité d'un abandon.
Mais il est vrai que, n'ouvrant jamais un classeur tiers******, j'ignore totalement la raison pour laquelle est ici recherchée la possibilité d'interrompre une boucle.
****** on notera que j'évite, dans le même esprit, de conduire à l'ouverture d'un classeur qui serait le mien (cf le tuto)
Amitiés
A dranreb :
Et je trouve qu'un centaine de microsecondes ou si tu préfère 1/10000 seconde c'est très raisonnable pour cette tâche système. Ce n'est guère pénalisant.
Je crois assez volontiers que le tuto concerné saura mettre en exergue la pénalisation mise en cause. :)
Amitiés
 
Dernière édition:

Pounet95

XLDnaute Occasionnel
Bonjour tout le monde,
Le problème pour lequel je demande un remède s'est produit aux moments où j'étais en mode debug pas à pas mais soit un appui sur la touche "lecture" au lieu de "arrêt" soit un F5 mal à propos et c'est parti !
Pour prémisses ou prémices, les définitions sont proches ! Mais qu'importe, j'ai eu les réponses voulues et même plus.
Bonne journée à tous
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Pounet95,
Pour prémisses ou prémices, les définitions sont proches !
Tu as compris que c'était une taquinerie de ma part ;). Je ne suis pas un donneur de leçon.

Mais as tu réussi à trouver là où ça coince ?

Souvenirs, souvenirs. Il y a une fois un truc idiot qui m'a fait passer des heures dans la recherche d'un fonctionnement qui aboutissait non pas à une exécution anormale mais à des résultats étranges. Notamment, une confusion entre le l (chiffre) et 1 (lettre) qui s'écrivent pareil en Courrier New (la police dans mon éditeur macro). Maintenant le l est banni de mon code.
 

Pounet95

XLDnaute Occasionnel
Bonjour (re) Mapomme
Oui tout à fait pour la taquinerie ! Quand j'ai un doute, je vais voir wikipedia and co
Et moi aussi, entre i et I et 1 j'ai aussi parfois le problème. Il faut que je mette le nez dans l'écran pour différencier. Et sur la vue , des lunettes neuves sont en commande et livrées chez l'opticien mais cause "connadvirus" il est fermé !

Oui j'ai vu où ça coinçait. Un test réussi : comparaison de 2 valeurs et inversion si condition vraie !
 
Dernière édition:

Pounet95

XLDnaute Occasionnel
Bonsoir,
close-je ou ne point close-je ce fil ? Cà me gêne de marquer un fil plus qu'un autre comme étant LA solution !
Est-ce possible d'en mettre sur plusieurs fils ?

En attendant, Desproges cite bien " l'éternité ....." mais ça serait attribué à Woody Allen qui l'aurait lui-même piqué à Kafka .
Merci wikipedia
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
De toute manière, si vous devez utiliser un moyen d'interrompre la boucle car souvent elle s'éternise, c'est que la logique du code est mauvaise, une coquille s'y est glissée ou autre.
Dans le cadre des tirages réalisés par le ListeAléat.xlsm joint au #17, ce n'est pas ça. Ce sont des processus logiquement architecturés de façon à examiner dans plusieurs jeux tous les ordres possibles d'une série de numéros, jeux initialement en ordre aléaloire. C'est viable quand même en pratique, bien que l'énormissime durée nécessaire pour réellement tout envisager est en fonction factorielle du nombre de placements de numéros à effectuer, parce qu'en général beaucoup d'ordres possibles respectent les contraintes imposées. Mais il peut arriver qu'un seul choix regrettable quelque part empêche de finaliser le reste. La durée nécessaire est donc une fonction factorielle du rang du numéro qui fait par hasard coincer tout le reste, parce qu'il doit chaque fois envisager toutes les possibilités de ce reste avant de pouvoir changer ce numéro. Mais s'il y a relativement peu de contraintes ça se joue souvent sur l'ordre d'une demi douzaine des derniers numéros restant à placer, alors ça va.
 
Dernière édition:

Pounet95

XLDnaute Occasionnel
Bonjour tout le monde,
Je suis très loin d'être un pro du VBA et/ou d'Excel et j'avoue que certaines explications me laissent perplexes car je ne comprends pas tout. Bon ce n'est pas gênant puisque ma pratique tient du loisir.
Mais je suis curieux et j'aime bien revenir sur ces choses non comprises du 1er coup.

Par exemple je me suis mis à essayer de comprendre le code du fichier de Dranreb.
J'y ai compris pas mal de choses bien que la syntaxe et l'indentation du code soient différents de ma façon d'écrire. Par exemple, je ne mets que très rarement if else endif sur une seule ligne, pour une question de lisibilité, du moins pour moi.
Je ne désespère pas d'y trouver la méthode ( et le code ) pour empêcher que 2 joueurs d'un même club se rencontrent, du moins au 1er tour que ce soit en mode élimination directe ou poules.
Je vois bien le tableau TClub() mais je ne comprends pas où il est initialisé par l'utilisateur , soit un range 2 colonnes : joueur,club , soit un tableau équivalent joueur,club ?
Je ne m'intéresse qu'au 1 contre 1
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Le dispositif n'est pas utilisé dans le classeur de démo. TClub est initialisé à partir d'un paramètre facultatif RClubs à transmettre à la procédure de tirage lors de son appel. S'il est spécifié, il est utilisé en initialisant à True les DéjàRenc(X) où X est l'indice linéaire calculé par XTria(J, A) des 2 n° de joueur dans la tableau triangulaire ainsi simulé. Il s'en suit que 2 joueurs ayant un même TClub spécifié non vide ne pourront jamais être opposés car ils seront toujours vus comme s'étant déjà rencontrés lors d'une manche précédente, même à la 1ère.
 
Dernière édition:

Pounet95

XLDnaute Occasionnel
Bonjour Dranreb
Si je comprends bien, pour passer le paramètre optionnel RClubs, j'ai le choix entre :
- un objet Range nommé JoueurClub par exemple ou
- un tableau JoueurClub(nbJ, numClub).
J'ai fait avec un Range et ça marche

Merci beaucoup
Claude alias Pounet95

PS : je vois que tu a posté sur la conversation que nous avons entamé avec Calou. C'est très sympa


VB:
Private Sub BtnTirage_Click()
   Dim MMax As Long, LMax As Long, TRésult(), L As Long, M As Long, C As Long, J As Long, LR As Long, CR As Long
  
    Rem. ——— Exécute le tirage en indiquant s'il a réussi et si le tableau Tirage est donc garni.
    If VarType(Me.[MMax].Value) <> vbDouble Then Me.[MMax].Formula = "=JMax+MOD(JMax,2)-1"
    
    If Tirage1vs1OK(NbJrs:=Me.[JMax].Value, Manches:=Me.[MMax].Value, RClubs:=Me.[JoueurClub]) Then
....... etc
 

Statistiques des forums

Discussions
312 465
Messages
2 088 659
Membres
103 910
dernier inscrit
amor57