XL 2016 Aide pour creer une macro pechue

phil77515

XLDnaute Nouveau
bonjour

je souhaiterais avoir de l'aide pour créer un petit sous excel

au premier tour
il s'agit de composer des binômes en fonction de critères Puis de leur attribuer un gage

au second tour
toujours pareil sauf que les binômes doivent changer

idem au 3eme et 4eme tour

j'ai prépare un fichier avec déjà des éléments mais mes limites sont atteintes

merci de votre aide
 

Pièces jointes

  • JEU TIRAGE SORT.xlsm
    31.8 KB · Affichages: 62

Dranreb

XLDnaute Barbatruc
Là j'ai mis en place le système de visu. Le tirage est un algorithme dont j'estime la durée de traitement proprortionnelle au produit d'un petit nombre par la factorielle d'un nombre aléatoire normalement distribué. Ce qui veut dire que s'il dure le plus souvent 1 milliseconde, et s'il y a peu de chances qu'il n'ait besoin que de 100 microsecondes, la probabilité de cette dernière éventualité pourrait être exactement la même que celle où il aurait besoin de … 3 jours ! Donc il faut pouvoir l'interrompre pour recommencer avec, à l'initialisation des objets ListeAléat, des choix fortuits de départ plus favorables.
Je le laisse dans une configuration où il n'y a probablement pas de solution, mais cela ne pourrait être déterminé qu'en essayant tout, ce qui serait abominablement long.

Remarque toute personnelle: Les gages pourrait être remplacés par des descriptions de lieux où se rendre (dans la maison où le jardin) ou sont exposés des indices d'un mystère à trouver, et une instruction de s'échanger ou non d'autres indices individuels dont ils disposaient, tirés au sort au départ. Enfin de quoi donner envie aux participants de revenir un jour tenter l'expérience, quoi … Mais bon, je suis peut être un peu trop cérébral …
 

Pièces jointes

  • Temp.xlsm
    65.3 KB · Affichages: 5
Dernière édition:

phil77515

XLDnaute Nouveau
J'ai réalisé ce que je disais dans cette version: on peut indiquer le nombre d'occurrences permises de chaque rencontre dans la feuille "Equipe". Toutefois il prend 0 si ce n'est pas numérique et assume 1 si c'est omis, comme ça on garde aussi la notation précédente.
Je pourrais, si vous voulez, équiper le dispositif de tirage d'un système de visualisation de son processus, avec possibilité de l'interrompre. Ce ne serait pas du luxe si de nombreuses situations peuvent être demandées avec beaucoup de rencontres interdites.


oui mais la cela devient complique, , parcontre je ne comprends rien a la macro trouve
pourriez vous mettre des commentaires

il y a des variables incomprehensibles pourriez vous mettre des traduction Lol

Private Function Trouvé(ByVal Niv As Long) As Boolean
Dim M As Long, LAtJ As ListeAléat, PJ As Long, J As Long, _
L As Long, LAtG As ListeAléat, PG As Long, G As Long

' LAtJ =???
' _= ???
'PJ =???


M = Niv \ NbEQu + 1: If M > 4 Then Trouvé = True: Exit Function
L = Niv Mod NbEQu + 1: Set LAtJ = TAléa(M): Set LAtG = TLAtG1(L)

'TAléa(M)=???
'TLAtG1(L)=??

Do: PJ = PJ + 1: J = LAtJ.Aléat(PJ): If J = 0 Then Exit Function

'(PJ) = ???

If TNbRenc(L, J) Then

'TNbRenc ??

PG = 0: Do: PG = PG + 1: G = LAtG.Aléat(PG): If G = 0 Then Exit Function

'PG = ???

Loop While TGag2(J, G)
LAtJ.Supprimer J: TNbRenc(L, J) = TNbRenc(L, J) - 1: LAtG.Supprimer G: TGag2(J, G) = True

' la c'est chaud LOL

Trouvé = Trouvé(Niv + 1)
If Trouvé Then TTir(M, L, 1) = J: TTir(M, L, 2) = G: Exit Function
LAtJ.Remettre J, PJ: TNbRenc(L, J) = TNbRenc(L, J) + 1: LAtG.Remettre G, PG: TGag2(J, G) = False: End If
Loop
End Function
 

Dranreb

XLDnaute Barbatruc
La fonction Trouvé est récursive, c'est à dire qu'elle s'appelle elle même par Trouvé = Trouvé(Niv + 1), ce qui alloue à la version appelée, ailleurs dans la pile mémoire, tout un jeu des mêmes variables locales que celles qu'elle utilise, sans perte des valeurs de ces dernières dans la version appelante.
Son rôle est de trouver un seul participant des lignes à mettre en face d'un participant des colonnes.
Elle estime avoir réussi s'il reste un nombre de rencontres permises de ces deux là non nul en TNbRenc(L, J) (L: la ligne, J: le partenaire envisagé), et aussi si elle trouve un gage disponible non déjà attribué à l'un des deux, et enfin surtout, car ce n'est plus ses oignons à elle, si son successeur récursif pour la ligne suivante, voire la 1ère ligne du tour suivant, arrive à faire de même avec ce qu'elle lui laisse.
La procédure principale Tirage ne lui demande donc de fixer qu'une seule paire pour le niveau 0 qui correspond à la 1ère ligne du 1er tour, puisqu'elle ne le fixe que si elle à pu faire fixer les suivants par les versions qu'elle appelle récursivement. Vous voyez à peu près ?
Il n'y a pas de 'LAtJ =' dans le code. Il y a un 'Set LAtJ =' pour créer l'objet, et il y a un 'J = LAtJ.Aléat(PJ)' pour affecter à J la valeur retournée par cette méthode. Vous trouverez en commentaires un mode d'emploi très détaillé des propriétés et méthodes de l'objet ListeAléat dans le module de classe ListeAléat.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Mais à relire votre dernier poste, j'ai l'impression qu'il vous manque carrément des bases. Notamment :
— Un espace suivi d'un blanc souligné à la fin d'une ligne physique est un symbole de continuation sur la suivante de la ligne logique. Une ligne logique peut comporter plusieurs instructions séparées par des 2 points.
— lorsqu'une expression numérique est utilisé en tant que condition dans un If, celle ci est considérée True si l'expression est différente de 0.
— Vous ne semblez percevoir la différence entre variable locale (déclarée dans une procédure et volatile, conservée seulement le temps de son exécution) et variable globale (déclarée en tête du module et pérenne, connue et partagée par toutes ses procédures, et seulement celles ci si elle est déclarée par une instruction Private, mais aussi dans tout les modules du projet si elle l'est avec une instruction Public, du moins dans un module standard. Dans un module objet, avec Public ça en devient une propriété, de même qu'une Public Sub en devient ce qu'on appelle une méthode).
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
J'ai renommé dans tout le module TAléa en TLAtJ (c'est le tableau des 4 ListeAléat des joueurs de colonnes non encore appariés dans chacune des 4 manches, dans l'ordre aléatoire où ils sont envisagés.
C'est pour être dans la logique du nom pris pour TLAtG1 (tableau des ListeAléat des numéros de gages 1. Le 1 c'est pour évoquer qu'il s'agit seulement des gages non encore attribués à chaque joueur des lignes. Pour vérifier si un gage pris d'un de ces ListeAléat n'a pas déjà été attribué au joueur des colonnes qu'on envisage de lui associer je fais autrement: je le vérifie simplement dans un tableau de Boolean TGag2 (le 2 là c'est pour les joueurs des colonnes par opposition au 1 des lignes)
Ouais, c'est plus compliqué à expliquer qu'à programmer ;)
Les PJ et PG ce sont les positions dans les ListeAléat où j'ai trouvé le J et le G, pour pouvoir, après les en avoir supprimé, les y remettre à la même place s'ils ne vont pas …
Et TTir ben c'est le tableau du tirage résultant à garnir: TTir(M, L, 1) pour le numéro du joueur de colonne, manche M, ligne L et TTir(M, L, 2) pour le numéro du gage attribué. Je m'en sers dans la procédure principale pour restituer les noms et les désignations de gages.
 
Dernière édition:

phil77515

XLDnaute Nouveau
J'ai renommé dans tout le module TAléa en TLAtJ (c'est le tableau des 4 ListeAléat des joueurs de colonnes non encore appariés dans chacune des 4 manches, dans l'ordre aléatoire où ils sont envisagés.
C'est pour être dans la logique du nom pris pour TLAtG1 (tableau des ListeAléat des numéros de gages 1. Le 1 c'est pour évoquer qu'il s'agit seulement des gages non encore attribués à chaque joueur des lignes. Pour vérifier si un gage pris d'un de ces ListeAléat n'a pas déjà été attribué au joueur des colonnes qu'on envisage de lui associer je fais autrement: je le vérifie simplement dans un tableau de Boolean TGag2 (le 2 là c'est pour les joueurs des colonnes par opposition au 1 des lignes)
Ouais, c'est plus compliqué à expliquer qu'à programmer ;)
Les PJ et PG ce sont les positions dans les ListeAléat où j'ai trouvé le J et le G, pour pouvoir, après les en avoir supprimé, les y remettre à la même place s'ils ne vont pas …
Et TTir ben c'est le tableau du tirage résultant à garnir: TTir(M, L, 1) pour le numéro du joueur de colonne, manche M, ligne L et TTir(M, L, 2) pour le numéro du gage attribué. Je m'en sers dans la procédure principale pour restituer les noms et les désignations de gages.


bonjour Danreb
effectivement , je suis tres au debut du langage et l'interet de sefaire aider sur un forum est ensuite de pouvoir comprendre comment le developpeur a concu le principe de fonctionnement et ensuite comment il a code ,d'ou mes questions

mais avec ces precisions , je vais pouvir decortiquer et suivre pas a pas le deroulement

avec mes remerciement , pour tout ce qui a ete fait

bien a vous
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Si ça présente un intérêt on peut le faire aussi dans ma solution :
il vaudrait mieux alors un tableau TLatG(1 To 4] As ListeAléat des gages non attribués de chaque manche et vérifier dans un tableau de Boolean TGage1 s'il n'a pas déjà été attribué au joueur des lignes comme on le fait avec TGage2 pour le joueur des colonnes.
 

Dranreb

XLDnaute Barbatruc
Bon ben je l'ai fait.
On pourrait même, s'il y a au moins 2 fois plus de gages disponibles que de lignes, faire en sorte que les gages de chaque tour ne soient jamais réattribués au tour suivant.
 

Pièces jointes

  • Temp.xlsm
    67.4 KB · Affichages: 2

Dranreb

XLDnaute Barbatruc
Que les gages de chaque tour ne soient jamais réattribués au tour suivant s'il y a au moins 2 fois plus de gages disponibles que de lignes, je l'ai fait, là encore.
Ça semble même faciliter le traitement en réduisant le risque qu'un gage ait déjà été attribué auparavant.

Remarque toute personnelle: La teneur des gages évoqués ne me donnerait toujours aucune envie de participer à ce genre de soirée, mais nul doute que ce truc pourrait être la base de jeux de rôles très intéressants … avec un certain parfum du jeu Cluédo par exemple … Un des indices attribués au hasard à chaque joueur étanrt: "Vous êtes l'assassin que les autre joueurs doivent trouver, mais vous ne vous rappelez plus de rien"…
 

Pièces jointes

  • Temp.xlsm
    67.7 KB · Affichages: 12
Dernière édition:

phil77515

XLDnaute Nouveau
merci a tous les deux , je teste chacune votre version et je reviens vers vous

j’espère que votre travail servira a d'autre , carc'est top

pour danreb ,j''ai effectivement trouve dans "module de classe" les variables de "listeAléat" , avec cela on comprend mieux les utilisations des variable

Je suis un petit scarabee a cote de vous deux , ce qui vous semble evident à vous , ne l'est pas pour tous ...
 

phil77515

XLDnaute Nouveau
Que les gages de chaque tour ne soient jamais réattribués au tour suivant s'il y a au moins 2 fois plus de gages disponibles que de lignes, je l'ai fait, là encore.
Ça semble même faciliter le traitement en réduisant le risque qu'un gage ait déjà été attribué auparavant.

Remarque toute personnelle: La teneur des gages évoqués ne me donnerait toujours aucune envie de participer à ce genre de soirée, mais nul doute que ce truc pourrait être la base de jeux de rôles très intéressants … avec un certain parfum du jeu Cluédo par exemple … Un des indices attribués au hasard à chaque joueur étanrt: "Vous êtes l'assassin que les autre joueurs doivent trouver, mais vous ne vous rappelez plus de rien"…

pour les gages je les ai pompé sur un site au pif , je retrouve plus lequel mais il est évident que pour une soirées les gages doivent etre adapté à l'auditoire. la c'etait histoire d'avoir une base
mais cela reste sympa entre 2 danses latino et entre la poire et le fromage de se ridiculiser une peu

bien a toi
 

phil77515

XLDnaute Nouveau
Que les gages de chaque tour ne soient jamais réattribués au tour suivant s'il y a au moins 2 fois plus de gages disponibles que de lignes, je l'ai fait, là encore.
Ça semble même faciliter le traitement en réduisant le risque qu'un gage ait déjà été attribué auparavant.

Remarque toute personnelle: La teneur des gages évoqués ne me donnerait toujours aucune envie de participer à ce genre de soirée, mais nul doute que ce truc pourrait être la base de jeux de rôles très intéressants … avec un certain parfum du jeu Cluédo par exemple … Un des indices attribués au hasard à chaque joueur étanrt: "Vous êtes l'assassin que les autre joueurs doivent trouver, mais vous ne vous rappelez plus de rien"…
bonjour danreb

je reviens sur mon petit jeu car avec le confinement on se remets sur les appli
j'ai redui a 4 couple et la ca coince car il dit qu'il ne peut pas faire 4 tours comptetenu qu'il y a 3 participants

il faudrait donc que si le nombre de couple est < à 4 , il mette un tirage vide pour le 4 eme

bien a toi
 

Discussions similaires