FAQ Excel

FAQ ExcelConsultez toutes les FAQ
Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2022
Sommaire→Les macros VBA→Les fonctions aléatoires- Comment créer une valeur aléatoire ?
- Comment afficher une lettre aléatoire entre A et Z ?
- Comment mélanger de façon aléatoire tous les mots d'une phrase ?
- Comment permuter les données d'une colonne et de façon aléatoire ?
- Comment générer une série de nombres entiers aléatoires sans doublon ?
- Comment créer des groupes de façon aléatoire ?
- Comment insérer un nombre de croix dans des cellules aléatoires d'une plage ?
Cet exemple crée un nombre entier aléatoire entre 1 et 6 :
Sub nombreAleatoire_Entre1et6()
Randomize 'Initialisation du générateur de nombres aléatoires
MsgBox Int((6 * Rnd) + 1)
End SubCette autre macro crée un nombre entier aléatoire compris entre 10 et 15 :
Sub nombreAleatoireDansPlageValeurs()
Dim Mini As Integer, Maxi As Integer
Mini = 10
Maxi = 15
Randomize
MsgBox Int((Maxi - Mini + 1) * Rnd + Mini)
End SubL'instruction Randomize, utilisée sans argument, permet au générateur de nombres aléatoires de démarrer à chaque
fois sur une valeur différente.
En l'absence de Randomize, la fonction Rnd adopte le même nombre comme valeur initiale la première fois qu'elle est appelée.
Sub LettreAleatoire()
Dim Cible As Byte
Randomize 'Initialisation du générateur de nombres aléatoires
Cible = Int((26 * Rnd) + 1)
MsgBox Chr(Cible + 64)
End SubSub MelangeMots()
Dim Tableau() As String
Dim TabNumLignes() As Integer
Dim i As Integer, k As Integer
Dim Resultat As String
'Place dans un tableau chaque mot de la chaîne séparé par un espace.
Tableau() = Split("Un Deux Trois Quatre Cinq")
ReDim TabNumLignes(0 To UBound(Tableau()))
For i = 0 To UBound(Tableau())
TabNumLignes(i) = i
Next
'Initialise le générateur de nombres aléatoires
Randomize
For i = UBound(Tableau()) To 0 Step -1
k = Int((i * Rnd))
Resultat = Resultat & " " & Tableau(TabNumLignes(k))
TabNumLignes(k) = TabNumLignes(i)
Next
MsgBox Resultat
End SubLa macro suivante trie les données de la colonne A de manière aléatoire.
Sub TriColonneAleatoire()
Dim Cell As Range
Dim NbLignes As Integer, NbAleatoire As Integer
Dim Tableau(), TabTemp()
Dim i As Integer, j As Integer, k As Integer
'Indique le numéro de la dernière ligne non vide dans la colonne A
NbLignes = Range("A65536").End(xlUp).Row
ReDim Tableau(NbLignes)
'Remplit le tableau qui va servir au tirage aléatoire
'en utilisant les données de la colonne A.
For Each Cell In Range("A1:A" & NbLignes)
Tableau(Cell.Row - 1) = Cell
Next Cell
'Permute les données de façon aléatoire.
For i = 1 To NbLignes
Randomize 'Initialise le générateur de nombre aléatoire
'Récupére un numéro de ligne aléatoire dans la tableau contenant les données.
NbAleatoire = Int(Rnd * UBound(Tableau)) + 1
'Insére dans la cellule la donnée du tableau correspondant à cette valeur aléatoire.
Cells(i, 1) = Tableau(NbAleatoire - 1)
'Redéfinit la taille du Tableau temporaire.
ReDim TabTemp(NbLignes - i)
'Transfert les données dans le tableau temporaire, expurgées de la lignes tirée aléatoirement.
For j = 1 To NbLignes - i
k = 0
If j >= NbAleatoire Then k = 1
TabTemp(j - 1) = Tableau(j + k - 1)
Next j
'Retransfère le tableau temporaire dans le tableau de tirage aléatoire.
ReDim Tableau(NbLignes - i)
For j = 1 To NbLignes - i
Tableau(j - 1) = TabTemp(j - 1)
Next j
Next i
End Sub
La procédure suivante crée une série de nombres entre 1 et 25, de façon aléatoire et sans doublon.
Les valeurs sont écrites verticalement dans la feuille de calcul, et une option permet d'indiquer à partir de
quelle cellule (B1 dans l'exemple).
Sub Test()
GenereSerieAleatoireSansDoublons 25, Range("B1")
End Sub
Sub GenereSerieAleatoireSansDoublons(NbValeurs As Integer, Cell As Range)
Dim Tableau() As Integer, TabNumLignes() As Integer
Dim i As Integer, k As Integer
ReDim Tableau(NbValeurs)
ReDim TabNumLignes(NbValeurs)
For i = 1 To NbValeurs
TabNumLignes(i) = i
Tableau(i) = i
Next
'Initialise le générateur de nombres aléatoires
Randomize
For i = NbValeurs To 1 Step -1
k = Int((i * Rnd) + 1)
Cells(Cell.Row + i - 1, Cell.Column) = Tableau(TabNumLignes(k))
TabNumLignes(k) = TabNumLignes(i)
Next
End SubIl est aussi possible d'effectuer le tirage sans macro :
Insérez la formule = Alea() dans la cellule A1, puis utilisez les poignées
de recopie jusqu'en A25.
Saisissez les nombres 1 à 25 chronologiquement dans la plage B1:B25
Dans la cellule C1 vous saisissez:
=RECHERCHEV(PETITE.VALEUR($A$1:$A$25;LIGNE());$A$1:$B$25;2;0)
puis utilisez les poignées de recopie jusqu'en C25.
Utilisez la touche clavier F9 pour lancer nouveau tirage.
Cet exemple place 20 croix (x) dans des cellules aléatoires de la plage A1:J10.
Sub Test()
RemplissageAleatoire Range("A1:J10"), 20
End Sub
Sub RemplissageAleatoire(Plage As Range, NbCroix As Integer)
Dim Tableau As Collection
Dim Cell As Range
Dim i As Integer, j As Integer
'Vérifie si le nombre de cellules est supérieur au nombre de
'croix à insérer.
If Plage.Cells.Count < NbCroix Then Exit Sub
'suppression des anciennes données
Cells.Clear
Plage.Interior.ColorIndex = 7
Set Tableau = New Collection
For Each Cell In Plage
Tableau.Add Cell.Address
Next Cell
For j = 1 To NbCroix
Randomize
DoEvents
i = Int((Tableau.Count * Rnd)) + 1
Range(Tableau(i)) = "x"
Tableau.Remove i
DoEvents
Next j
End Sub


