Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tirage aleatoire dans une liste

12 réponses
Avatar
eliaz90
Hello,

J'ai en A1:A50 une liste de chiffre de 1 =E0 50.
J'utilise un bouton "Go" qui effectue un tirage au sort dans cette
liste et me donne le r=E9sultat en F14. Un nouveau numero sort a chaque
clic sur "Go"
J'utilise la macro ci dessous, mais il s'av=E8re que le tirage n'est pas
si al=E9atoire que cela car en fait excel sort toujours la m=EAme s=E9rie
de numeros et toujours dans le m=EAme ordre, m=EAme apr=E8s fermeture et
r=E9ouverture du fichier l'ordre de sortie est toujours identique.
Quelqu'un a t'il une id=E9e? (j'utilise Excel 2003)

Sub GO()

Dim C As New Collection
Dim Cell As Range, Rg As Range
Dim Nb As Integer, Rg1 As Range
Dim NomFeuille As String, R As Integer
Dim Adr1 As String, Adr As String

NomFeuille =3D "Sommaire"
Adr =3D "A1:A50"
Adr1 =3D "F14"

With Worksheets(NomFeuille)
Set Rg =3D .Range(Adr)
Set Rg1 =3D .Range(Adr1)
End With

Application.ScreenUpdating =3D False
On Error Resume Next
Nb =3D Rg.Rows.Count
For Each Cell In Rg1
Do
R =3D ((Nb * Rnd) + 1)
Cell.Value =3D Rg(R)
Loop Until Cell <> ""
Next
Set Rg =3D Nothing: Set Rg1 =3D Nothing

Merci de votre support
Eliaz90

10 réponses

1 2
Avatar
jb
Il faut utiliser Randomize au départ:

Sur l'exemple, les bénéfiaciaires sont en colonne A et les ressources
en colonne E (démarre en E2):

Sub tirage_sort()
Range("E2").Select
Randomize
Do While ActiveCell <> ""
p = Int(Rnd(1) * Application.CountA(Range("A2:A100"))) 'position
Do While Range("a2").Offset(p, 1).Value <> ""
p = Int(Rnd(1) * Application.CountA(Range("A2:A100")))
Loop
'--
Range("a2").Offset(p, 1).Value = ActiveCell
Range("a2").Offset(p, 2).Value = Now
ActiveCell.Offset(1, 0).Select
Loop
End Sub

JB
Avatar
eliaz90
Merci , mais j'utilise déjà randomize et j'ai essayé d'adapter ta
macro, ca ne fonctionne pas.
Randomize
Do While ActiveCell <> ""
p = Int(Rnd(1) * Application.CountA(Range("A1:A50"))) 'position
Do While Range("a1").Offset(p, 1).Value <> ""
p = Int(Rnd(1) * Application.CountA(Range("A1:A50")))
Loop
'--
Range("a1").Offset(p, 1).Value = ActiveCell
Range("a1").Offset(p, 2).Value = Now
ActiveCell.Offset(1, 0).Select
Loop
Avatar
jb
Avec randomize, j'obtiens bien un tirage différent , même si je ferme
Excel (Excel 2002)

http://cjoint.com/?kFopDlSn5b

JB
Avatar
eliaz90
Je pense que l'on ne sait pas compris d'où mon problème, je n'ai pas
de ressources spécifiée, je veux juste qu'a chaque clic sur le bouton
"GO", un numero compris entre A1 et A50 soit tiré au sort et
apparaisse en F14.

Voici la série qui sort a chaque fois quelque soit les circonstances:
Clic "GO", F14 = 29
Clic "GO", F14 = 45
Clic "GO", F14 = 16
Clic "GO", F14 = 28
Et ainsi de suite


Cordialement,
Eliaz90
Avatar
Elliac
Bonjour,

En chargeant la macro complémentaire "Utilitaires d'analyse" et avec la
borne maxi en H2 :
Range("g3") = "=ALEA.ENTRE.BORNES(1," & Range("h2") & ")"

Camille

"" wrote:

Merci , mais j'utilise déjà randomize et j'ai essayé d'adapter ta
macro, ca ne fonctionne pas.
Randomize
Do While ActiveCell <> ""
p = Int(Rnd(1) * Application.CountA(Range("A1:A50"))) 'position
Do While Range("a1").Offset(p, 1).Value <> ""
p = Int(Rnd(1) * Application.CountA(Range("A1:A50")))
Loop
'--
Range("a1").Offset(p, 1).Value = ActiveCell
Range("a1").Offset(p, 2).Value = Now
ActiveCell.Offset(1, 0).Select
Loop




Avatar
eliaz90
Merci camille ca marche bien apparement.

Cordialement
Eliaz90
Avatar
AV
Ta macro :
Sub zz()
Calculate
End Sub

En F14 :
=INDIRECT("A" &ENT(ALEA()*(51-1)+1))

Ou bien tout en 1 :
Sub zz2()
[F14] = "=INDIRECT(""A"" &INT(RAND()*(51-1)+1))"
End Sub

AV
Avatar
AV
PS :
juste la valeur
Sub zz2()
[F14] = [indirect("A" &int(rand()*(51-1)+1))]
end sub

PSbis : tu fais l'économie (intéressante) des macros complémentaires
AV
Avatar
eliaz90
Merci , mais la methode de camille "ALEA.ENTRE.BORNES" me convient
mieux car je ne fais pas un tirage uniquement sur des valeurs entre 1
et 50.
Je fais également un tirage sur des années (entre 1955 et 2004) et
dans ce cas cela devient:

Range("f14") = "=ALEA.ENTRE.BORNES(1955," & Range("a50") & ")"

Merci à tous
Eliaz90
Avatar
AV
Merci , mais la methode de camille "ALEA.ENTRE.BORNES" me convient
mieux car je ne fais pas un tirage uniquement sur des valeurs entre 1
et 50.
Je fais également un tirage sur des années (entre 1955 et 2004) et
dans ce cas cela devient:


Pfffff.....
Je pense (et même je suis sur) que tu n'as pas du tout testé la solution
proposée qui fait un tirage aléatoire des valeurs qui sont en A1:A50, qu'elles
soient numériques ou texte, et ceci, sans faire appel à une macro
complémentaire, qui, si elle n'est pas installée, entrainera un gros plouf !

AV

1 2