Générer nombres aléatoires sans doublons avec critères

Bonjour,

J'ai trouvé sur le forum le code permettant de générer des nombres aléatoires sans doublons dans une plage

précise mais j'ignore comment le modifier pour qu'il réponde à mes besoins.

En l'occurence :

1/ la colonne A détermine combien de nombres doivent être générés à chaque ligne (dans la limite de huit).

2/ Les nombres générés s'inscrivent de gauche à droite (en C, puis D, puis E etc... jusqu'à J quand huit).

3/ La valeur Max des nombres générés par ligne est déterminée par la colonne B.

4/ Enfin, la commande s'applique à autant de lignes qu'il y a des valeurs en A et B.

Voilà, si l'un de vous à une solution, elle sera la bienvenue!

bonjour,

une proposition

Sub Aleatoire()
    Dim t()    ' tableau des valeurs possibles
    Randomize Timer    'initialisation du générateur aléatoire
    With Sheets("feuil1")    ' on travaille sur feuil1
        dl = .Cells(Rows.Count, 1).End(xlUp).Row    'dernière ligne basé sur contenu de colonne 1 (A)
        For i = 2 To dl    'on parcourt toutes les lignes
            n = .Cells(i, 2)    ' valeur max possible pour cette ligne
            If .Cells(i, 1) > n Then
                MsgBox "pas assez de valeurs possible en ligne " & i
            Else
                ReDim t(1 To n)    ' ajustement de la taille du tableau des valeurs possibles
                For j = 1 To n
                    t(j) = j    ' remplissage du tableau des valeurs possibles
                Next j
                ' tirage aléatoire
                For j = 1 To .Cells(i, 1)    'on tire le nombre de valeurs trouvé en colonne 1
                    q = Application.RandBetween(1, n + 1 - j)    'on tire une valeur
                    .Cells(i, j + 2) = t(q)    ' on met la valeur tirée en ligne i à partir de la colonne 3
                    t(q) = t(n + 1 - j)    'on supprime du tableau la valeur qui vient d'être tirée
                Next j
            End If
        Next i
    End With
End Sub

Votre solution fonctionne à merveille sur l'exemple joint, mais pas dans le classeur auquel il est destiné... je reçois le message suivant "l'indice n'appartient pas à la sélection"

Que faut-il modifier?

Hormis "feuil1", j'avoue être bien incapable de distinguer un quelconque lien entre le code et les cellules qu'il affecte...

Bonjour,

Que faut-il modifier?

aucune idée, ne disposant pas de ton fichier. Pour ce qui est du message d'erreur adapte le nom de la feuillle.

j'ai mis des commentaires dans le code (voir message précédent)

Changer le nom de la feuille n'a pas suffit.

Comme il était un peu présomptueux de penser pouvoir adapter ton code après avoir découvert le VBA il y a deux jours, j'ai donc adapter mon tableau... et ça fonctionne! (malgré le message suivant à la fin du calcul : "incompatibilité de type")

Bref, un grand merci pour ton aide!

Bonjour,

Au vu de ton sujet, j'ai fait une réadaptation d'une fonction de tirage que j'ai dans mon stock (tu la trouveras en module1), pour la faire fonctionner avec une proc. destinée à servir ton tableau :

Sub TirAléatoires()
    Dim tbl, n%, m%, i%, dln%
    With ActiveSheet
        .Range("A1").CurrentRegion.Offset(, 2).Resize(, 8).ClearContents
        dln = .Range("A" & .Rows.Count).End(xlUp).Row
        For i = 1 To dln
            m = .Cells(i, 1): n = .Cells(i, 2)
            tbl = TIRAGE(n, m, True)
            .Cells(i, 3).Resize(, m).Value = tbl
        Next i
    End With
End Sub

NB- la fonction était destinée à une utilisation en feuille de calcul, et cette utilisation demeure valide. Elle s'utilise avec 2 arguments :

=TIRAGE(nb de valeurs [1 à nb] parmi lesquelles tirer, nb de valeurs à tirer)

après sélection d'une plage (en ligne ou en colonne) dont le nombre de cellules correspond au nombre de valeurs à tirer.

Validation matriciellel (Ctrl+Maj+Entrée).

Les tirages sont sans doublons.

Bouton Test Tir. aléat. pour tester.

Cordialement.

Merci de ton aide,

Le code fonctionne parfaitement, et le calcul semble même se faire plus rapidement qu'avec celui de H2so4.

Il y a juste un message à la fin qui indique une "erreur d'exécution '1004': erreur définie par l'application ou par l'objet".

Si je clique sur débogage la ligne de code suivante est surlignée dans l'éditeur:

.Cells(i, 3).Resize(, m).Value = tbl

Quoiqu'il en soit ça fonctionne

Bonsoir,

Aucun problème chez moi (Excel 2010). Mais ce qui me surprend, c'est que tu me dises que ça fonctionne, donc que les nombres sont bien insérés dans les cellules, et que cette ligne, qui est justement la commande d'affectation des valeurs aux cellules, apparaisse surlignée en erreur !

C'est bien sur ton fichier que j'ai retourné que tu as cette erreur ?

Car ce qui me paraîtrait possible c'est que le dimensionnement de la zone à traiter fait sur la colonne A inclue à la fin une ligne non conforme (je n'ai pas mis de test sur le type de données des colonnes A et B car cela ne paraissait pas utile... mais si on rencontre une cellule vide, ou du texte, etc. il y aura erreur). Ce qui expliquerait que tout se déroule bien jusqu'à la ligne où tout s'arrête sur erreur (et comme il n'y avait plus rien à traiter...)

Ou bien si ton tableau était un tableau Excel comportant des lignes vides, le mode de dimensionnement les incluerait et il y aurait erreur lorsqu'on arrive dessus.

Cordialement.

Pardon j'ai omis de préciser qu'il ne s'agissait pas du fichier retourné...

Cela dit le tableau ou j'ai utilisé ton code est configuré comme celui que j'avais mis en exemple; les critères en A et B, puis la plage ou s'inscrivent les nombres aléatoires.

Effectivement le test sur le type de données permettrait peut-être d'éviter le message d'erreur, mais dans la mesure ou l'erreur survient à la fin (quand il n'y a plus de donnée à traiter), c'est que le code a pleinement rempli sa mission!

Encore merci

Bonne journée.

Rechercher des sujets similaires à "generer nombres aleatoires doublons criteres"