VBA - Répartition de groupes de joueurs sur des terrains

Bonsoir,

J’ai une macro qui effectue un tirage au sort d’équipes de pétanque en fonction du nombre de joueurs présents et du nombre de terrains à disposition, ces deux paramètres pouvant être à chaque fois différents.

Le résultat est reporté sur une ‘’Feuille de match’’, selon les exemples ci-joints. En fonction du nombre de joueurs présents sur chaque terrain, leur nombre est à disposition dans la colonne Q. Pour la suite de mon travail – la partie pour laquelle je vous demande de l’aide - on considère que les groupes de 5 ou 6 joueurs sont des groupes de triplettes.

Il se peut que le nombre de joueurs soit bas et qu’il y ait des terrains vides. Dans de tels cas, je souhaiterais ‘’écarter’’ au maximum les groupes afin d’avoir le plus possible de terrains vides entre deux équipes.

Sur la Feuille de match 1, il y a un exemple de tirage si 7 terrains sont à disposition et que seuls 24 joueurs sont présents. Sur la feuille Démo, colonnes C à J, vous voyez des exemples de la manière dont j’aimerais écarter ces groupes, pour autant qu’il y ait au minimum 1 terrain de vide. Ici ça n’a pas d’importance que les groupes soient de 4, 5 ou 6 joueurs.

Puis dès que tous les terrains sont pris, il faudrait tenter d’intercaler les groupes de doublettes seuls (4 joueurs au maximum) avec des groupes comportant au moins une triplette (groupes de 5 et 6 joueurs).

Sur la Feuille de match 2, il y a un exemple de tirage si 9 terrains sont à disposition et que 41 joueurs sont présents. Sur la feuille Démo, colonnes L à V, vous voyez des exemples de la manière dont j’aimerais intercaler ces groupes de grandeurs différentes.

Si ça peut vous mettre sur une piste, je vous montre comment j’avais résolu le problème pour un nombre fixe de 8 terrains et pour un nombre de joueurs entre 19 et 48, mais je n’arrive pas à adapter mon code à un nombre de terrains différents (entre 3 et 20) et pour un nombre quelconque de joueurs (toutefois 4 au minimum et 6 par terrains au maximum).

    With Sheets("Match 1")
        Nombre_Joueurs = WorksheetFunction.CountA(.Range("B4:H24"))

        ' Utilisation des terrains vides jusqu'à 31 joueurs
        If Nombre_Joueurs > 19 And Nombre_Joueurs < 24 Then
            .Range("B8:H8").Cut
            .Range("B12:H12").Insert Shift:=xlDown
            .Range("B7:H7").Cut
            .Range("B10:H10").Insert Shift:=xlDown
            .Range("B6:H6").Cut
            .Range("B8:H8").Insert Shift:=xlDown
        End If
        If Nombre_Joueurs > 23 And Nombre_Joueurs < 28 Then
            .Range("B9:H9").Cut
            .Range("B12:H12").Insert Shift:=xlDown
            .Range("B8:H8").Cut
            .Range("B10:H10").Insert Shift:=xlDown
        End If
        If Nombre_Joueurs > 27 And Nombre_Joueurs < 32 Then
            .Range("B10:H10").Cut
            .Range("B12:H12").Insert Shift:=xlDown
        End If

        ' Répartition des triplettes parmi les doublettes si plus de 34 joueurs
        If Nombre_Joueurs > 34 Then
            .Range("B7:H7").Cut
            .Range("B11:H11").Insert Shift:=xlDown
            .Range("B6:H6").Cut
            .Range("B9:H9").Insert Shift:=xlDown
            .Range("B5:H5").Cut
            .Range("B7:H7").Insert Shift:=xlDown
        End If

    End With ' Sheets("Match 1")

A vous relire.

48demo-30-04.xlsx (42.14 Ko)

Bonjour Yvouille

dans les propositions de réponses, le cas 3 terrains, le résultat donne de T1 vers T3 du haut vers le bas

alors que dans les autres, c'est du bas vers le haut pour les triplettes

Erreur de ta part on volontaire ?

Ma proposition

Double click dans la cellule A3 = résultat en colonne R

Modifier Col dans la macro pour mettre dans la colonne souhaitée

15demo-30-04.xlsm (55.64 Ko)

ne colonne

Salut Bob,

Un tout grand merci de t’être intéressé à mon problème

Je suis assez étonné par la concision de ton code alors que je pensais qu’il en faudrait des lignes et des lignes. Chapeau.

Je trouve que ça part dans une toute bonne direction et je pourrais maintenant continuer seul, à l’aide de cette excellente base.

Cependant, je présume que si je t’explique les problèmes qu’il resterait à résoudre, tu pourras très certainement combler mes souhaits en modifiant un peu ta macro, alors que si je dois résoudre moi-même ces derniers points, ce sera à l’aide de macros complémentaires bien plus bricolées.

Mais avant de t’expliquer ces derniers soucis, je voudrais préciser que mon exemple de la ‘’Feuille de match 1’’ du précédent fichier – l’actuelle feuille ‘’FM 1’’ – est aberrant car vu le nombre de joueurs présents et le fait qu’il y a assez de terrain à disposition, il serait logique de ne former que des doublettes. Ta macro – placée derrière le bouton ‘’REPARTITION’’ - fonctionne alors parfaitement pour la nouvelle feuille ‘’FM 1 NEW’’.

A noter que j’ai ajouté un passage à ton code (voir ‘’ ' Rajout d'Yvouille’’) afin de numéroter également les terrains non occupés dans la colonne R, de manière à pouvoir trier le résultat obtenu par ta macro.

Premier problème

Ta macro fonctionne parfaitement bien sur la feuille ‘’FM 2’’ en fonction des instructions que j’avais données, mais je me rends compte maintenant qu’une petite amélioration serait la bienvenue. En fait, j’avais expliqué que si une triplette jouait contre une doublette (il y a donc le chiffre 5 en colonne Q) on la considérait ce groupe comme une triplette normale. Mais actuellement ce groupe ce retrouve systématiquement en dernier, alors que ce serait bien qu’il se retrouve le plus haut possible dans la répartition, soit à la place du premier groupe ‘’Triplette contre triplette’’ (6 en colonne Q). Dans l’exemple de cette feuille ‘’FM 2’’, le groupe qui se retrouve au terrain 9 devait plutôt être sur le terrain 5.

Si tu n’arrives pas à un résultat par une modification simple de ton code, je me débrouille toutefois avec un complément personnel.

Deuxième problème

J’avais expliqué que tant que tous les terrains n’étaient pas tous occupés, ça n’avait pas d’importance que les groupes à répartir soient composés de doublettes ou de triplettes (en fait, tant qu’il y a assez de terrains, il ne peut y avoir que 1, 2 ou 3 triplettes, puis on passe un passe un groupe de 2 doublettes en plus) et j’avais indiqué des G1, G2, etc. dans les colonnes D à J de la feuille ‘’Démo’’. Ainsi, sur la base de l’exemple de la feuille ‘’FM 3’’, on devrait obtenir le résultat de la plage F26:F32 de la feuille ‘’Démo’’.

Pour la feuille ‘’FM 4’’, la répartition devrait être la même que pour la ‘’FM 3’’.

Si tu as une solution simple, tant mieux, sinon je récupère une partie du code que j’avais pour mon ancien fichier et que j’ai placé dans mon premier message.

dans les propositions de réponses, le cas 3 terrains, le résultat donne de T1 vers T3 du haut vers le bas

alors que dans les autres, c'est du bas vers le haut pour les triplettes

Erreur de ta part on volontaire ?

Erreur de ma part. J’ai numéroté les triplettes de T1 à Tx surtout afin que leur nombre soit visible au premier coup-d’œil. Ensuite j’ai modifié l’ordre de bas en haut un peu au hasard, ne sachant pas trop quelle présentation était la mieux. Une fois que je me suis décidé, j’ai oublié de modifier le cas ‘’3 terrains’’.

Mais si c’est cette numérotation des triplettes qui t’a induit en erreur quant à la position du groupe de 5 joueurs (doublette contre triplette), j’en suis absolument désolé.

Excellentes salutations.

10demo-v3.xlsm (110.42 Ko)

Boujour Yvouille

Je viens de voir ton autre post

j'espère que tu n'as pas changé ton fusil d'épaule

nouvelle version mais dans les tableaux démos, tu n'a pas intégré les triplettes + doublettes donc j'ai fais comme j'ai pu

22demo-v3.xlsm (108.91 Ko)

Salut Bob et merci beaucoup pour ton nouveau message,

j'espère que tu n'as pas changé ton fusil d'épaule

Si tu veux dire par là que ma demande change, je dirais que non, c’est juste selon moi que ce n’est pas toujours simple d’expliquer ce que l’on souhaite, surtout que certaines choses nous semblent de prime abord évidentes alors qu’elles ne le sont pas pour celui qui est en face.

Comme je te l’ai dit, je pourrais me débrouiller avec les premiers codes que tu m’as fournis, mais si tu veux bien encore réfléchir au problème, voici un complément d’information.

Comme, à la base, les groupes de 4, 5 ou 6 personnes par terrain sont dans cet ordre-là, je n’ai pas pensé de dire qu’il ne faudrait pas qu’un groupe de 5 personnes ‘’tombe’’ plus bas qu’un groupe de 6. Raison pour laquelle je n’avais pas fait de différence entre les groupes ‘’Doublette contre triplette’’ et les groupes ‘’Triplette contre triplette’’.

S’il y a des terrains libres, l’idée est d’écarter au maximum les équipes mais dans l’ordre dans lequel elles se trouvent déjà.

Si tous les terrains sont occupés, on essaie d’intercaler des groupes de 5 et 6 joueurs avec des groupes de 4 joueurs, mais sans modifier l’ordre premier à l’intérieur des groupes de 4, 5 ou 6 joueurs.

Sur ma feuille ‘’Démo’’, j’ai mis en rouge les groupes qui peuvent être de 5 ou 6 joueurs (DT/T = Doublette et triplette OU triplette et triplette).

Le résultat obtenu avec le code en place dans le dernier fichier reçu ne serait ainsi pas correct pour les exemples ‘’FM 1 New’’, FM 4 et FM 5. J’ai placé sur ces feuilles des images du résultat souhaité.

Si tu veux bien continuer à m’aider ……

Sincèrement.

12demo-v4.xlsm (112.20 Ko)

Re

je ne vois pas d'image ?

Désolé, j'ai dû oublier d'enregistrer ou alors j'ai travaillé sur un dossier dans un nuage informatique

Voici donc ce fichier.

Encore merci pour ta patience.

13demo-v5.xlsm (140.57 Ko)

Bonjour Yvouille

Bon j'espère avoir réussi

j'ai enfin trouvé le fil conducteur

A toi de me dire

26demo-v5-1.xlsm (137.49 Ko)

Salut Bob,

Merci beaucoup pour ce nouvel apport

D’un côté, tu as dépassé mes attentes avec ta proposition, mais d’un autre côté ça croche encore. Le problème semble venir du nombre de terrains pair ou impair.

Je vais m’expliquer, mais tout d’abord une ou deux précisions. J’ai renommé mes feuilles à l’aide de 4 chiffres représentants pour chaque essai : le nombre de terrains, le nombre de doublettes contre doublettes (groupe de 4 joueurs = DD), le nombre de doublette contre triplette (5 joueurs, jamais plus que 1 groupe de la sorte = DT) et le nombre de triplette contre triplette (6 joueurs = TT).

Ta proposition dépasse mon attente par exemple sur la feuille ‘’9 3 1 5’’ sur laquelle le groupe DT n’est pas placée sur le terrain 1 comme je l’avais souhaité moi, mais entre deux groupes TT, ce qui est encore un gain de place complémentaire. Géniale idée ! Cette disposition ingénieuse se retrouve par exemple sur la feuille ‘’13 2 1 10’’.

Cependant, avec des nombres de terrains pairs, les choses vont parfois un peu de travers. Sur la feuille ‘’8 5 0 3’’ par exemple, tous les groupes TT se retrouvent ensemble vers le haut. Pratiquement idem sur la feuille ‘’8 5 1 2’’. Sur la feuille ‘’8 2 1 5’’, les deux groupes DD sont côtes-à-côte. Sur la feuille ‘’8 2 0 6’’ c’est moins embêtant, mais on gagnerait quand même de la place si un groupe TT était placé proche d’un bord, soit sur le terrain 1 (comme c’est le cas sur la feuille ‘’9 2 1 6’’).

Pour les essais avec 12 terrains on retrouve les mêmes problèmes alors qu’avec 13 terrains ça joue à nouveau très bien.

Pour chaque feuille ‘’à problème’’, j’ai placé une image du résultat souhaité. Sur la feuille ‘’8 2 1 5’’ j’en ai placé deux pour montrer que plusieurs résultats seraient possibles, pour autant que les groupes soient le plus éloignés possible en fonction de leur grandeur.

J'ai enlevé ma feuille ''Démo'' car avec tes nouvelles idées, mes exemples ne sont plus valables, dépassés.

Ton code prend de l’ampleur et j’admire ton travail, car je suis bien incapable d’en faire autant

Cordialement.

19demo-v6.xlsm (448.45 Ko)

Bonjour Yvouille

A part un ou deux complets un peu différents, le problème c'est que tu me renvoi maintenant 2 au lieu de 4

pour les doublettes.

Salut Bob,

J’ai l’impression que tu as l’impression que je ne sais pas trop où je veux en venir avec ma demande et tu as un peu raison.

Mais quelque part, c’est que plus tu trouves de solutions allant dans mon sens, plus je me dis que l’on pourrait perfectionner la chose et pousser le bouchon un peu plus loin.

Bon, ça n’explique et n’excuse pas mes erreurs telles que les dernières dont tu me fais part.

Ces erreurs une fois corrigées, je trouve encore des situations où il me semble que l’on pourrait améliorer les résultats déjà obtenus grâce à toi, mais je ne veux plus t’importuner pour l’instant.

Je vais donc chercher à tête reposée si je peux présenter mon problème différemment ; si non, je dois quand même te dire que les codes que tu m’as déjà fournis m’apportent de très bons résultats et pourraient/seront utilisés tel quel.

Pour l’instant encore un tout grand merci pour ton aide et éventuellement à la prochaine.

Salut Bob,

Je reviens déjà à la charge car j’ai eu l’idée de présenter les résultats souhaités d’une autre manière. Mais à nouveau, tu ne pourrais pas me faire le reproche de ne pas y avoir pensé dès le début, car une partie de ces nouveaux souhaits découlent d’idées que tu m’as fournies au cours de notre échange.

Maintenant, si le problème ne t’intéresse plus, je comprendrais tout à fait et je me débrouillerai autrement, mais je ne veux pas non plus chercher de l’aide ailleurs sans te le faire savoir. A toi de me dire – ou de ne pas me dire – si tu veux encore t’intéresser à ce problème. Sans nouvelle de ta part, je considère que tu en as ta claque

A tout hasard, dans le fichier ci-joint, j’ai eu l’idée de démontrer quelques exemples des résultats qui seraient idéaux. En espérant ne plus m’être trompé.

Cordialement.

16demo-niou.xlsx (22.78 Ko)

Bonsoir Yvouille

Tu arrive à la même conclusion que moi

au lieu d'avoir une macro qui cherche à placer les équipes dans les bonnes cases, c'est d'avoir une matrice de tous les cas

possible que tu souhaite avec à la place des 4 ou 5 ou 6, les 1 2 3 4 5 6 etc

comme ça, on cherche la ligne , la colonne et on renvoi les valeurs de tri.

Si tu veux changé, c'est toi qui modifie la matrice mais pas la macro

pas de soucis pour t'aider

ce n'est jamais facile de trouver la bonne solution du premier coup

sinon on serait tous des dieux

yvouille

Salut Bob, merci pour ta réponse

Je comprends que tu me proposes d'oublier l'idée d'une macro qui effectuerait la répartition quel que soit le nombre de terrains à disposition et le nombre de joueurs présents et que je crée une matrice pour chaque nombre de terrains possible, soit entre 3 et 15.

Mais je vois alors deux problèmes. L'un, mineur, qui consisterait à créer ces matrices et l'autre, qui m'inquiète un peu plus, c'est la place que prendraient ces 13 matrices dans un fichier qui est déjà bien volumineux ; est-ce que ça ne risque pas de ralentir ma macro principale qui dure déjà 1 minutes en fin de saison ?

Ou est-ce que je n'ai rien compris et que ces tris que tu me montres sur ton image du haut sont effectués par ta macro ?

A te relire.

Bonjour à tous les deux,

à lire j'ai l'impression que l'algorithme pourrait être simplement celui-ci :

Remplir les terrains impairs en commençant par les triplettes, puis les 5 joueurs, puis les 4 joueurs.

S'il reste des équipes, continuer sur les terrains pairs.

Non ?

eric

PS : je n'ai pas regardé ce que BOB71AU avait fait... Peut-être est-ce déjà ça

PS 2 : Ou, ce qui revient au même, numéroter tes terrains 1,3,5,7,2,4,6,8, remplir dans l'ordre les terrains avec les 6j , puis les 5j et les 4j, puis trier les terrains

Bonjour à vous

Eric, merci de tes lumières

C'est à peu près ça mais cela change en fonction des terrains paires ou impaires

et quelques fois en fonction de Yvouille

La ça devient plus compliqué

Je ne suis pas un grand spécialiste des tableaux mais si tu veux regarder les codes

Ce qui me dérange dans les codes, c'est que je suis obligé d'utiliser des valeurs fixes

j'ai donc du oublier de prendre en compte un paramètre

Yvouille

En fait, ce que je te propose,c'est d'avoir une feuille avec en colonne 1, les différentes valeurs de terrains puis, sur la même ligne, avoir la somme des équipes.

la macro parcours la colonne 1 puis recherche la somme des équipes et renvoi les numéros sous cette somme

yvouille

Un exemple de ce que je pensais.

J'ai pris le fichier Demo V4 feuille FM 2 et j'ai mis les équipe plus bas pour travailler dessus et ne pas bousculer la mise en page.

C'est un point de départ, à voir si d'autres critères sont à ajouter.

eric

PS : j'ai oublié de nettoyer les terrains avant de coller les résultats :

[A4:H4].Resize(nbTerrain).ClearContents

il manque peut-être encore des trucs, c'est plus pour exposer l'idée et voir si ça va dans le bon sens

16demo-v4.xlsm (108.17 Ko)

Salut Bob, salut Eric,

Je vous remercie tous deux de vous intéresser encore à mon problème.

@ Eriiic

Tu as bien précisé : « C'est un point de départ, à voir si d'autres critères sont à ajouter » et je crais fort que si l’on part dans ta direction, on va tomber sur des exceptions qui vont à nouveau compliquer le code au fur et à mesure de leur résolution.

@ Bob

Je vais donc partir dans la direction que tu préconises et créer un tableau par nombre de terrains possible. Je pense finalement que mes craintes quant à l’agrandissement du fichier et au ralentissement de la macro de base sont infondées.

J’ai pour l’instant créé les tableaux pour 5, 8 et 9 terrains et ça fonctionne bien, comme tu l’as dit, avec la possibilité de corriger simplement mes tableaux de base si l’une ou l’autre répartition étaient incorrectes.

Il est bien évident que dans mon fichier de base je n’ai qu’une seule feuille de match qui est modifiée à chaque fois est non pas plusieurs comme dans ce fichier démo.

Je peux donc mettre ce sujet sur ‘’Résolu’’ et tiens à vous remercier encore une fois pour toute l’aide offerte.

Amicalement.

10demo-09-05.xlsm (249.67 Ko)

Bonjour,

Ce problème me tiraillait et j’ai continuer à chercher une solution que je pense avoir trouvée.

Dans le fichier ci-joint, on peut simuler un nombre de terrains de 3 à 15 (bien que cette macro devrait fonctionner pour un nombre illimité de terrain) et simuler un nombre de joueurs entre 8 et 6 x le nombre de terrains.

Une fois ces joueurs mis en place – comme dans ma macro réelle – on peut lancer le code qui les répartit selon mes souhaits.

Je n’avais pas tenté de créer ce code de suite, pensant qu’un autre membre plus doué aurait une idée plus simple. Et ce nouveau code est tout simplement la suite de l’idée d’Eriiic, soit de prendre les cas les uns après les autres.

A ma grande surprise, je n’ai dû traiter que 5 cas différents, selon la numérotation dans le code.

Encore un grand merci à Bob et Eriiic pour leur aide passée.

Chaleureusement.

Bonjour,

je savais bien qu'elle n'était pas bête mon idée

Je ne vois pas pourquoi tu distingues nombre de terrains pairs/impairs.

C'est quoi l'importance d'occuper les terrains 2-4 au lieu des terrains 1-3 ?

A part l'éventuelle proximité de la buvette je ne vois pas.

Et si tu as 4 équipes par exemple tu ne les espaces plus d'un terrain vide ?

eric

Rechercher des sujets similaires à "vba repartition groupes joueurs terrains"