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

Procédure rand en VBA, mais 1 seule fois

3 réponses
Avatar
Alain Lebayle
Bonjour,
J'ai créé un petit jeu qui pose des questions, dans ce cas des pays dans
une colonne et il faut trouver les capitales qui sont dans l'autre
colonne masquée, j'ai pour cela utiliser rand, cela sort au hasard les
pays mais ils reviennent souvent. Comment faire pour qu'une fois le pays
sorti, il ne revient pas dans le rand ?

Je vous remercie
Alain

Sheets("Params").Range("T1").Value = index(R1:R26,int(rand()*(27-1)+1))]
Lbl_départ = Sheets("Params").Range("T1").Value

3 réponses

Avatar
michdenis
Bonjour,

Tu copies ceci dans un module standard :

'---------------------------------------------------------------
Sub Liste_Pays_au_hasard()
Dim A As Long, B As Long, I As Long, X As Integer
Dim Arr As Variant, N As Long, NbPays As Integer
'Dim D As Object, Texte As String
Dim NomFeuille As String, Adr As String

'Liste des caractères possible :
'Adapte le nom de la feuille où sont tes données
With Worksheets("Sheet1")
Arr = .Range("R1:R26") ' Plage contenant tes pays
End With

'********* Variables à renseigner **************

NbPays = UBound(Arr) 'Nombre de pays total
N = NbPays 'Nombre de pays que tu veux sortir
'lors du tirage. Ne peut pas être
'plus grand que le nombre de pays total
'Si tu veux un nombre moins grand que le total, tu soustrait
'N = NbPays - 5

NomFeuille = "Feuil1" ' nom de l'onglet de la feuille
'où la liste sera inscrite
Adr = "A1" ' Adresse de la première cellule
' où débutera la liste
'***************************************************

I = 0
Set D = CreateObject("Scripting.Dictionary")
Do Until I = N
For X = 1 To NbPays
Randomize
Texte = Texte & Arr(Int((UBound(Arr, 1) - _
LBound(Arr, 1) + 1) * Rnd + LBound(Arr, 1)), 1)

If Not D.Exists(Texte) Then
D.Add Texte, Texte
I = I + 1
End If
Texte = ""
Next
Loop

With Sheets(NomFeuille)
.Range(Adr).NumberFormat = "Genreral"
.Range(Adr).Resize(N) = Application.Transpose(D.Items)
End With
End Sub
'---------------------------------------------------------------




"Alain Lebayle" a écrit dans le message de groupe de
discussion :
Bonjour,
J'ai créé un petit jeu qui pose des questions, dans ce cas des pays dans
une colonne et il faut trouver les capitales qui sont dans l'autre
colonne masquée, j'ai pour cela utiliser rand, cela sort au hasard les
pays mais ils reviennent souvent. Comment faire pour qu'une fois le pays
sorti, il ne revient pas dans le rand ?

Je vous remercie
Alain

Sheets("Params").Range("T1").Value = index(R1:R26,int(rand()*(27-1)+1))]
Lbl_départ = Sheets("Params").Range("T1").Value
Avatar
michdenis
Bonjour,

Tu copies ceci dans un module standard :

'------------------------------------------------
Sub Lister_Pays_au_hasard_Sans_Doublon()
Dim A As Long, I As Long, X As Integer
Dim Arr As Variant, N As Long, NbPays As Integer
Dim D As Object, Pays As String
Dim NomFeuille As String, Adr As String

'Adapte le nom de la feuille où sont tes données
With Worksheets("Sheet1")
Arr = .Range("R1:R26") ' Plage contenant tes pays
End With

'********* Variables à renseigner **************

NbPays = UBound(Arr) 'Nombre de pays total
N = NbPays 'Nombre de pays que tu veux sortir
'lors du tirage. Ne peut pas être
'plus grand que le nombre de pays total
'Si tu veux un nombre moins grand que le total, tu soustrait
'N = NbPays - 5

NomFeuille = "Feuil1" ' nom de l'onglet de la feuille
'où la liste sera inscrite
Adr = "A1" ' Adresse de la première cellule
' où débutera la liste
'***************************************************

Set D = CreateObject("Scripting.Dictionary")

Do Until I = N
For X = 1 To NbPays
Randomize
Pays = Pays & Arr(Int((UBound(Arr, 1) - _
LBound(Arr, 1) + 1) * Rnd + LBound(Arr, 1)), 1)
If Not D.Exists(Pays) Then
D.Add Pays, Pays
I = I + 1
If I = N Then Exit For
End If
Pays = ""
Next
Loop

With Sheets(NomFeuille)
.Range(Adr).NumberFormat = "@"
.Range(Adr).Resize(N) = Application.Transpose(D.Items)
End With
End Sub
'------------------------------------------------





"Alain Lebayle" a écrit dans le message de groupe de
discussion :
Bonjour,
J'ai créé un petit jeu qui pose des questions, dans ce cas des pays dans
une colonne et il faut trouver les capitales qui sont dans l'autre
colonne masquée, j'ai pour cela utiliser rand, cela sort au hasard les
pays mais ils reviennent souvent. Comment faire pour qu'une fois le pays
sorti, il ne revient pas dans le rand ?

Je vous remercie
Alain

Sheets("Params").Range("T1").Value = index(R1:R26,int(rand()*(27-1)+1))]
Lbl_départ = Sheets("Params").Range("T1").Value
Avatar
Alain Lebayle
Bonjour, Michdenis,
Je suis parfaitement satisfait de ta procédure qui fonctionne à
merveille, un très grand merci à toi !
Bonne journée
Alain


michdenis a écrit :
Bonjour,

Tu copies ceci dans un module standard :

'------------------------------------------------
Sub Lister_Pays_au_hasard_Sans_Doublon()
Dim A As Long, I As Long, X As Integer
Dim Arr As Variant, N As Long, NbPays As Integer
Dim D As Object, Pays As String
Dim NomFeuille As String, Adr As String

'Adapte le nom de la feuille où sont tes données
With Worksheets("Sheet1")
Arr = .Range("R1:R26") ' Plage contenant tes pays
End With

'********* Variables à renseigner **************

NbPays = UBound(Arr) 'Nombre de pays total
N = NbPays 'Nombre de pays que tu veux sortir
'lors du tirage. Ne peut pas être
'plus grand que le nombre de pays total
'Si tu veux un nombre moins grand que le total, tu soustrait
'N = NbPays - 5

NomFeuille = "Feuil1" ' nom de l'onglet de la feuille
'où la liste sera inscrite
Adr = "A1" ' Adresse de la première cellule
' où débutera la liste
'***************************************************

Set D = CreateObject("Scripting.Dictionary")

Do Until I = N
For X = 1 To NbPays
Randomize
Pays = Pays & Arr(Int((UBound(Arr, 1) - _
LBound(Arr, 1) + 1) * Rnd + LBound(Arr, 1)), 1)
If Not D.Exists(Pays) Then
D.Add Pays, Pays
I = I + 1
If I = N Then Exit For
End If
Pays = ""
Next
Loop

With Sheets(NomFeuille)
.Range(Adr).NumberFormat = "@"
.Range(Adr).Resize(N) = Application.Transpose(D.Items)
End With
End Sub
'------------------------------------------------





"Alain Lebayle" a écrit dans le message de groupe de
discussion :
Bonjour,
J'ai créé un petit jeu qui pose des questions, dans ce cas des pays dans
une colonne et il faut trouver les capitales qui sont dans l'autre
colonne masquée, j'ai pour cela utiliser rand, cela sort au hasard les
pays mais ils reviennent souvent. Comment faire pour qu'une fois le pays
sorti, il ne revient pas dans le rand ?

Je vous remercie
Alain

Sheets("Params").Range("T1").Value = index(R1:R26,int(rand()*(27-1)+1))]
Lbl_départ = Sheets("Params").Range("T1").Value