XL 2019 Tirage au sort

gg13

XLDnaute Occasionnel
Bonjour,

Je reviens sur une macro de tirage au sort de la semaine dernière.
Après discussion et importante aide le résultat est sur le fichier joint.
Je voudrais ajouter une condition mais mes test ‘’buggent’’ tous.

Sur la liste des nombres en AA une ligne au hasard ne doit pas apparaitre
dans ce cas c’est AA10 soit la valeur de la cellule E4.

Mais pour le tirage au sort en BB c’est la même ligne qui doit être vide
soit la cellule BB10 or c’est la BB16 qui est vide.

Question : comment modifier la macro pour que seule BB10 soit vide
et le tirage au sort effectué dans les autres cellules.

Merci si vous connaissez la réponse.

GG13
 

Pièces jointes

  • TS1.xlsm
    82 KB · Affichages: 26

gg13

XLDnaute Occasionnel
Dranreb
Oui les chiffres colonne A doivent être différents de la colonne B sur la même ligne.
Mais merci à tous je relancerai la macro jusqu'à ce que la condition soit remplie.
Je suis surpris qu'une macro aussi courte fasse le job par contre elle comporte beaucoup de termes inconnus pour moi.
Bonne soirée
GG13
 

gg13

XLDnaute Occasionnel
Dranreb
Oui les chiffres colonne A doivent être différents de la colonne B sur la même ligne.
Mais merci à tous je relancerai la macro jusqu'à ce que la condition soit remplie.
Je suis surpris qu'une macro aussi courte fasse le job par contre elle comporte beaucoup de termes inconnus pour moi.
Bonne soirée
GG13
 

Dranreb

XLDnaute Barbatruc
Cette version réduit le risque, mais ne l'élimine pas tout à fait, en particulier si le dernier numéro est à la fin.
Quels termes sont inconnus pour vous ?
Avez vous vérifié si ce ne sont pas des noms de méthodes documentées dans le module de classe ListeAléat ?
 

Pièces jointes

  • ListeAléatGg13.xlsm
    61.4 KB · Affichages: 3

gg13

XLDnaute Occasionnel
Bonjour,
Cette version me va très bien merci.
Par contre quand je veux la copier pour l'intégrer dans mon programme ça coince.
Je ne vois pas de Feuil2 dans les onglets !

Et si je remplace Feuil2 par Sheet("Tirage_sort") ça ne marche pas .

Cà bugge aussi sur même pour New ListeAléat et je ne sais pas pour la suite.

---------------------------------------------------------------
Sub Tirage_sort2()
Dim LMax As Long, N°Maxi As Long, N°Omis As Long, T(), L As Long, P As Long, A As Long

' LMax = Feuil2.[E1].Value
LMax = Sheet("Tirage_sort").[E1].Value

'N°Maxi = Feuil2.[E2].Value

N°Maxi = Sheet("Tirage_sort").[E2].Value
N°Omis = Sheet("Tirage_sort").[E4].Value
Randomize
ReDim T(1 To LMax, 1 To 2)
With New ListeAléat
.Init N°Maxi
.Supprimer N°Omis
For L = 1 To LMax
If L <> N°Omis Then
For P = 1 To .Count
A = .Aléat(P): If A <> L Then Exit For
Next P
.Supprimer A
T(L, 1) = L: T(L, 2) = A
End If
Next L
Feuil2.Columns("A:B").ClearContents
Feuil2.[A1].Resize(LMax, 2).Value = T
End With
End Sub


GG13
 

Dranreb

XLDnaute Barbatruc
Prenez le nom de l'objet Worksheet représentant la feuille à traiter. Vous le trouverez dans la rubrique "Microsoft Excel Objets" du projet VBA. Le nom de l'entité Excel dont il assume la représentation dans VBA est indiqué à sa droite entre parenthèses. Comme ça pas besoin de le chercher dans la collection Sheets du classeur actif.
Avez vous glissé/déposé le module de classe ListeAléat dans ce projet ?
Rappel: j'aimerais savoir à quoi ça va servir, tout ça. J'ai bien le droit de savoir, après toutes les bribes de solution que je vous propose, non ?
J'attends aussi toujours que vous posiez enfin des questions à propos de ce que vous ne comprenez pas.
VBA est un langage orienté objets. Vous serez toujours handicapé si vous ne comprenez rien à cette notion. Presque tout n'est qu'objets, donc classes dans beaucoup de bibliothèques, surtout la Excel. Jetez un coup d'oeil à l'explorateur d'objets (touche F2).
 

Dranreb

XLDnaute Barbatruc
Utilisez la commande </> Code pour mentionner, comme ci dessous, du code dans un message.
Cette version de la procédure n'essaierait plus imparfaitement de s'accomoder du tirage donné par .Init mais le recommencerait carrément au cas où un numéro apparaissait à son rang :
VB:
 Sub Tirage_sort2()
   Dim LMax As Long, N°Maxi As Long, N°Omis As Long, T(), L As Long, A As Long
   LMax = Feuil2.[E1].Value
   N°Maxi = Feuil2.[E2].Value
   N°Omis = Feuil2.[E4].Value
   Randomize
   ReDim T(1 To LMax, 1 To 2)
   With New ListeAléat
      Do While L <= LMax
         .Init N°Maxi
         .Supprimer N°Omis
         For L = 1 To LMax
            If L <> N°Omis Then
               A = .Aléat: If A = L Then Exit For
               .Supprimer A
               T(L, 1) = L: T(L, 2) = A
               End If
            Next L
         Loop
      End With
   Feuil2.Columns("A:B").ClearContents
   Feuil2.[A1].Resize(LMax, 2).Value = T
   End Sub
 

gg13

XLDnaute Occasionnel
Danreb

Si vous me disiez enfin à quoi ça devra servir, j'aurais peut être une solution qui s'occuperait de tout


C'est pour un tirage au sort de partie de pétanque en triplette (puis doublette après)
3 équipes se rencontres. ( pour une association)

La composition des équipes est aléatoire.
Les 3 rencontres sont aussi aléatoires aucune des équipes ne se rencontrent 2 fois
Le problème est que suivant le nombre d’équipes inscrites, une peut être en attente
et ne pas jouer. (on considère qu’elle gagne)

C’est le cas de ma demande. Ex : si 7 équipes
1 partie la 7 ne joue pas
1 partie la 5 ne joue pas
1 partie la 3 ne joue pas

Equipes
Partie 1​
Equipes
Partie 2​
Equipes
Partie 3​
1​
6​
1​
4​
1​
7​
2​
5​
2​
3​
2​
6​
3​
4​
3​
1​
3
0
4​
3​
4​
2​
4​
5​
5​
2​
5
0
5​
4​
6​
1​
6​
7​
6​
2​
7
0
7​
6​
7​
1​
8​
8​
8​
9​
9​
9​
10​
10​
10​




La macro actuelle est pour 1 partie donc après les 3 calculs, je pense contrôler si aucune équipe ne se rencontre 2 fois sinon je relance le calcul en itération jusqu’au bon résultat.
(L’exemple est fait manuellement pas avec la macro)
J’espère avoir été plus clair.

GG13
 

Dranreb

XLDnaute Barbatruc
Je commençais à m'en douter figurez vous.
Regardez la feuille "3 contre 3" de ce classeur. N'est-ce pas une base de travail plus solide ?

Remarque; si les équipes sont fixées une fois pour toutes au début ça se ramène à un tournoi "1 contre 1".
 

Pièces jointes

  • ListeAléat.xlsm
    418.6 KB · Affichages: 4
Dernière édition:

gg13

XLDnaute Occasionnel
Danreb
Je reponds à vos questions
--------------------------------------------------------------------
Prenez le nom de l'objet Worksheet représentant la feuille à traiter. Vous le trouverez dans la rubrique "Microsoft Excel Objets" du projet VBA.

Dans mon cas c'est Feuil8
mais ça bugge après sur randomise
------------------------------------------------------------------------
Avez vous glissé/déposé le module de classe ListeAléat dans ce projet ?

Oui copié et renommé identique
----------------------------------------------------------------------------
Rappel: j'aimerais savoir à quoi ça va servir, tout ça. J'ai bien le droit de savoir, après toutes les bribes de solution que je vous propose, non ?
Merci encore de votre aide dans le post précédent j'ai répondu à votre demande en espérant avoir été clair.
---------------------------------------------------------------------------
J'attends aussi toujours que vous posiez enfin des questions à propos de ce que vous ne comprenez pas.
VBA est un langage orienté objets. Vous serez toujours handicapé si vous ne comprenez rien à cette notion. Presque tout n'est qu'objets, donc classes dans beaucoup de bibliothèques, surtout la Excel. Jetez un coup d'oeil à l'explorateur d'objets (touche F2).


J'ai souvent fait des programmes en VBA ( début dans les années 90 ) mais pas en utilisant toutes ces formules complexes, je ne sais pas si elles existaient à l'époque.
J'ai donc continué avec cette habitude.
Je vais jetter coup d'oeil à l'explorateur d'objets (touche F2).

GG13
 

Dranreb

XLDnaute Barbatruc
Il n'y aurais pas eu à le renommer si au lieu de copier coller le code, vous aviez glissé/déposé le module dans l'explorateur de projets. Auriez vous collé le code dans un module standard au lieu d'un module de classe ?
VBA est dérivé de VB6. Les objets y ont toujours existé. VBA offre simplement des facilité pour une application hôte à y installer des objets représentant ses entités.
 

gg13

XLDnaute Occasionnel
Danreb

Regardez la feuille "3 contre 3" de ce classeur. N'est-ce pas une base de travail plus solide ?
Je l'ai déjà consulté plusieurs fois .
Je n'ai pas besoin de l'ensemble du programme.

C'est un travail formidable, mais il est difficile (pour moi) de sortir les éléments nécessaires pour les incorporer
dans mon programme.
Chaque fois que j'utilise une partie du code ça bugge.
 

Dranreb

XLDnaute Barbatruc
Si le "3 contre 3" est conforme à vos besoin, seul le module standard MTirage3vs3 est nécessaire en plus de l'UFmVisu, XPlanificateur et classes Planification et bien sûr ListeAléat. Le code du module Wsh3vs3 (3 contre 3) est à refaire selon vos besoins.
Je veux bien faire les installations nécessaires si vous joignez votre vrai classeur.
 

gg13

XLDnaute Occasionnel
En fait je dois prévoir : pour triplettes et doublettes

- tirage équipes fixes à la mêlée en 3 parties avec tirage aléatoire
- tirage équipes tournantes à la mêlée en 3 parties avec tirage aléatoire

Merci pour la proposition d’aide car je suppose que cela représente beaucoup de temps et de travail.

La dernière version proposée est suffisante pour moi elle fonctionne très bien, je l’ai intégrée dans mon programme cette fois sans bug et je préfère ne pas trop ajouter des macro compliquées si possible.

Juste un petit complément dans le calcul est-il possible à la fin de remettre dans sa colonne
le Numéro non restitué 8 dans ce cas en A8 et aussi 0 e B8.


Sinon je peux le prévoir après la macro.

(C’est pour le contrôle final après les 3 tirages)
TS1.jpg


Je joins la dernière proposition qui fonctionne.

Merci
GG13
 

Pièces jointes

  • 3-ListeAléatGg13.xlsm
    58.4 KB · Affichages: 3

Dranreb

XLDnaute Barbatruc
Tiens vous n'avez pas retenu les modifs indiquées au #22 qui automatisent en somme l'action manuelle que vous indiquiez au #17 ?
Ces dernières modif sont facile à faire, quand même :
Remettre T(L, 1) = L même quand L = N°Omis mais dans ce cas seulement T(L, 2) = 0.
 

Membres actuellement en ligne

Statistiques des forums

Discussions
313 283
Messages
2 096 813
Membres
106 752
dernier inscrit
Tahiri1976