Developpez.com

Club des développeurs et IT pro
Plus de 4 millions de visiteurs uniques par mois

FAQ ExcelConsultez toutes les FAQ

Nombre d'auteurs : 46, nombre de questions : 845, dernière mise à jour : 30 mars 2017 

 
OuvrirSommaireLes macros VBALes fonctions aléatoires

Cet exemple crée un nombre entier aléatoire entre 1 et 6:

Vba
Sélectionnez

Sub nombreAleatoire_Entre1et6()
    Randomize 'Initialisation du générateur de nombres aléatoires
    MsgBox Int((6 * Rnd) + 1)
End Sub




Cette autre macro crée un nombre entier aléatoire compris entre 10 et 15:

Vba
Sélectionnez

Sub nombreAleatoireDansPlageValeurs()
    Dim Mini As Integer, Maxi As Integer
 
    Mini = 10
    Maxi = 15
 
    Randomize
    MsgBox Int((Maxi - Mini + 1) * Rnd + Mini)
End Sub




L'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.

Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

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 Sub
Créé le 14 mai 2007  par SilkyRoad
Vba
Sélectionnez

Sub 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 Sub
Créé le 14 mai 2007  par SilkyRoad

La macro suivante trie les données de la colonne A de manière aléatoire.

Vba
Sélectionnez

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
Créé le 14 mai 2007  par SilkyRoad

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).

Vba
Sélectionnez

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 Sub




Il 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.

Créé le 14 mai 2007  par SilkyRoad

Cet exemple place 20 croix (x) dans des cellules aléatoires de la plage A1:J10.

Vba
Sélectionnez

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
Créé le 19 février 2008  par SilkyRoad
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2009 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.