VBA : Macro qui part en vrille

Bonjour,

Je me casse la tête depuis un certain temps afin de tenter de comprendre ce qui ne joue pas dans mon code, mais à chaque fois que je pense avoir trouvé, ça coince autre part.

J’ai essayé de mettre 36 points d’arrêt à chaque étape importante, mais j’ai l’impression que ça part en vrille (la macro tourne sans fin et je suis obligé de fermer Excel pour pouvoir continuer) une fois ici, une fois là !

Par exemple, si je mets plusieurs points d’arrêt un peu partout, dont un sur la ligne 566, et que je continue au pas à pas lorsque ça passe à cet endroit, ça part en vrille lorsque j’arrive aux lignes en dessous Range("XX").Insert Shift:=xlDown.

Mais si je mets des points d’arrêt à toutes les instructions Range("XX").Insert Shift:=xlDown, à la ligne 566 et suivantes, ça part en vrille ailleurs !!

Avez-vous une idée du problème qu’à ce code ?

Afin d’effectuer un essai, il suffit de cliquer sur le bouton ‘’Go’’ sur la feuille provisoire.

Amicalement.

Bonjour,

Je m’arrache toujours les cheveux avec mon fichier.

Pour cette version 7, j’ai encore tenté quelque chose de plus et ça bloque bizarrement à un endroit totalement incompréhensible.

Je m’explique :

Par rapport à une version qui ne bloquait pas mais dont les résultats n’étaient pas satisfaisants - telle que la version 3 également jointe - j’ai ajouté les lignes 525 à 535 et 569 à 589 de la macro du présent fichier. Mais alors, pour cette version 7, ça bloque sur la ligne 73 lors du deuxième, troisième ou quatrième tour (quand k = 2, 3 ou 4).

En plaçant un point d’arrêt sur les lignes 73 et 74, je m’aperçois effectivement que c’est à cet endroit que ça coince alors que ce passage passait sans problème auparavant ! En passant avec la touche F8 de la ligne 73 à la ligne 74, ma macro part en vrille et je suis obligé de fermer Excel par le gestionnaire des tâches.

Pour ceux qui tenteraient de m’aider, voici une explication plus détaillée :

L’idée est de former des équipes de pétanque – si possible de 3 joueurs, provenant de 6 villes – mais jamais deux joueurs de la même ville ensemble. Et ceci sur 4 tours consécutifs, en n’ayant jamais deux joueurs qui jouent plus d’une fois ensemble.

Pour faire un essai, il suffit d’aller sur la feuille ‘’Provisoire’’ et de cliquer sur ‘’Go’’. Ma macro mouline chez moi pendant 1 à 2 minutes.

Je travaille principalement sur la feuille ‘’Provisoire’’. A chacun des 4 tours (For k = 1 to 4), les joueurs sont déplacés de la feuille ‘’Inscriptions’’ sur la feuille ‘’Provisoire’’, dans les colonnes A à F.

Etape 1

En premier lieu on forme autant de doublettes (équipes de 2 joueurs seulement) qu’il faut afin d’arriver à un nombre de joueurs restant qui soit un multiple de 6. Ca se passe dans ma macro de la ligne 60 à la ligne 323. Comme le nombre de joueurs à disposition est à chaque fois suffisant, il ne semble pas que cette partie fasse problème. A la ligne 235, un contrôle que les équipes prises au hasard ne soient pas composées de joueurs ayant déjà joué ensemble montre que ça fonctionne bien. Ces joueurs pris au hasard sont reportés dans les colonnes H à M.

Etape 2

Il reste un nombre de joueurs multiple de 6, mais avec un nombre inégal entre les villes. De la ligne 327 à la ligne 435, je forme donc des triplettes en fonction des villes avec le plus de joueurs, mais toujours sans avoir deux joueurs de la même ville dans la même équipe. Là également, le nombre de joueurs à disposition est encore assez grand et il est assez facile de former ces équipes. Un contrôle à la ligne 408 tente de le prouver.

Etape 3

A ce moment, il reste dans les colonnes A à F de la feuille ‘’Provisoire‘’ un nombre de joueurs identiques pour toutes les villes. Dans un premier temps, je mélange les colonnes afin de former – par ligne, de la ligne 2 de la feuille à la ligne xx – des équipes de 2 x 3 joueurs de chacune des 6 villes et je contrôle si des joueurs ont déjà joué ensemble (de la ligne 439 à 537). Si le contrôle à la ligne 537 de la macro n’est pas satisfaisant, je déplace les joueurs dans les lignes de la feuille (par les lignes 558 à 586 du code) de manière à former de nouvelles combinaisons.

Bonnes salutations.

Bonjour,

Complexe !!

Le premier tour fonctionne sans soucis (k=1), quoique il a fallu que je mettre un exit sub avant next k

Une chose qui peut être dangereuse c'est cette boucle qui est a priori sans fin :

If Sheets("Relevés").Range("G1") <> Sheets("Provisoire").Range("N7") And Compteur <> Sheets("Provisoire").Range("N3") - 1 Then
    Compteur = Compteur + 1
    GoTo Tout_recommencer
End If

Je poursuis mais c'est un vrai casse-tête !

C'est franchement "riche" en code ... donc pour le moment je me focalise plus sur la syntaxe au sens large

Est-ce que ceci permet bien de trier les colonnes A à F et pas seulement P & Q ??

    'Tri aléatoire des 6 colonnes A à F (par l'intermédiaire de la colonne P)
    For i = 1 To 6
        Ligne_Dernier_joueur = Cells(Rows.Count, i).End(xlUp).Row
        Range(Cells(2, i), Cells(Ligne_Dernier_joueur, i)).Cut Range("P2")
        For j = 2 To Ligne_Dernier_joueur
            Cells(j, 17) = Rnd
        Next j
        Range("P2:Q" & Ligne_Dernier_joueur).Sort Key1:=Range("Q2"), Order1:=xlAscending, Header:=xlNo
        Range("P2:P" & Ligne_Dernier_joueur).Cut Cells(2, i)
        Range("P2:Q" & Rows.Count).ClearContents
    Next i

Salut Steelston,

Merci infiniment de t’intéresser à mon problème

J’avais commencé à préparer une réponse à ta première intervention au moment où je reçois ta deuxième série de questions.

Comme je dois m’absenter un moment, je reviens avec mes réponses après 18 heures.

Amicalement.

Alors voilà mes explications :

La boucle For k = 1 to 4/Next permet d’effectuer les tirages des 4 tours souhaités et dont les tirages sont reportés sur les feuilles ‘’Tour 1’’ à ‘’Tour 4’’. Je pense donc que c’est une erreur de placer un Exit Sub avant le retour sur k = 2, k = 3 et k = 4.

Cependant, j’avais prévu que si le résultat pour ces 4 tours n’était pas celui souhaité, on pourrait refaire autant de fois qu’on le désire ces 4 tours complets. Le nombre de fois qu’on essaie un ‘’jeu’’ de 4 tours est déterminé dans la cellule N3 de la feuille ‘’Provisoire’’. Et comme à la ligne 679 de la macro, on contrôle s’il faut retirer les 4 tours ou non, mon compteur ne tourne pas à l’infini. La ligne 679 = If Sheets("Relevés").Range("G1") <> Sheets("Provisoire").Range("N7") And Compteur <> Sheets("Provisoire").Range("N3") - 1 Then.

Cette ligne est d’ailleurs placée après la boucle For k = 1 to 4/Next. Tel que présenté, mon fichier n'effectue d'un seul essai de 4 tours.

Concernant la question de ton deuxième message sur cette boucle For i = 1 to 6/ Next : Je prends les joueurs de la colonne A (ceux de la première ville), je les déplace dans la colonne P, je place des nombres aléatoires dans la colonne Q (17) je trie aléatoirement ces deux colonnes puis je remets les joueurs en place dans la colonne A. Je fais de même avec les joueurs de la deuxième ville (i = 2, colonne B), toujours par l’intermédiaire des colonnes P et Q, puis la troisième ville, etc. Les joueurs de chaque ville sont donc triés aléatoirement mais chaque ville individuellement. C’est peut-être un peu exagéré, mais c’est pour augmenter le hasard de mes tirages.

Encore un grand merci de t’être penché sur mon problème.

La boucle For k = 1 to 4/Next permet d’effectuer les tirages des 4 tours souhaités et dont les tirages sont reportés sur les feuilles ‘’Tour 1’’ à ‘’Tour 4’’. Je pense donc que c’est une erreur de placer un Exit Sub avant le retour sur k = 2, k = 3 et k = 4.

Bien sûr, c'était juste pour faire tourner a minima un tirage sans erreur. Mais cela coince déjà sur le second (k=2). Pour l'instant je n'ai pas (encore) trouvé.

Ah, d'accord. Lorsque je veux voir jusqu'où une macro tourne sans erreur, j'ai l'habitude d'utiliser le point d'arrêt, raison pour laquelle je n'avais pas saisi ta manière de faire avec l'instruction Exit Sub Ceci d'autant plus que nous avions eu cette discussion sur la boucle qui tournais éventuellement sans fin.

Je me permets de répéter que si on place des points d'arrêt aux lignes 73 et 74, puis qu'on avance au pas-à-pas de puis lors, lors du deuxième tour (k = alors 2), on voit que c'est après avoir lancé l'instruction de la ligne 73 que ça part en vrille (la ligne 74 n'étant jamais atteinte). A noter qu'au premier tour, comme il n'y a pas encore de joueurs à mettre de côté, ça ne passe pas par ces instructions. Mais à noter encore que ces mêmes instructions, dans la Version_3, ne créent jamais de problème, à aucun des 4 tours.

Bien à toi.

ok

je regarde

mais comment accède-t-on au n° de ligne ?

bon je vais copier dans notepad++, mais est-ce que cela comprend aussi la macro du dessus ?

Là je suis sur un PC germanophone, mais tu vois par exemple que j'ai placé mon curseur à la ligne 272, colonne 7 (Z pour Zeile ou Ligne, S pour Spalte ou Colonne).

En utilisant les flèches vers le haut ou vers le bas de ton clavier, tu te déplaces assez rapidement dans la macro.

2019 06 17 13 54 42

En terme de syntaxe, ceci m'a en effet troublé !!

    m = 0
    With Sheets("Relevés")
        For i = 2 To .Range("B" & Rows.Count).End(xlUp).Row
            For j = 1 To 6
                On Error Resume Next
                m = Application.WorksheetFunction.Match(.Range("B" & i), Cells(1, j).EntireColumn, 0)
                If m > 0 Then
                    Cells(m, j).Cut Cells(Cells(Rows.Count, j + 26).End(xlUp).Row + 1, j + 26)
                    Cells(m, j).Delete Shift:=xlUp
                    GoTo Joueur_suivant
                End If
            Next j

Joueur_suivant:
            m = 0

        Next i

Je ne pensais pas qu'on pouvait sortir d'une boucle par un GoTo ... pour ma part j'utilise dans ce cas un exit for

Je vais tester.

J'ai ajouté des sorties intermédiaires et fais un exit sub avant plantage, mais je ne sais pas interprêter les résultats sur les différentes feuilles.

Et puis ensuite, cela ne plante pas toujours pour les mêmes valeurs de j (mais toujours quand k=2 -parce qu'avec k=1 il ne se passe rien-, et i=2)

Je pense que là je suis au taquet !

capture d ecran 762

Salut Steelson,

Merci pour ton aide et tes commentaires.

Effectivement que de sortir d’une boucle For/Next avec un GoTo n’est peut-être pas très orthodoxe

Mais là ne semble pas être le problème. Dans la version 8 ci-jointe, j’ai remplacé comme toi – à la ligne 74, le GoTo Joueur_suivant par Exit For, mais ça part toujours en vrille au passage de la ligne 73 à la ligne 74.

Il est normal que ça ne crée jamais problème au premier tour (k = 1) car il n’y a alors pas de joueurs ayant déjà joué en doublette au ‘’Tour 0’’ et il est normal que la variable j n’ait pas toujours la même valeur, car juste avant de passer par les lignes 73 et 74, le joueur à traiter est recherché dans les colonnes A, B, C, D, E ou F, soit j = 1, 2, 3, 4, 5 ou 6.

Amicalement.

Bonjour,

Selon des conseils de Dan en privé, j'ai tenté de saucissonner mon code et de remettre à zéro les variables lorsque je n'en ai plus besoin.

Dans le nouveau fichier ci-joint, j'ai donc un Module-Base avec une Sub Tirages() depuis lequel des macros sont appelées dans d'autres modules.

Mais le fonctionnement de mon travail est absolument identique à la version 8 et – OH, HORREUR – ça part en vrille exactement au même endroit que précédemment.

Les lignes 22 et 23 de la nouvelle macro Sub Formation_des_doublettes() dans le Module_Doublettes sont exactement les mêmes que celles aux lignes 73 et 74 mentionnées dans mon précédent message. Donc, si je place un point d'arrêt sur la ligne 22 mentionnées ci-dessus et que je tape F8 lorsque le code s'arrête-là, ça part en vrille (on est alors au deuxième tour, k = 2)

Je répète que les mêmes instructions dans la version 3 - fournie sur mon fil le 16 juin – aux lignes 68 et 69 de la Sub Tirages(), ne créent pas ce problème.

Quelqu'un a encore une idée ?

RAPPEL AU SUJET DU FONCTIONNEMENT DE MON FICHIER :

Je lance la macro par le bouton ''Go'' en N1 de la feuille provisoire. Ca devrait effectuer 4 boucles dans la Sub Tirages() (For k = 1 To 4), afin d'effectuer 4 tirages des mêmes joueurs pour 4 matchs successifs.

Mais ma macro qui allait au bout des 4 matchs avec la version 3 – mais avec des résultats peu satisfaisants – bloque à un endroit inexplicable avec les versions 4 et suivantes.

Merci pour votre attention.

Bonjour,

Je ne désespère pas de trouver une solution à mon problème

Pour rappel, dans la Version 3, fournie sur ce fil le 16 juin à 10 heures 3, le passage qui me crée des soucis actuellement n’en créait pas. J’ai alors tenté de mettre en commentaire certains nouveaux passages créés depuis lors afin de voir lequel créait problème.

Je constate alors que si je mets en commentaire les lignes 99 à 104 de la macro Sub Triplettes_deuxième_manière() dans le Module_Triplettes_2, ça ne bloque plus lors du passage aux lignes 22 et 23 de la macro Sub Formation_des_doublettes() dans le Module_Doublettes.

Dans ce cas – tel que présenté dans la Version 10 ci-jointe - les résultats attendus ne sont pas corrects sur les feuilles ‘’Tour 1’’, ‘’Tour 2’’, etc., mais au moins ça ne bloque plus.

Avez-vous une idée de la relation entre ces deux passages ?

Amicalement.

Rechercher des sujets similaires à "vba macro qui part vrille"