Nombre aléatoire UNIQUE

Tochiro

XLDnaute Nouveau
Bonsoir,

j'aimerai créer un tableau contenant 200 valeurs aléatoires de 0 à 199.
Quand une valeur est utilisée, elle ne doit plus ressortir, ce qui revient à dire que mon tableau doit contenir tous les nombres de 0 à 199 mais pas dans l'ordre...

J'ai essayé la fonction ALEA.ENTRE.BORNES(0;199), mais évidement, j'ai des doublons...

Si quelqu'un pouvait m'éclairer. :eek:
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir Tochiro, bonsoir le forum,

la macro ci-dessous écris aléatoirement dans la plage A1:A201 des nombres de 0 à 200 sans doublons.

Option Explicit 'oblige à déclarer toutes les variables

Sub Macro1()
Dim x As Byte 'déclare la variable x
Dim ad As String 'déclare la variable ad
Dim c As Range 'déclare la variable c
Randomize 'lance la fonction aléatoire
For x = 1 To 200 'boucle sur 199 cellule
If Cells(1, 1) = '' Then 'condition1 : si la cellule A1 est vide, alors
Cells(1, 1) = Int(200 * Rnd) 'A1 = aléatoire ente 0 et 199
Else 'sinon
Cells(x, 1) = Int(200 * Rnd) 'la cellule A_x = aléatoire entre 0 et 99
With Range('A1:A' & x) 'avec la plage A1:A_x
Set c = .Find(Cells(x, 1).Value, , , xlWhole) 'définit la variable c = chercher la première valeur de A_x
If Not c Is Nothing Then 'condition2 : si recherche non infructueuse
ad = c.Address 'définit la variable ad (adresse de la première valeur trouvée = A_x)
Set c = .FindNext(c) 'redéfinit la variable c = prochaine valeur A_x recherché
If Not c Is Nothing And c.Address <> ad Then 'condition3 : si recherche non infructeueuse et adresse différente de la premiere valeur trouvée
x = x - 1 'redéfinit la variable x
End If 'fin condition3
End If 'fin condition2
End With 'fin avec plage A1:A_x
End If 'fin condition1
Next x 'prochaine cellule de la boucle
Cells(Int(201 * Rnd), 1).Select 'sélectione aleatoirement une cellule dans la plage (A1:A200)
Selection.Insert Shift:=xlDown 'insère en décalant vers le bas
Selection.Value = 200 'place la dernière valeur = 200
End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Tochiro, bonjour le forum,

Le code que je t'ai donné contient une petite erreur qui risque de provoquer un bug si un zero est tiré au sort lors de la sélection aléatoire d'une cellule (Cells(0,1).Select=bug). Remplace l'avant avant dernière ligne par celle-ci :
Cells(Int(201 * Rnd) + 1, 1).Select 'sélectione aléatoirement une cellule dans la plage (A1:A200)
 

Hervé

XLDnaute Barbatruc
Bonjour tochiro, salut robert

Une petit variation, sur le meme thème :

Option Explicit
Sub Bouton2_QuandClic()
Dim i As Byte, num As Byte, j As Byte
Dim tablo(1 To 199)

For i = 1 To 199
debut:
&nbsp; &nbsp; num = Int(200 * Rnd)
&nbsp; &nbsp;
For j = 1 To UBound(tablo, 1)
&nbsp; &nbsp; &nbsp; &nbsp;
If num = tablo(j) Then GoTo debut
&nbsp; &nbsp;
Next j
tablo(i) = num
Range('c' & i) = num
Next i

End Sub

J'en profite pout tester la macro complémentaire de sylvain.

Par contre robert comment tu fais pour sortir un 0 en aléatoire, je n'y suis pas arrivé ???

Salut
 
P

PhiBou

Guest
Bonjour Jepi67, Hervé, Robert, le Forum

Sans macro sur 3 colonnes

Colonne A (de 1 à 200) = Alea()
Colonne B (de 1 à 200) les nombres de 0 à 199

Cellule C1 :
=RECHERCHEV(PETITE.VALEUR($A$1:$A$200;LIGNE());$A$1:$B$200;2;0)

et recopie incrémentée de C1 à C200

F9 pour nouveau tirage

Bonne journée

PhiBou
 

Tochiro

XLDnaute Nouveau
merci à tous...

si je reviens sur la macro de Robert, en fait je veux faire un certain nombre de colonnes contenant les 200 aléatoires (c'est pour appeler une colonne à partir d'un prog en VB pour un découpage/recollage de fichier avant de balancer dans un algorithme de cryptage).

Donc, il faudrait que je puisse sélectionner une cellule de tête (ex C1) en cliquant dessus, et qu'en lançant la macro, ça se déroule dedans. Pour l'instant je ne veux pas la solution, j'aimerai juste connaître la fonction qui permet de renvoyer le nom de la cellule active car je ne la trouve pas. Exemple, si je sélectionne B1 avec le mulot, quelle fonction me renverra B1 dans la macro ?
 

Robert

XLDnaute Barbatruc
Repose en paix
Bonsoir le Fil, Tochiro, le forum,

Pour répondre à ton dernier post la même macro (de 0 à 199 cette fois) mais tu cliques sur une cellule avant pour déterminer la colonne :


Option Explicit 'oblige à déclarer toutes les variables

Sub Macro1()
Dim x As Byte 'déclare la variable x
Dim ad As String 'déclare la variable ad
Dim c As Range 'déclare la variable c
Dim col As Integer 'déclare la variable col
col = ActiveCell.Column 'définit la variable col
Randomize 'lance la fonction aléatoire
For x = 1 To 199 'boucle sur 199 cellule
If Cells(1, col) = '' Then 'condition1 : si la cellule A1 est vide, alors
Cells(1, col) = Int(199 * Rnd) 'A1 = aléatoire ente 0 et 199
Else 'sinon
Cells(x, col) = Int(199 * Rnd) 'la cellule A_x = aléatoire entre 0 et 99
With Range(Cells(1, col), Cells(x, col)) 'avec la plage A1:A_x
Set c = .Find(Cells(x, col).Value, , , xlWhole) 'définit la variable c = chercher la première valeur de A_x
If Not c Is Nothing Then 'condition2 : si recherche non infructueuse
ad = c.Address 'définit la variable ad (adresse de la première valeur trouvée = A_x)
Set c = .FindNext(c) 'redéfinit la variable c = prochaine valeur A_x recherché
If Not c Is Nothing And c.Address <> ad Then 'condition3 : si recherche non infructeueuse et adresse différente de la premiere valeur trouvée
x = x - 1 'redéfinit la variable x
End If 'fin condition3
End If 'fin condition2
End With 'fin avec plage A1:A_x
End If 'fin condition1
Next x 'prochaine cellule de la boucle
Cells(Int(200 * Rnd) + 1, col).Select 'sélectione aleatoirement une cellule dans la plage (1:200)
Selection.Insert Shift:=xlDown 'insère en décalant vers le bas
Selection.Value = 199 'place la dernière valeur = 199
Cells(1, col).Select 'sélectionne la première cellule
End Sub
 

Tochiro

XLDnaute Nouveau
arf, jvoulais que la fonction sans la solution pour faire travailler ma ptite cervelle et comprendre... mais c'est si bien expliqué, merci beaucoup (j'avais corrigé un peu car ça remplissait de la ligne 1 à 201 inclus).

encore merci.
 
B

bears

Guest
slt

je voulais savoir si on pouvais faire en sorte que cellule où il y a ecrit:

=RECHERCHEV(PETITE.VALEUR($A$1:$A$200;LIGNE());$A$1:$B$200;2;0)

ne change pas lorsque l'on fait entrer, ou que l'on change une cellule?

merci
 

Discussions similaires

Réponses
2
Affichages
877

Statistiques des forums

Discussions
311 540
Messages
2 080 523
Membres
101 234
dernier inscrit
Layani89