Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 changer aléatoire en boucle

franic

XLDnaute Nouveau
Je reviens vers vous avec ma liste de mots
Je me demande si il ne serais pas plus judicieux de faire tourner en boucle ma liste de mot plutôt que un tirage aléatoire ,car après m 'être entrainé hier plus d'une heure j' ai constaté que des mots étaient sorti 6,7,8 fois et plus de fois et plein d'autres aucune fois , normalement après une heure il me semble que chaque mot aurais du sortir au moins une fois .
Je ne sais pas si cela est possible car chaque fois que j 'ouvrirais le programme il ne faut pas qu'il débute par le même mot ,ou alors il faut qu 'il retienne ou il en était d'une fois à l 'autre,
ou commencer par un tirage aléatoire suivis d'une boucle à chaque ouverture de séance.

Encore merci d'avance.
 

Pièces jointes

  • Test Scrabble 2.xlsm
    22 KB · Affichages: 9

Dranreb

XLDnaute Barbatruc
Bonjour.
Il faudrait noter en colonne C par exemple, le fait qu'un numéro ait déjà été proposé, pour pouvoir faire en sorte qu'il ne repasse plus d'ici qu'au moins les deux tiers des autres mots disponibles soient passés. Si ça vous irait, récupérez le module de classe ListeAléat du classeur joint, car je n'ai pour l'instant pas l'intention de garder le classeur, je me contenterai de vous indiquer la Worksheet_SelectionChange appropriée du classeur équipé de ce module de classe.
 

Pièces jointes

  • ListeAléat.xlsm
    345.8 KB · Affichages: 7

franic

XLDnaute Nouveau
Rebonjour,
Excusez moi mais je ne comprend rien a votre listealeat je ne sais pas du tout quoi faire avec…. je crois que je préfèrerais un système en boucle.
Avec un système avec boucle j 'enregistrerai la feuille en la fermant comme cela quand je la réouvrirais la boucle continueras et j 'aurais vus tout les mots autant de fois qu'ils y auras eu de boucles,
merci beaucoup d'avance .
 

Dranreb

XLDnaute Barbatruc
Tant pis.
C'était à peu près ce que je voulais proposer, mais bien sûr si vous ne voulez faire aucun effort …
Ce n'était pourtant pas grand chose d'aller dans l'explorateur de projets, et de glisser/déplacer avec la souris le nom ListeAléat de la rubrique Modules de classe du VBAProject (ListeAléat.xlsm) vers le VBAProject de votre classeur.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Le problème en explorant toute la liste de mot en ordre aléatoire, c'est qu'arrivé à la fin, on est obligé de construire une nouvelle liste en ordre aléatoire différent, et les derniers mots de l'ancienne liste peuvent par hasard se retrouver parmi les premiers de la nouvelle, de sorte qu'ils peuvent être rapidement proposés à nouveau.
 

Dranreb

XLDnaute Barbatruc
Cela dit on peut se passer du module de classe ListeAléat pour simplement intervertir aléatoirement les lignes des colonnes A et B avant de recommencer le parcours à partir de la ligne 1, si vous voulez. Donc si ça ne vous gène pas que mot de la dernière ligne soit par hasard reproposé s'il se retrouve en ligne 1 après la nouvelle interversion. Mais pour des opérations plus complexes sur des listes aléatoires de numéros, j'ai besoin du module de classe ListeAléat.
 

Dranreb

XLDnaute Barbatruc
Un truc simple qui pourrait être fait, c'est de toujours prendre le 1er de la liste, puis de remontez celle ci sur un nombre de lignes aléatoire compris entre les 2 / 3 de la taille de la liste et toute sa taille, la ligne vacante laissée étant regarnie des valeurs extraites.
Si vous ne voulez pas changer l'ordre des 2 1ère colonnes de la liste, il serait possible de ne changer que leurs numéros de lignes portés dans une autre colonne, la C par exemple.
Le code à mettre dans le module Sheet1 (Feuil1) pour appliquer cette dernière solution est le suivant :
VB:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Dim Rng As Range, LMax As Long, TAl() As Long, L As Long, NbLig As Long
   Set Rng = Intersect(Me.[A1:C1000000], Me.UsedRange)
   LMax = Rng.Rows.Count
   Select Case Target.Address
      Case "$C$1": If VarType(Me.[C1].Value) = vbDouble Then If MsgBox("Voulez vous refaire la liste de numéros" _
         & vbLf & "de lignes en ordre aléatoire ?", vbYesNo, "Sélection C1") = vbNo Then Exit Sub
         InitListeAl TAl, LMax
         Rng.Columns(3).Value = WorksheetFunction.Transpose(TAl)
      Case "$F$9": If VarType(Me.[C1].Value) <> vbDouble Then MsgBox "Veuillez sélectionner la cellule C1 pour" _
         & vbLf & "y établir la liste aléatoire des numéros de lignes.", vbCritical, "Tirer les lettres": Exit Sub
         L = Me.[C1].Value: Target.Value = Rng(L, 2).Value
         With Me.[H9]: .NumberFormat = ";;;": .Value = Rng(L, 1).Value: End With
         NbLig = Int(LMax * (2 + Rnd) / 3)
         Rng(1, 3).Resize(NbLig).Value = Rng(2, 3).Resize(NbLig).Value
         Rng(NbLig + 1, 3).Value = L
      Case "$H$9": Target.NumberFormat = "General"
      End Select
   End Sub
Sub InitListeAl(TAl() As Long, Optional ByVal NMax As Long, Optional ByVal Graine As Double)
Rem. ——— Garnit un tableau à une dimension base 1 de numéros sans doublon ou change aléatoirement l'ordre
'        des numéros y étant déjà portés.
'  Arguments :
'     TAl :   Le tableau à traiter.
'     NMax:   Numéro maxi. Si spécifié, le tableau est redimensionné TAl(1 To NMax), puis garni de numéros de 1 à NMax.
'     Graine: Base de départ de la série. Si omis la série sera différente à chaque exécution.
   Dim P As Long, R As Long, X As Long
   If NMax >= 0 Then
      ReDim TAl(1 To NMax): For P = 1 To NMax: TAl(P) = P: Next P
   Else: NMax = UBound(TAl): End If
   If Graine <= 0 Then Randomize Else Rnd -1: Randomize Graine
   For P = NMax To 2 Step -1
      R = Int(Rnd * P) + 1: X = TAl(R): TAl(R) = TAl(P): TAl(P) = X
      Next P
   End Sub
N'utilise pas le module de classe ListeAléat.
 
Dernière édition:

franic

XLDnaute Nouveau
Merci de votre patience, mais c 'est pas que je ne veux pas faire d 'effort mais quand je me suis présenté j 'ai bien dis " je suis nul en informatique et ne connais pratiquement rien en excell" je connais les colonnes les lignes trier copier coler et des truc de débutant d'un jour, je ne sais pas ce que vous voulez dire n 'y que je fasse avec des " VBAProjec ou des Modules " je suis désol"é de vous avoir fait perdre votre temps , encore merci Juan
 

Dranreb

XLDnaute Barbatruc
Oui mais là c'est bon ?
Vous avez fait un clic droit sur l'onglet, puis Visualiser le code, enfin collé le code copié du poste #7.
Est-ce que le résultat vous plait ?
À part ça vous trouvez la liste des projets VBA ouverts suivis de leurs composants dans l'explorateur de projets de VBE. Vous l'y affichez par Ctrl+R s'il n'est pas déjà affiché, ce qui est rare quand même …
 

Dranreb

XLDnaute Barbatruc
Là je parlais de l'onglet Excel de la feuille, et vous indiquai la voie la plus courte pour accéder au module de l'objet Worksheet qui la représente.
Sinon c'est un double clic sur le nom du module dans l'explorateur de projets qui fait la même chose.
 

Discussions similaires

Réponses
1
Affichages
549
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…