Création feuilles de loto

ya_v_ka

XLDnaute Impliqué
Salut tout le monde

Y'a vraiment des trucs simples que je ne comprends toujours pas... d'où ma demande de ce jour :

Je cherche, pour la forme dans un premier temps, à créer des feuilles de loto "avec système"... c'est à dire des lots de 6 feuilles contenants une fois tous les numéros de 1 à 90, en respectant les autres conditions obligatoires de ce jeu.
Comme déjà rien qu'avec la distribution aléatoire j'ai de la peine... vous comprendrez aisement que je suis completement bloqué avec lesdites conditions...
Et bien que je pense que c'est réalisable en formule, je me suis lancé dans le VBA... mais sans succès aucun !

Alors si quelqu'un a un début de piste à me proposer... je lui en suis d'ores et déjà reconnaissant.

Merci d'avance à ceux qui se penchent (sans tomber !) sur la question.

Ya'v
 

Pièces jointes

  • loto.xlsx
    10.6 KB · Affichages: 3 338
  • loto.xlsx
    10.6 KB · Affichages: 3 632
  • loto.xlsx
    10.6 KB · Affichages: 3 623

ya_v_ka

XLDnaute Impliqué
Re : Création feuilles de loto

Hello

Merci... mais j'aurais du préciser aussi qu'avant de poster j'ai passé 2 heures à chercher sur le net, dont au moins la moitié sur XLD...

Le lien que tu me conseille fait exactement... autre chose que ce que je cherche. C'est à dire que ce fichier effectue le tirage du loto alors que je cherche à créer les cartes de loto, par bloc de 6, comme expliqué.

;-) Ya'v
 

JCGL

XLDnaute Barbatruc
Re : Création feuilles de loto

Bonjour à tous,

Un fichier trouvé sur VériTi avec des codes de Ti et de Marco57.

Juste pour te donner des idées...

A + à tous
 

Pièces jointes

  • Grille Loto Report Tempo Marco.xls
    174 KB · Affichages: 1 842

KenDev

XLDnaute Impliqué
Re : Création feuilles de loto

Bonsoir Yavka, Staple, JCGL,

Une possibilité dans le classeur joint. Les 6 grilles sont générées sur une nouvelle feuille. Cordialement

KD

Edit : voir post 10.
 

Pièces jointes

  • Classeur1.xls
    38.5 KB · Affichages: 1 388
  • Classeur1.xls
    38.5 KB · Affichages: 1 621
  • Classeur1.xls
    38.5 KB · Affichages: 1 632
Dernière édition:

ya_v_ka

XLDnaute Impliqué
Re : Création feuilles de loto

Hello

Pour commencer, Merci de vous être penché sur ma question.

Staple : J'avais déjà ouvert ce fichier une fois... mais même en achetant le logiciel, il ne fera pas ce que je cherche...

JCGL : Si j'ai bien compris, ce programme reprend toujours les mêmes grilles, préprogrammées sur la 2e feuille ?

KenDev : Superbe, joli entrelaçage de boucles... auquel je ne comprends malheureusement rien. Mais il y a une condition qui n'est pas prise en compte. Ton code crée 6 grilles de loto traditionnelles (sauf les dizaines 10,20,..,80 qui sont dans la mauvaise colonne... un détail) totalement indépendantes. L'idée est de créer 6 grilles qui combinées n'utilisent ensemble qu'une fois chaque nombre de 1 à 90 (6 cartes à 15 numéros = 90). A chaque numéro tiré on est sûr de marquer une case... et une seule !
En plus j'ai de la peine à comprendre la déclaration des variables ???

Perso je pensais répartir aléatoirement les nombres dans les colonnes en commençant par les unités... puis vérifier qu'il n'y ait pas plus de 5 entrées par ligne... mais avec l'aléatoire je coince... et si je me trouve à remplir la colonne des 8x et qu'une ligne ne comporte encore que 3 nombres je suis planté !!!?!

Merci encore mais je reste pour l'instant un peu bloqué...

Ya'v
 

KenDev

XLDnaute Impliqué
Re : Création feuilles de loto

Bonsoir à tous,

@ Yava :
"Ton code crée 6 grilles de loto traditionnelles (sauf les dizaines 10,20,..,80 qui sont dans la mauvaise colonne... un détail) totalement indépendantes. L'idée est de créer 6 grilles qui combinées n'utilisent ensemble qu'une fois chaque nombre de 1 à 90 (6 cartes à 15 numéros = 90)"

Ah oui... J'avais pas fait gaffe à cette conditions, mes grilles sont toutes indépendantes en effet. Par contre j'avais fait exprès pour les dizaines, je trouvais bizarre qu'il y ai 9 nombres pour la 1ère colonne, 10 de la 2ème à la 7 ème et 11 pour la dernière. Je ne suis pas un spécialiste du loto... :) Je m'y remet (sans garanties).

Cordialement

KD
 

KenDev

XLDnaute Impliqué
Re : Création feuilles de loto

Re,

Un nouvel essai ci-joint. Cordialement

KD

ps : dim x% est équivalent à dim x as integer, #->double, &->long, $->string, !->single
(... merci à ROGER2327 ...)

Edit : suppression du code, voir message suivant
 

Pièces jointes

  • Classeur2.xls
    40 KB · Affichages: 1 152
  • Classeur2.xls
    40 KB · Affichages: 1 070
  • Classeur2.xls
    40 KB · Affichages: 854
Dernière édition:

KenDev

XLDnaute Impliqué
Re : Création feuilles de loto

Bonjour à tous,

Une nouvelle version. La version du post précédent fonctionne mais à tendance à tasser vers la droite les n° à cause des
_'à partir de la 5ème colonne vérifier qu'il n'y ai au moins (n° de la colonne-4) valeurs
et
_'à partir de la 6ème colonne vérifier qu'il n'y ai pas déjà 5 valeur sur cette ligne
qui fausse l'aléatoire.

Cette nouvelle version ne fait pas de compromis :) pour autant que je puisse m'en rendre compte et pour autant que la fonction Rnd le permette.

Cordialement

KD

VB:
Option Explicit

Sub Grille_Loto() 'trops long
    Dim i%, v#, Rg As Range, j%, k%, n%, c1&, c2%, t%(), b%
    
    Application.ScreenUpdating = False
    Sheets.Add
    Randomize
    
Line1:
    
    Cells.ClearContents 'tout effacer si on revient pour la 2ème fois (3ème etc...)
    
    'donner une valeur aléatoire à chaque case
    For i = 1 To 18
        For j = 1 To 9
            Cells(i, j) = Rnd
        Next j
    Next i
    
    'sélectionner 90 cases avec le bon nombre par colonnes
    For j = 1 To 9 'par colonne
        'nombres de cases devant contenir des nombres selon la colonne
        Select Case j
            Case 1
                n = 9
            Case 2 To 8
                n = 10
            Case 9
                n = 11
        End Select
        Set Rg = Range(Cells(1, j), Cells(18, j)) 'plage colonne
        v = WorksheetFunction.Large(Rg, n) 'trouver nième valeur de la colonne
        If WorksheetFunction.CountIf(Rg, v) <> 1 Then GoTo Line1 'si elle est en double recommencer
        For i = 1 To 18 'par lignes
            If Cells(i, j) < v Then Cells(i, j) = "" 'si la valeur de la cellule < nième valeur, effacer la case
        Next i
    Next j
    
    'équilibrer les lignes par tirage au sort
    For i = 1 To 18 'par lignes
        b = 0 'compteur
        Do
            Set Rg = Range(Cells(i, 1), Cells(i, 9)) 'plage ligne
            c1 = WorksheetFunction.Count(Rg) 'nombre de cases par ligne
            'selon le nombre de cases par ligne
            Select Case c1
                Case Is < 5 'il en manque
                    c2 = Int((9 - c1) * Rnd + 1) 'tirer au sort la case vide à requalifier
                    c1 = 0 'compteur
                    For j = 1 To 9 'par colonne
                        If Cells(i, j) = "" Then c1 = c1 + 1 'si la case est vide, la compter
                        If c2 = c1 Then 'si correspond au tirage c'est cette case à requalifier
                            Exit For 'sortir de la boucle (la case à requalifier est en colonne j)
                        End If
                    Next j
                    c2 = 0 'compteur
                    For k = i + 1 To 18 'par lignes suivantes
                        'si la ligne a des cases en trops et si la cellule de même colonne que la case à requalifier est non vide
                        If WorksheetFunction.Count(Range(Cells(k, 1), Cells(k, 9))) > 5 And Cells(k, j) <> "" Then
                            c2 = c2 + 1 'la compter
                            'tableau des cases candidates au déplacement
                            If c2 = 1 Then
                                ReDim t(1 To 1)
                            Else
                                ReDim Preserve t(1 To c2)
                            End If
                            t(c2) = k 'la valeur du tableau vaut la ligne de la case candidate
                        End If
                    Next k
                    c1 = Int(c2 * Rnd + 1) 'tirage au sort de la ligne
                    Cells(i, j) = Cells(t(c1), j) 'la case requalifiée prend la valeur de la case tirée au sort
                    Cells(t(c1), j) = "" 'la case tirée au sort devient vide
                Case Is > 5 'y'en a trops (opérations inverse)
                    c2 = Int(c1 * Rnd + 1)
                    c1 = 0
                    For j = 1 To 9
                        If Cells(i, j) <> "" Then c1 = c1 + 1
                        If c2 = c1 Then
                            Exit For
                        End If
                    Next j
                    c2 = 0
                    For k = i + 1 To 18
                        If WorksheetFunction.Count(Range(Cells(k, 1), Cells(k, 9))) < 5 And Cells(k, j) = "" Then
                            c2 = c2 + 1
                            If c2 = 1 Then
                                ReDim t(1 To 1)
                            Else
                                ReDim Preserve t(1 To c2)
                            End If
                            t(c2) = k
                        End If
                    Next k
                    c1 = Int(c2 * Rnd + 1)
                    Cells(t(c1), j) = Cells(i, j)
                    Cells(i, j) = ""
            End Select
            b = b + 1
            If b > 5 Then GoTo Line1 'tout refaire si cette boucle est faite plus de 5 fois pour cette ligne
        Loop Until WorksheetFunction.Count(Rg) = 5 'recommencer cette opération si l'ajout ou le retrait n'a pas encore amené le nombre de cases à 5 pour cette ligne
    Next i
    
    For j = 1 To 9 'par colonne
        Select Case j
            'tableau contenant autant de valeurs que de cases par colonne
            Case 1
                ReDim t(1 To 9)
            Case 2 To 8
                ReDim t(1 To 10)
            Case 9
                ReDim t(1 To 11)
        End Select
        c1 = 0 'compteur
        For i = 1 To 18 'par lignes
            If Cells(i, j) <> "" Then 'si la cellule est valide
                c1 = c1 + 1 'la compter
                'donner à la valeur du tableau le rang de la valeur de la case selon la colonne
                t(c1) = 10 * (j - 1) + UBound(t) - WorksheetFunction.Rank(Cells(i, j), Range(Cells(1, j), Cells(18, j)))
                If j = 1 Then t(c1) = t(c1) + 1 'cas particulier 1ere colonne
            End If
        Next i
        c1 = 0 'compteur
        For i = 1 To 18 'par ligne
            If Cells(i, j) <> "" Then 'si la cellule est valide
                c1 = c1 + 1 'la compter
                Cells(i, j) = t(c1) 'remplacer la valeur par le rang
            End If
        Next i
    Next j
   
    'Fioritures
    ...........
    
Application.ScreenUpdating = True
    
End Sub
 

Pièces jointes

  • Classeur3.xls
    47 KB · Affichages: 882
  • Classeur3.xls
    47 KB · Affichages: 932
  • Classeur3.xls
    47 KB · Affichages: 987

ya_v_ka

XLDnaute Impliqué
Re : Création feuilles de loto

Hello

Alors là chapeau, je suis scotché une fois encore. Uns seule chose à dire SUPERBE !

Maintenant je vais m'attaquer à essayer de comprendre la manière...

Merci aussi pour le rappel des déclarations de variables... j'avais vu ça une fois mais ne me souvenais plus.

Un enorme MERCI et mes félicitations

Ya'v
 

CBernardT

XLDnaute Barbatruc
Re : Création feuilles de loto

Bonsoir à tous,

Une nouvelle version de tirage aléatoire de plaque de six cartons de loto traditionnel avec les 90 numéros.

Deux feuilles donnant la possibilité de choisir la configuration des cartons de la plaque, soit des cartons à deux numéros maximum par colonne soit des cartons à trois numéros par colonne.

Techniquement, l’algorithme calcule la plaque de six cartons de façon totalement aléatoire (colonne, ligne, numéros). Les boucles Do..Loop comportent des sorties (Reprise) pour éviter les plantages éventuels.

Les couleurs des cellules vides sont obtenues par mise en forme conditionnelle.
 

Pièces jointes

  • TiragePlaqueLotoTraditionnel.xls
    73.5 KB · Affichages: 1 507
Dernière édition:

ya_v_ka

XLDnaute Impliqué
Re : Création feuilles de loto

Rebonjour tous

Après essai concluant du code de KenDev, je dois malheureusement faire part d'un petit souci. En effet environ 1 feuille sur 10 se crée avec seulement 89 numéros, donc une carte "trichant" avec 14 tirages au lieu de 15.
J'ai personnellement contourné ce problème en ajoutant au code un contrôle final sous forme de formule, sur chaque ligne et chaque colonne. Ainsi toute feuille ne répondant pas aux exigeances est directement éliminée. Du coup le code fonctionne parfaitement en ne créant que des feuilles valides. MERCI encore.

CBernardT, je n'ai pas encore testé, mais je dois déjà avouer que j'ai l'impression de mieux saisir le code, bien que je ne comprenne pas grand chose à l'aléatoire... j'y arriverais un jour, j'y arriverais !

Et j'ai vu qu'entre temps, un autre post s'est ouvert sur un sujet très proche... ça me rassure, je me sens moins seul ! ;-)

En tous cas BRAVO et MERCI à tous ceux qui cherchent et trouvent des pistes et/ou solutions.

Amicalement

Ya'v
 

KenDev

XLDnaute Impliqué
Re : Création feuilles de loto

Bonjour le fil, Ya_v_ka,

Ah bon si on a pas le droit de tricher alors... :p

Pour corriger ce cas de figure et l'intercepter au plus tôt rajouter juste avant cette ligne :
Code:
c1 = Int(c2 * Rnd + 1)
cette ligne :
Code:
If c2 = 0 Then GoTo Line1
(A deux endroits dans le code). Cordialement

KD
 

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 077
Membres
103 455
dernier inscrit
saramachado