XL 2016 Mystère d'une macro qui part en vrille

Yvouille

XLDnaute Nouveau
Bonjour,

J’ai créé un fichier permettant de tirer des équipes de joueurs de pétanque de 6 villes différentes lors d’un tournoi en 4 tours. Tel que présentée dans les fichiers ci-joints, la situation au niveau du nombre de joueurs par ville est très représentative de la réalité.

L’idée est d’avoir le maximum de triplettes (équipes de 3 joueurs), avec des joueurs de 3 villes différentes et que les mêmes joueurs ne se retrouvent pas deux fois dans la même équipe durant la journée. Si le nombre de joueurs n’est pas un multiple de 6, il faut créer des équipes de 2 joueurs (des doublettes), mais alors il ne faudrait pas que le même joueur joue deux fois en doublette lors des 4 tours.

Dans le fichier Version 3 ci-joint, je créais ces équipes en 4 étapes assez compliquées à expliquer, mais ce qui est surtout important à savoir est que l’instruction de la ligne 67 Cells(m, j).Cut Cells(Cells(Rows.Count, j + 26).End(xlUp).Row + 1, j + 26) de la macro Sub Tirages() du Module_Y fonctionne très bien, en tout cas qu’elle ne créait pas de blocage et que mon code se déroulait de bout en bout.

Mais comme les résultats finaux n’étaient pas satisfaisants, j’ai tenté de modifier mes codes, notamment en réduisant le nombre d’étapes de 4 à 3.

Lors de l’introduction de ces nouveaux passages, j’ai eu la mauvaise surprise de constater que mon code partait nouvellement en vrille et ceci lors de l’utilisation de la même instruction que celle mentionnée ci-dessus : Cells(m, j).Cut Cells(Cells(Rows.Count, j + 26).End(xlUp).Row + 1, j + 26).

De la Version 4 à la Version 10, j’ai tenté toutes sortes de solutions en vain, particulièrement en saucissonnant les différentes étapes et en tentant de remettre à zéro les variables à la fin de chaque nouveau code ; ma macro bloque toujours au même endroit.

Dans la Version 10, il s’agit de la ligne 22 de la macro Sub Formation_des_doublettes() dans le Module_Doublettes. En plaçant un point d’arrêt sur cette ligne et en avançant alors au pas à pas, on peut l’observer.

Je constate alors que si je mets en commentaire l’un des nouveaux passages - les lignes 99 à 104 de la macro Sub Triplettes_deuxième_manière() dans le Module_Triplettes_2 - ça ne bloque plus !!!

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

MA QUESTION DONC : Avez-vous une idée de la relation entre ces deux passages ?

Amicalement.
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonjour
Les algorithmes de ce classeur peuvent ne pas trouver de solution, parfois, mais ne proposent jamais de solution insatisfaisante.
Le "3 contre 3" semble produire ce que vous voulez. N'opère que sur des numéros mais le tableau Public Tirage obtenu s'exploite facilement pour produire des résultats dans un classeur concret avec des noms de joueurs.
 

Fichiers joints

Dernière édition:

Yvouille

XLDnaute Nouveau
Bonjour,

Merci infiniment pour votre réponse.

J’aurais bien entendu été heureux d’apprendre pourquoi mon code ne fonctionne pas, mais une autre solution serait également très intéressante.

Pour le fichier reçu, je n’ai pas compris s’il était possible de faire en sorte que deux joueurs de la même ville (il y en a 6 en tout) ne jouent jamais ensemble (en revanche ils peuvent jouer l’un contre l’autre).

Comment faire donc afin de renseigner votre ficher au sujet de l’appartenance de tel ou tel joueur à un club bien précis et est-ce que la suite de votre travail éviterait réellement cette possibilité que deux joueurs de la même ville soient partenaire ?

Amicalement.
 

Dranreb

XLDnaute Barbatruc
Alors. J'étais en train de songer à tout cela. Les dispositifs sont là c'est sûr. Mais j'ai peur que vous ne m'introduisiez du 'dans la mesure du possible'… Ça je ne sais pas faire. C'est soit permis soit interdit. Le module MTirage3vs3 à ses propres tableaux DéjàPart et DéjàRenc. et sa fonction Tirage3vs3OK accepte deux arguments facultatifs RClubs et RMarg. Ce peuvent être des tableaux dynamiques 2D d'une colonne Indiquant un groupe d'appartenance de chaque joueur. La fonction élimine des rencontre possible celles entre indices portant les mêmes valeurs autre qu'Empy. Pareil pour les RMarg qui élimine des partenariats (c'était plus fait pour équilibrer les équipes quand un petit nombre d'enfants, handicapés etc. pouvaient participer, afin que plusieurs d'entre eux ne se retrouvent partenaires)
 
Dernière édition:

Yvouille

XLDnaute Nouveau
Je ne comprends pas ce que vous voulez dire par ''Mais j'ai peur que vous ne m'introduisiez du 'dans la mesure du possible' ". J'ai indiqué sur mon premier fil que deux joueurs du même club (de la même ville) ne doivent jamais jouer ensemble.

Je ne comprends pas comment remplir les tableaux dynamiques 2D afin que l'argument facultatif RClubs soit utilisable.

Je n'en ai pas encore parlé, mais s'il était possible de comprendre également comment fonctionne RMarg, ça me permettrait peut-être de faire en sorte que deux femmes ne jouent jamais ensemble.

J'avoue être un peu pommé ; merci d'avance pour toute votre aide.
 

Dranreb

XLDnaute Barbatruc
Oui, pour les partenariats c'était clair. Ce serait plutôt si vous me disiez aussi : peuvent se rencontrer à la rigueur mais le moins souvent possible. Ça je ne saurais faire. Je saurais mieux faire en sorte qu'ils ne le puissent jamais, quitte à ce que pour éviter de tomber sur une impossibilité deux joueurs de villes différentes puissent eux, se rencontrer jusqu'à deux fois au maximum.
Je ne trouve pas cette information pour ségrégation sexiste dans votre classeur mais je vais proposer dans un moment une procédure fabriquant un tableau dynamique TMarg de façon à éviter le partenariat entre mêmes villes.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
En ayant d'abord, par glisser/déplacer dans l'explorateur de projet, depuis le VBAProject du ListeAléat.xlsm vers celui du Tournoi Inter-Clubs_V10.xlsm, l'UFmVisu, les modules standard MTirage3vs3 et XPlanificateur et les modules de classe ListeAléat et Planification, cette procédure dans un Module1 a assez rapidement affiché "Youpi !". Mais des essais avec TMarg spécifié aussi comme RClubs l'on bloqué très tôt, tout comme avec Manches:=4. Je pense qu'il est illusoire de vouloir y ajouter en plus des considérations sexistes.
VB:
Option Explicit
Public Tirage() As Long
Sub ConstruireTableauPartic()
   Dim TDon(), C As Long, L As Long, NbJr As Long, J As Long, TMarg()
   TDon = Feuil2.[A5:K55].Value
   For C = 1 To UBound(TDon, 2) Step 2: For L = 2 To UBound(TDon, 1)
      If IsEmpty(TDon(L, C)) Then Exit For
      NbJr = NbJr + 1: Next L, C
   ReDim TMarg(1 To NbJr, 1 To 2)
   For C = 1 To UBound(TDon, 2) Step 2: For L = 2 To UBound(TDon, 1)
      If IsEmpty(TDon(L, C)) Then Exit For
      J = J + 1: TMarg(J, 1) = TDon(1, C): TMarg(J, 2) = TDon(L, C): Next L, C
   If Tirage3vs3OK(NbJr, Manches:=3, TousJouent:=True, RMargs:=TMarg) Then
      MsgBox "Youpi !"
   Else: MsgBox "Bof…": End If
   End Sub
Attention: code réédité: il y avait une erreur. Mais ça ne change pas le résultat
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
La même procédure avec sortie des résultats dans les feuilles "Tour 1" à "Tour 3":
VB:
Option Explicit
Public Tirage() As Long
Sub EditionTirage()
   Dim TDon(), C As Long, L As Long, NbJr As Long, TMarg(), J As Long, M As Long, TRés()
   TDon = Feuil2.[A5:K55].Value
   For C = 1 To UBound(TDon, 2) Step 2: For L = 2 To UBound(TDon, 1)
      If IsEmpty(TDon(L, C)) Then Exit For
      NbJr = NbJr + 1: Next L, C
   ReDim TMarg(1 To NbJr, 1 To 2)
   For C = 1 To UBound(TDon, 2) Step 2: For L = 2 To UBound(TDon, 1)
      If IsEmpty(TDon(L, C)) Then Exit For
      J = J + 1: TMarg(J, 1) = TDon(1, C): TMarg(J, 2) = TDon(L, C): Next L, C
   If Tirage3vs3OK(NbJr, Manches:=3, TousJouent:=True, RMargs:=TMarg) Then
      For M = 1 To UBound(Tirage, 1)
         ReDim TRés(1 To 25, 1 To 9)
         For L = 1 To UBound(Tirage, 2)
            TRés(L, 1) = L
            For C = 1 To 6
               J = Tirage(M, L, C)
               If J <> 0 Then TRés(L, IIf(C > 3, 3, 1) + C) = TMarg(J, 2)
               Next C
            Next L
         Worksheets("Tour " & M).[A3:I25].Value = TRés
         Next M
      End If
   End Sub
On peut y voir le chiffre des centaines toujours différent dans les noms au sein des équipes.
 

Dranreb

XLDnaute Barbatruc
Je m'aperçois que j'ai oublié de répondre à une question: pour empêcher deux joueurs de se rencontrer on fait préalablement croire au processus de tirage qu'ils se sont déjà rencontrés. Même phrase avec …d'être partenaires…qu'ils l'ont déjà été. Cela se fait en affectant des expressions True aux éléments appropriés des tableaux DéjàRenc et DéjàPart. Ces tableaux n'ont qu'une dimension mais une fonction de calcul d'indice XTria permet de les utiliser comme des tableaux triangulaires (à deux indices différents spécifiables dans n'importe quel ordre). La fonction Tirage3vs3OK applique, avant de commencer le tirage, une règle simple à partir des RClub et RMarg: elle empêche par le principe décrit plus haut respectivement rencontres et partenariats des numéros aboutissant, quand il y sont utilisés comme indices, aux mêmes valeurs dans ces tableaux, à l'exclusion de la valeur vide.
 

Yvouille

XLDnaute Nouveau
Merci pour tes dernières réponses et désolé pour mon temps de réaction, mais j'ai été passablement pris par d'autres occupations ces temps-ci-

Pour information, j'ai tenté avec mon fichier d'aider le membre d'un autre Forum (Excel-Pratique) et comme il souhaitait faire en sorte que deux femmes ne puissent pas jouer ensemble, je lui avais conseillé d'abandonner l'idée, raison pour laquelle ceci n'apparaît pas dans le fichier que j'ai fourni. Mais comme j'avais cru comprendre que ton fichier le permettait, je t'en ai parlé.

Ceci étant dit, je t'avoue toujours et encore être passablement largué dans cette discussion. Je ne sais pas si tu insinues ou m'explique que je peux adapter tes codes à mon fichier ou si tu veux me diriger dans une autre direction. Peux-tu essayer de vulgariser un peu tes explications afin de les mettre à ma portée ? Du point de vue VBA, tu as quand même une bonne idée de mon niveau en consultant les codes que j'ai créé, mais ça ne va pas plus loin.

Je serais très heureux si tu pouvais me sortir un peu de mon brouillard.

Amicalement.
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Quel brouillard ?
Partez du principe qu'il ne faut jamais travailler directement avec les cellules: c'est beaucoup trop lent. Toujours charger et décharger des plage entières et travailler avec les tableaux dynamiques en mémoire qui en constituent la valeur.
Je joins le dernier classeur que j'avais gardé. Attention, il faut souvent s'y reprendre à 3 ou 4 fois pour trouver un tirage.
Remarque: pour une autre application, si le TMarg n'est plus utilisé pour éviter le partenariat entre participants d'une même ville, il peut à nouveau servir à éviter celui entre participants au profil marginal parmi l'ensemble.
Édition: La seule petite procédure adaptée est dans le nouveau Module1. Avez vous d'autres questions de nature à vous faire émerger de votre brouillard ?
 

Fichiers joints

Dernière édition:

Yvouille

XLDnaute Nouveau
Salut,

J’avoue que j’étais complètement largué quant à savoir comment faire le lien entre tes codes et mon fichier. Je te remercie donc d’avoir daigné faire toi ce travail. Ca fonctionne à merveille, au-dessus de tout ce que j’avais pu imaginer. J’en reste sur le cul :)

J’ai ainsi pu fournir à ce membre sur cet autre Forum un fichier qui l’aiderai probablement grandement. Si ça t’intéresse, voici le lien de cette autre discussion : https://forum.excel-pratique.com/viewtopic.php?f=2&t=124734&p=782160#p782160

Il me reste toujours un petit goût d’amertume de ne pas avoir trouvé pourquoi mon code ne fonctionne pas. Bien entendu qu’on ne joue pas dans la même ligue, mais j’aurais quand même aimé comprendre cela.

Pour mon propre club de pétanque, j’ai créé une fichier-mastodonte un peu à l’image de celui que j’avais montré sur ce fil. Les tirages hebdomadaires durent entre 2 et 3 minutes, mais ça fonctionne passablement bien depuis 2 à 3 ans. Eventuellement qu’un jour je reprendrais contact avec toi à ce sujet afin de voir ce qui serait améliorable. Tu accepterais d’étudier cet autre problème ?

Amicalement.
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Je n'ai pas eu le cœur à étudier pourquoi ta solution partait en vrille. Tout ce que je peux dire c'est que ce n'est pas étonnant si on considère qu'un algorithme méthodique implacable est, lui, carrément bloqué au moins 3 fois sur 4. Ne mettre partenaire que des joueurs de villes différentes est très contraignant.
Pour d'autres variantes de compétitions, étudier les autres dispositifs de tirage proposés dans le classeur joint au poste #2, et les exploiter par des procédures aussi courtes que celle du #12.
 

Yvouille

XLDnaute Nouveau
Salut,

Je te remercie pour ta réponse, mais je ne sais pas faire ce que tu proposes.

Je te présente notre fichier actuel pour nos tirages hebdomadaires et éventuellement que tu me diras si tu as l’envie de t’y intéresser ou non et si tu y vois une solution ou non.

Nous jouons toutes les semaines deux matchs et nous établissons un classement d’été et un classement d’hiver. Mon fichier prévoit actuellement que nous jouons toute la saison d’hiver à l’intérieur, c’est-à-dire sur 8 pistes seulement, alors qu’il est prévu que nous jouions en été à l’extérieur, sur un nombre de terrains illimités, à moins qu’il fasse mauvais et que l’on soit plus de 35 membres, auquel cas mon code peut effectuer un tirage sur 8 pistes pour ce soir-là seulement. L’idéal serait bien entendu de pouvoir choisir en toute saison l’une ou l’autre formule.

Les joueurs à disposition sont toujours différents, car ça dépend de qui vient jouer ce soir-là. Le nombre de joueurs peut être différent entre le match 1 et le match 2, car certains ne jouent que l’un ou l’autre match selon leur disponibilité. On ne joue pas s’il n’y a pas au minimum 12 joueurs. Il est possible de ne jouer qu’un seul match un soir.

Notre but principal est de créer le maximum de doublettes puis 1, 2 ou 3 triplettes si nécessaires lorsque nous sommes à l’extérieur et de 1 à 16 triplettes si 48 joueurs viennent sur les 8 pistes intérieures. A l’intérieur, au-delà de 48 joueurs, nous sommes obligés de refuser du monde.

Comme autres contraintes :

A) on tient compte du nombre de fois qu’un joueur a déjà joué en triplette et du pourcentage que ça représente par rapport à sa participation. Ceci est calculé lors du déroulement de la macro sur la base des données inscrites sur la feuille ‘’Relevés’’, en colonnes G à J. Mais le nombre de fois joué en triplette et le % que ça représente par rapport à la participation peut également être vu sur la feuille ‘’Statistiques’’, éventuellement après avoir activé le bouton ‘’Statistiques hors mêlées’’.

B) Le même joueur ne peut pas jouer deux fois en triplette la même soirée, sauf si ce n’est pas possible autrement lorsque l’on joue sur 8 pistes.

C) Les mêmes joueurs devraient jouer ensemble le minimum de fois possible par saison. Durant la saison d’été, j’arrive à faire en sorte que personne ne joue plus de deux fois avec le même joueur, mais je présume que ça pourrait être amélioré. Les joueurs ayant déjà joué ensemble sont listés dans les colonnes A à D de la feuille ‘’Relevés’’.

D) Ceci est moins important, mais j’essaie également de faire en sorte que les mêmes joueurs ne jouent pas trop souvent contre les mêmes adversaires. Ces paires sont répertoriées dans les colonnes N à Q de la même feuille.


Ma macro est très lente, ça peut durer jusqu’à 4 minutes pour un tirage. Comme elle regroupe les joueurs pour tirer les doublettes par groupe de 8, 10 ou 12 joueurs – le traitement d’un groupe de 8 étant assez rapide, celui d’un groupe de 12 très lent – choisi un nombre de joueurs de 27 par exemple si tu veux faire un essai (3 triplettes + 5 doublettes + 4 doublettes). Ca sera beaucoup plus rapide que si tu inscrits par exemple 36 participants (3 x 6 doublettes).

Les résultats sont alors reportés sur les feuilles ‘’Match 1’’ et ‘’Match 2’’ et les joueurs relevés sur la feuille éponyme.

Cordialement.
 

Fichiers joints

Dranreb

XLDnaute Barbatruc
Bonjour.
J'ai bien un système de tirage tous versus à nombre de terrains limité, mais c'est du 1 contre 1
Je n'ai guère envie pour le moment d'écrire un nouvelle procédure de tirage.
Si aucune de celles du ListeAléat.xlsm ne convient essaie d'en adapter une. Le principe est toujours le même: le cœur du dispositif est une procédure récursive qui ne détermine qu'une seule rencontre mais n'a le droit de retenir son choix que si un appel récursif a elle même pour la rencontre suivante a lui aussi pu aboutir.
 

Yvouille

XLDnaute Nouveau
Salut, je te remercie pour ta réponse.

C'est malheureusement du chinois pour moi. Je ne saurais même pas par quel bout commencer. Comme tu dis : ''Je n'ai guère l'envie pour le moment'', je garde un tout petit espoir que tu y reviennes un jour.

Encore un grand merci pour la résolution de mon premier problème.

Amicalement
 

Discussions similaires


Haut Bas