XL 2021 tirage aléatoire

Bruce68

XLDnaute Impliqué
Bonjour à tous
j'au créé un fichier excel pour extraire aléatoirement des chiffres que je veux ranger dans 10 colonnes .adjacentes.
quand la première colonne de 10 chiffres est pleine je veux passer à la suivante ainsi de suite, mais voilà je ne suis pas tellement copain avec for next, j'ai démarrer la macro ,maintenant je bute pour changer de colonne je cherche de l'aide pour la continuer.
je vous remercie de votre aide.
fichier ci joint
 

Pièces jointes

  • Nom_alea.xlsm
    19.7 KB · Affichages: 10

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Bruce,
Un essai en PJ avec :
Code:
Sub Num_alea1()
    Dim nombAleatoire%, L%, C%, N%
    Randomize
    'Nombre aléatoire entier entre 1 et 9___0 :
    nombAleatoire = Int(90 * Rnd) + 1
    MsgBox nombAleatoire
    ' Nombre de nombres déjà entrés
    N = Application.CountIf([B2:K11], ">0")
    ' On sort si le tableau est plein
    If N = 100 Then Exit Sub
    ' Détermination des lignes et colonnes de la première case vide
    C = Int(N / 10)
    L = N - 10 * C
    ' Calcul de L et C car le tableauc commence en 2,2 et non en 0,0
    C = C + 2: L = L + 2
    ' rangement du nombre
    Cells(L, C) = nombAleatoire
End Sub
 

Pièces jointes

  • Nom_alea.xlsm
    16.6 KB · Affichages: 4

job75

XLDnaute Barbatruc
Bonsoir à tous,

Pourquoi pas tout simplement, sans MsgBox inutile :
VB:
Sub Num_alea1()
    Randomize
    On Error Resume Next
    [B2:K11].Find("", [K11], , , xlByColumns, xlNext) = Int(90 * Rnd) + 1
End Sub
A+
 

Pièces jointes

  • Nom_alea(1).xlsm
    18.6 KB · Affichages: 6

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir à tous,

Pour le fun...

Trois procédures (au choix) pour remplir le tableau :
  • Num_alea1() => nombres aléatoires de 1 à 90 avec possiblement des doublons n'importe où
  • Num_alea2() => nombres aléatoires de 1 à 90 avec possiblement des doublons mais dans chaque colonne il n'y a aucun doublon
  • Num_alea3() => nombres aléatoires de 1 à 100 sans aucun doublon
Cliquez sur un des trois bouton.

A la place de la msgbox, une tempo pour faire joli :p . La vitesse d'affichage est ajustable via la constante ntempo en début de code (ntempo = 0 correspond à la vitesse la plus rapide).

Version v1a : correction mineure, l'intitulé dans la cellule M1 a été modifié.

Le code dans Module1 :
VB:
Const ntempo = 40

Sub Num_alea1()
' nombre aléatoire avec possiblement des doublons y.c. dans chaque colonne
Dim x, y
   Range("b2:k11").ClearContents
   Randomize
   For Each x In Range("b2:k11").Columns
      For Each y In x.Cells
         y.Value = 1 + Int(90 * Rnd)
         tempo ntempo
      Next y
   Next x
End Sub

Sub Num_alea2()
' nombres aléatoires  de 1 à 90 avec possiblement des doublons
' mais dans chaque colonne, il n'y a aucun doublon
Dim x, y, t(1 To 90), i&, j&, aux
   Range("b2:k11").ClearContents
   Randomize
   For i = 1 To 90: t(i) = i: Next
   For Each x In Range("b2:k11").Columns
      For i = 1 To 90: j = 1 + Int(Rnd * 90): aux = t(i): t(i) = t(j): t(j) = aux: Next
      i = 0
      For Each y In x.Cells: i = i + 1: y.Value = t(i): tempo ntempo: Next
   Next x
End Sub

Sub Num_alea3()
Dim x, y, t(1 To 100), i&, j&, aux
' nombre aléatoire avec aucun doublon dans le tableau
' tirage des nombres entre 1 et 100
   Range("b2:k11").ClearContents
   Randomize
   For i = 1 To 100: t(i) = i: Next
   For i = 1 To 100: j = 1 + Int(Rnd * 90): aux = t(i): t(i) = t(j): t(j) = aux: Next
   i = 0
   For Each x In Range("b2:k11").Columns
      For Each y In x.Cells: i = i + 1: y.Value = t(i): tempo ntempo: Next
   Next x
End Sub

Sub tempo(n&)
Dim i&, j&
   For i = 1 To n: For j = 1 To n: DoEvents: Next j, i
End Sub
 

Pièces jointes

  • Bruce68- tirage aléatoire- v1.xlsm
    24.5 KB · Affichages: 7
  • Bruce68- tirage aléatoire- v1a.xlsm
    24.5 KB · Affichages: 3
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re à tous :),

J'ai essayé d'être un peu original :rolleyes:. Une méthode sans réitération de tirage pour éliminer les doublons des colonnes avec lecture directe du prochain numéro à afficher. C'est la première fois que je l'utilise. Chaque colonne n'a aucun doublon. Bon, c'est un peu pour mon fun.

On réinitialise le tirage si la grille est vide ou si la grille est pleine (sur demande dans ce cas).
VB:
Sub Num_alea2()
' nombres aléatoires  de 1 à 90 avec possiblement des doublons
' mais dans chaque colonne, il n'y a aucun doublon
Dim raz, pro, tir, t(1 To 90), r(1 To 10, 1 To 10), i&, j&, aux, k&
   i = Application.CountA(Range("b2:k11"))
   If i = 100 Then raz = MsgBox("La grille est complète, voulez-effacer le tirage et recommencer ?", vbYesNo)
   If raz = vbNo Then Exit Sub
   pro = [prochain]: tir = [tirage]: i = Application.CountA(Range("b2:k11"))
   If IsError([prochain]) Or IsError(tir) Or i = 0 Or i = 100 Then
      Range("b2:k11").ClearContents
      Randomize
      For i = 1 To 90: t(i) = i: Next
      For k = 1 To 10
         For i = 1 To 90: j = 1 + Int(Rnd * 90): aux = t(i): t(i) = t(j): t(j) = aux: Next
         For i = 1 To 10: r(i, k) = t(i): Next
      Next k
      ThisWorkbook.Names.Add "tirage", r
      ThisWorkbook.Names.Add "prochain", 1
   End If
   pro = [prochain] - 1: tir = [tirage]
   Range("b2:k11")(1, 1).Offset(pro Mod 10, Int(pro / 10)) = tir(1 + pro Mod 10, 1 + Int(pro / 10))
   ThisWorkbook.Names.Add "prochain", [prochain] + 1
End Sub
 

Pièces jointes

  • Bruce68- tirage aléatoire- v2.xlsm
    23 KB · Affichages: 8

job75

XLDnaute Barbatruc
Bonjour le forum,

Rien d'original dans cette macro :
VB:
Sub Num_alea1()
'évite les doublons dans une colonne
Dim P As Range, c As Range, r%
    Randomize
    On Error Resume Next
    Set P = [B2:K11]
    Set c = P.Find("", P(P.Rows.Count, P.Columns.Count), , , xlByColumns, xlNext)
    Do
        r = Int(90 * Rnd) + 1
    Loop While Application.CountIf(Intersect(c.EntireColumn, P), r)
    c = r
End Sub
A+
 

Pièces jointes

  • Nom_alea(2).xlsm
    19.8 KB · Affichages: 3

job75

XLDnaute Barbatruc
Si l'on veut éviter que des doublons soient entrés manuellement dans une colonne du tableau mettre cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
'évite les doublons dans une colonne du tableau
    Set Target = Intersect(Target, Range(adr))
    If Target Is Nothing Then Exit Sub
    Application.EnableEvents = False
    For Each Target In Target
        If Application.CountIf(Intersect(Target.EntireColumn, Range(adr)), Target) > 1 Then Target = ""
    Next
    Application.EnableEvents = True
End Sub
Et pour la macro du bouton dans Module1 :
VB:
Public Const adr As String = "B2:K11"'mémorise la variable

Sub Num_alea1()
Dim r As Range
    Randomize
    On Error Resume Next
    Set r = Range(adr)
    Set r = r.Find("", r(r.Rows.Count, r.Columns.Count), , , xlByColumns, xlNext)
    Do
        r = Int(90 * Rnd) + 1
    Loop While r = ""
End Sub
 

Pièces jointes

  • Nom_alea(3).xlsm
    21.8 KB · Affichages: 4

Bruce68

XLDnaute Impliqué
Bonsoir à tous
pour mapomme
J'ai essayé la macro
  • Num_alea3() => nombres aléatoires de 1 à 100 sans aucun doublon
  • la macro ne demarre pas elle s' arrette sur ntempo: next car je voudrais une macro sans doublon dans tableau
For Each x In Range("b2:k11").Columns
For Each y In x.Cells: i = i + 1: y.Value = t(i): tempo ntempo: Next
Next x
Je vous remercie pour votre aide
 

Bruce68

XLDnaute Impliqué
bonjour mapomme et le forum
j'ai fais comme indiqué mais la macro ne démarre pas elle s'arrête sur randomise
j'aimerais bien une macro sans doublon
quant j'ouvre les fichiers joint excel désactive les macros et je n'arrive pas à les activer
même dans le fichier ci joint
merci pour toute l'aide
fichier ci joint
 

Pièces jointes

  • Orig mapomme1.xlsm
    17.4 KB · Affichages: 3

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @Bruce68 ;),

Voilà ce que j'ai fait :
  • J'ai rassemblé tout le code dans la module de la feuille "Feuil1" (tout était dans la classeur mais dans le désordre et dispersé)
  • Dans le code, il y a (au début du code) une déclaration de constante Const ntempo = 50.Vous pouvez modifiez la valeur de cette constante pour accroitre ou diminuer la vitesse d'affichage (0 => le remplissage sera rapide)
  • J'ai associé à Bouton 1 la macro Feuil1.Num_alea3
 

Pièces jointes

  • Orig mapomme1.xlsm
    19.1 KB · Affichages: 3

Bruce68

XLDnaute Impliqué
Bonjour @Bruce68 ;),

Voilà ce que j'ai fait :
  • J'ai rassemblé tout le code dans la module de la feuille "Feuil1" (tout était dans la classeur mais dans le désordre et dispersé)
  • Dans le code, il y a (au début du code) une déclaration de constante Const ntempo = 50.Vous pouvez modifiez la valeur de cette constante pour accroitre ou diminuer la vitesse d'affichage (0 => le remplissage sera rapide)
  • J'ai associé à Bouton 1 la macro Feuil1.Num_alea3
rebonjour mapomme et le forum
est il possible d'avoir cha
 

Statistiques des forums

Discussions
312 214
Messages
2 086 311
Membres
103 175
dernier inscrit
abcc