> Tous les forums > Forum Bureautique
 Tirage au sort avec macro
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
rchristian13
  Posté le 17/01/2015 @ 21:43 
Aller en bas de la page 
Nouvel astucien

Bonjour à tous,

je cherche à faire un tirage au sort pour des concours de pêche en mer.

Avec l'aide de la macro de galopin01
j'ai commencé à faire une feuille qui me permet un premier tirage.

Le tirage doit se dérouler de la manière suivante :

- il y a de 40 à 80 compétiteurs appartenant à 6 clubs différents

- aucun compétiteur ne peux se trouver à coté d'un compétiteur du même club

- un jeune "poussin" doit obligatoirement être à coté de son représentant légal.

Je joint un fichier exemple avec la macro que j'ai écrite.

Si quelqu'un veux bien me donner un coup de main je l'en remercie par avance.

Bonne soirée.

Christian

http://cjoint.com/?EArvzOCepDw

Publicité
ferrand
 Posté le 18/01/2015 à 11:46 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

Je vois 3 macros : Tirage2 étant juste une correction de Tirage, je suppose que c'est de Tirage3 (associée au bouton) dont tu veux parler. Elle reprend la procédure de tirage en dédoublant, elle incorpore des bouts d'enregistrements de macros (à réécrire), utilise 5 variables non déclarées en lieu et place d'une variable déclarée (inutilisée mais qui suffisait pourtant), effectue le même type de tirage sur 2 tableaux, les trie et les copie-colle sur un 3e. Hormis les points que j'ai signalés à ajuster (mais a-priori sans incidence sur le déroulement de la procédure), quel est le problème ?

Je ne compte que 5 clubs sur les 6 annoncés, je ne sais pas ce que signifient "pair" et "impair", ni comment ces 2 tableaux sont alimentés (à partir de "Pesée" ?), je ne sais pas comment se manifeste le fait d'être "à côté de" (comment on identifie cette position dans les listes), je ne vois pas de "poussin" ni de "représentant légal" identifié.

Alors, si tu en disais un peu plus, on pourrait tenter de comprendre quel est le problème, comment il se matérialise, et te faire sans doute des propositions...

rchristian13
 Posté le 18/01/2015 à 21:38 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

Merci ferrand pour tes réponses.

Pour la variable "n" à "n5" peux être la même ? et n'utiliser que "n"

Pour les bouts à réécrire est il vraiment nécessaire ?

Je débute en VBA et je vous remercie de votre aide.

Je vous explique :

je dois faire le tirage au sort pour des concours de pêche et mer.

Je reçois en milieux de semaine la liste des inscrits pour le concours.

Il y 6 clubs dans la région (Seulement 5 dans le fichier).

Les compétiteurs sont répartis dans un des 6 clubs.

Pour la compétition la obligation du tirage au sort :

- Aucun compétiteur d'un même club ne peut se trouver l'un à coté de l'autre. (Tirage paire et impair ce que fait aujourd'hui la macro)

Pourquoi pair et impaire : car jusqu'à présent nous faisions le tirage au sort manuellement et par facilité dispatche des clubs/Compétiteurs en 2 groupes (Pair et impair).

- les compétiteurs catégorie "poussin" doivent ce trouver à coté d'un représentant qui sera désigné par le club (a voir comment les identifier sur le fichier)

- le nombre de compétiteurs sur chaque compétition n'est jamais le même.

en espérant avoir répondu à tes questions.

Merci d'avance.

Christian

ferrand
 Posté le 19/01/2015 à 09:20 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

Débutant en VBA, autant s'habituer d'emblée à produire du code "propre", plus facilement lisible, quelque peu "optimisé"...

Du b a ba en la matière dans ton code :

Range(x).Select
Selection.Clearcontents
Il est mieux et plus simple : Range(x).Clearcontents

Range(x).Select
Selection.Copy
Range(y).Select
ActiveSheet.Paste
Il est mieux et plus simple : Range(x).Copy Range(y)

C'est pas bien sorcier, facile à écrire et à lire, plus rapide à l'exécution !

Il est aussi préférable de déclarer les variables que tu utilises, surtout quand tu en as qui sont déjà déclarées. Une variable non déclarée est toujours de type Variant, une variable déclarée te permet de choisir le type de données à y affecter et occupera souvent moins de place en mémoire. De plus, s'il convient mieux dans certains cas d'utiliser des variables de type Variant, c'est l'inverse dans d'autres et il est judicieux d'en faire consciemment le choix. Enfin, tu disposes d'une variable déclarée n et il est donc inutile de la laisser de côté pour utiliser des variables n1 à n5 non déclarées. n peut être utilisée successivement pour l'effacement de ton tableau antérieur, le dimensionnement de ton tableau pair et sa copie sur le tableau final après tirage et tri, le dimensionnement de ton tableau impair (là il te manquerait ensuite la définition de la ligne cible du tableau final pour laquelle il est loisible d'utiliser k)...

En ce qui concerne ton problème, tu te contentes de répéter ton post initial sans répondre aux questions ! On n'est donc pas plus avancé.

D'abord, tu dois bien voir que ta méthode de prérépartition en deux groupes (pair et impair) ne permet de répondre à tes conditions que si le groupe impair est égal à pair ou égal à pair +1. Il n'est donc pas évident de pouvoir ajuster dans tous les cas. Ensuite si le club le plus nombreux à plus de la moitié des participants +1, la condition ne pourra pas être totalement respectée, mais ce cas doit être rare sinon peu probable. En tout cas, il convient de trouver une autre méthode de prérépartition avant tirage pour assurer le respect de la condition...

D'où la question sur une liste d'inscriptions préalable à cette prérépartition : la réflexion sur le projet part de l'inscription des candidats. Question à laquelle tu n'as pas répondu.

Les compétiteurs Poussin, il n'y en a pas dans ton modèle. Je suppose donc que la mention Poussin sera indiquée en catégorie, mais où se trouve mentionné son représentant légal. Tu me renvoies la question ! Mais c'est toi qui doit avoir la réponse.

Pour répondre à ces conditions, les Poussins ne doivent pas être tirés, et leur sort est lié à celui du représentant. Pour garantir la condition de proximité, il y a lieu de faire une prérépartition par club et tirage ensuite dans chaque club. Il faut donc matérialiser la base de départ (liste des compétiteurs) à partir de laquelle on pourra voir quelles opérations intermédiaires permettront d'aboutir au résultat final recherché.

rchristian13
 Posté le 19/01/2015 à 12:10 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

Bonjour Ferrand,

Merci pour tes conseils.

Le tableau est alimenter manuellement au fur et à mesure des inscriptions

Le cas d'un club ayant plus de la moitié des participants est peux probable.

Pour les poussins je pensai mettre un colonne supplémentaire "Avec".

Bon je repense tout ça.

Merci et bonne journée.

Christian

ferrand
 Posté le 21/01/2015 à 10:54 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Bonjour,

Voilà une méthode répondant à tes conditions, susceptible donc de convenir : http://cjoint.com/?EAvlHvoPhFV

Un seul tableau, au départ les inscriptions peuvent être dans n'importe quel ordre, ici retrié par ordre alpha pour pouvoir retester la procédure de tirage.

J'ai rajouté un Poussin pour pouvoir tester cette condition et réservé la colonne 7 pour indiquer les rattachements de poussins, le plus simplement possible : pour le poussin on porte le n° licence de son représentant légal, et pour le représentant le n° licence du poussin. [Si cela doit se manifester par d'autres mentions, il conviendra de modifier les procédures en conséquence.]

Pour répondre à tes conditions, pas de tirage pour les poussins, ils seront replacés à la suite de leur représentant après tirage.

Pour répondre à la condition de ne pas avoir à la suite 2 compétiteurs du même club, on le garantit si on prépositionne les compétiteurs de chaque club (avec tirage de l'ordre dans lequel on prend les clubs), un tirage pour chacun permettant ensuite de remplir les positions définies.

On commence donc par monter un tableau (que j'ai appelé tcb) pour y recenser les clubs (1re colonne), le nombre de participants de chaque club (2e colonne) poussins exclus, on opére un tirage sur ces clubs (porté dans une 3e colonne) et on trie ce tableau pour mettre les clubs dans l'ordre. J'utilise le terme de colonne pour faciliter la visualisation, car ce tableau est établi en mémoire et n'apparaît pas sur une feuille. Les"colonnes" constituent la première dimension du tableau, car leur nombre est fixe, indicée de 0 à 2. Les "lignes" en constituent la 2e dimension, nombre variable selon le nombre de clubs représentés, indicée de 0 à nombre de clubs (ici 5). La "ligne" 0 est utilisée pour le tri après tirage, puis pour mémoriser des valeurs utilisées par la suite : tcb(0,0)= nombre de clubs, tcb(1,0)= nombre total de participants (hors poussins), tcb(2,0)= nombre de participants du club qui en présente le plus en compétition.

Si on matérialise ce tableau (après traitement) sur une feuille, on obtiendra ceci :

Pour la suite, on va à partir de là constituer un tableau de répartition des clubs (que j'ai appelé trc).

Pour éviter que le même club se retrouve sur 2 positions successives, si on liste par exemple les positions du club A dans une première colonne, on va lister ensuite les positions de clubs B, puis C... dans une 2e colonne à intercaler dans la première, puis on poursuit la liste dans une 3e colonne ; les positions finales des premiers de chaque colonne seront 1, 2, 3... s'il n'y a que 3 colonnes, le 2e de la première colonne prendra le 4, ainsi de suite. Mais pour que la condition soit respectée, il faut que la longueur des colonnes soit dimensionnée sur le nombre de compétiteurs qui en a le plus, de façon que chaque club puisse tenir entièrement dans une colonne.

Enfin, ces colonnes évoquées doivent être détriplées (une pour le n° d'ordre final, une autre pour indiquer le club, et une 3e réservée pour le compétiteur à placer sur cette position. Donc pour dimensionner le tableau trc : le nombre de "lignes" (2e dimension), fonction du club le plus représenté (ici 13, on conserve à par la "ligne" 0 pour des utilisations en cours de procédure) ; le nombre de "colonnes" (1re dimension), pour faire entrer tous les participants dans le tableau, sera le nombre total divisé par le nombre du club max. (on prend le quotient entier et on ajoute 1, ici 48\13=3, +1=4), nombre qu'on multiplie par 3 (pour pouvoir servir le tableau avec tous les éléments utiles, ici donc 12), on retranche 1 pour obtenir les indices voulus (0 à 11).

Le club étant porté sur la 2e "colonne" de chaque tryptique on va servir le tableau en listant les clubs dans l'ordre tiré précédemment en nombre correspondant à chacun à la suite dans la "colonne" d'indice 1, une fois cette "colonne" remplie on passe à la suivante (indice 4), puis la suivante (indice 7), jusqu'à épuisement des participants. On va ensuite affecter le numéro d'ordre final dans les "colonnes" d'indice 0, 3, 6, ... On numérote de 1 à nombre total de compétiteurs, "ligne" par "ligne" (ce qui intercale les éléments de chaque "colonne" club à la suite des éléments de même rang de la "colonne" club précédente). On ne numérote que si un club figure dans la colonne attenante.

A suivre...



Modifié par ferrand le 21/01/2015 11:24
ferrand
 Posté le 21/01/2015 à 11:18 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Suite...

Si on matérialise ce tableau trc après listage des clubs et numérotation, on obtiendrait ceci :

Les clubs sont listés dans l'ordre tiré avec le tableau précédent et on constate bien que 2 compétiteurs du même club ne pourront se retrouver côte à côte (suivre les numéros). Il ne reste plus qu'à faire un tirage parmi les compétiteurs de chaque club pour les inscrire dans ce tableau.

On va donc pour chaque club, tour à tour, établir un nouveau tableau (que j'ai appelé ttc) pour lequel 2 "colonnes" suffiront (0 et 1, la 1re pour y recenser les compétiteurs du club, poussins exclus, la 2e pour opérer le tirage et trier selon ce tirage). Le nombre de "lignes" est aligné sur le nombre de compétiteurs du club ("ligne" 0 réservée pour le tri). Pour identifier les compétiteurs, on se contentera du numéro de ligne dans la liste initiale, indication suffisante, et de plus directement utile pour reporter ultérieurement dans la liste son numéro d'ordre.

La matérialisation d'un tableau ttc donnerait ceci (je ne mets que le premier, les autres sont semblables) après tirage et tri :

Les identifiants des compétiteurs (n° de lignes en 1re "colonne") sont reportés ensuite dans le tableau tcr dans l'ordre des inscriptions pour ce club. De même pour les autres clubs.

Le tableau tcr complet résultant devient :

A suivre...

rchristian13
 Posté le 21/01/2015 à 11:31 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

Bonjour Ferrand,

Merci pour ce travail, je regarde ça ce soir. mais le premier coup d’œil me parai satisfaisante.

Dans ta macro "TirageListe" tu mets des lignes de commentaire : "à supprimer" pourquoi ?

Merci et bonne journée.

Christian

ferrand
 Posté le 21/01/2015 à 11:47 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Suite...

De ce tableau trc final, il n'y a plus qu'à porter à partir du numéro de ligne l'identifiant dans la liste ("colonnes" d'indices 2, 5, 8...), le numéro d'ordre correspondant ("colonnes" d'indices 0, 3, 6...) en colonne 8 (H) de la liste.

Il ne reste plus qu'à intégrer les poussins, on les détecte en parcourant la liste, lorsqu'on en trouve un, on recherche le représentant à partir du n° de licence du poussin (au moyen d'une fonction dédiée qui recherche ce n° licence en col. 7 et renvoie le numéro de ligne), on reprend le numéro d'ordre du représentant pour le poussin auquel on ajoute 0.5 afin qu'il soit classé à sa suite [en col. 8]. On trie la liste sur la colonne 8.

Les tableaux et n (dernière ligne de la liste) sont des variables déclarées au niveau module. Je pensais au départ moduler l'ensemble en diverses procédures et cela pouvait être avantageux, mais finalement une seule procédure principale utilise les tableaux, ils auraient donc pu être déclarés au niveau procédure. Une procédure auxiliaire assure le tirage et tri des tableaux qu'on lui envoie.

J'ai fait se matérialiser les tableaux sur une feuille complémentaire, de façon à comprendre exactement la méthode utilisée et ce qui se passe, lors de tests. Naturellement, ces parties de la procédure (encadrées par des lignes de pointillés) sont à supprimer...

ferrand
 Posté le 21/01/2015 à 11:57 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Astucien

Fin !

http://cjoint.com/?EAvmdgpmzOw

Le même épuré des éléments destinés à tester, avec ajustement numéros (pour éliminer décimales des poussins) après tri, et suppression des tableaux en fin de procédure (j'avais oublié, pas grave mais inutile les laisser en mémoire).

rchristian13
 Posté le 21/01/2015 à 15:33 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Nouvel astucien

Merci Fernand

Cela fonctionnne superbe bien.

Christian

Page : [1] 
Page 1 sur 1

Vous devez être connecté pour participer à la discussion.
Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !
Recevoir PC Astuces par e-mail


La Lettre quotidienne +226 000 inscrits
Avec l'actu, des logiciels, des applis, des astuces, des bons plans, ...

Les bonnes affaires
Une fois par semaine, un récap des meilleurs offres.

Les fonds d'écran
De jolies photos pour personnaliser votre bureau. Une fois par semaine.

Les nouveaux Bons Plans
Des notifications pour ne pas rater les bons plans publiés sur le site.

Les bons plans du moment PC Astuces

Tous les Bons Plans
Ecran portable 16 pouces AOSIMAN 160QC (WQHD+ 2560x1600, 120 Hz, IPS, USB-C, HDMI) à 129 €
129 € 200 € -36%
@Geekbuying
UGREEN DigiNest Cube 7 en 1 Multiprise USB (2 xUSB C, 2 xUSB A, 3 prises de courant) à 55,99 €
55,99 € 64,99 € -14%
@Amazon
Kit de 32 Go (2 x 16 Go) de mémoire DDR5 Corsair Vengeance RGB 6000 MHz CL30 à 114,99 €
114,99 € 142 € -19%
@Amazon
Processeur AMD Ryzen 5 5600X (6 coeurs, 3.7/4.6 GHz, AM4) à 99,99 €
99,99 € 150 € -33%
@Cdiscount
Rallonge électrique Zenitech 16A, 2x1.5mm² (sans terre) 25 mètres à 23,49 €
23,49 € 41 € -43%
@Amazon
Vélo électrique pliant ENGWE P1 (20 pouces, 250W, Shimano 7 vitesses, 100 km) + paniers à 599 €
599 € 800 € -25%
@Geekbuying

Sujets relatifs
Erreur date avec macro/ incapable d'ouvrir ailleurs que chez moi
se positionner avec une macro dans une cellule précise
Tirage au sort séléctif
Tirage au sort excel 2010
Macro supprimer ligne avec condition
Taille d'un fichier excessive avec une macro
copier des cellules avec une macro excel 2007
Calcul macro avec cellules nommées
Macro automatique en-tête avec logo
open/libre office et les fichiers excel avec macro
Plus de sujets relatifs à Tirage au sort avec macro
 > Tous les forums > Forum Bureautique