XL 2019 vba nbre alea sans doublon

zinessen

XLDnaute Nouveau
Merci de m'aider sur ce point, à générer un nombre entier par ligne sans que sa fasse des doublons, vu que je suis novice, le bouton génère ligne par ligne, si c'est possible d'effectuer un seul click et générer les 15 cellules par des nombres aléa sans doublons.;):cool::eek:
 

Pièces jointes

  • test Nbre Alea.xlsm
    20.6 KB · Affichages: 6

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Zinessen, M12,
@M12,
Je pense que cette formule peut générer des doublons : Int((14 * Rnd) + 1), par ex :
1650433742021.png

Une autre approche en PJ avec :
VB:
Sub CommandButton1_Click()
    Dim Taille%, i%, j%, Buffer
    Taille = Range("A65500").End(xlUp).Row
    ReDim T(Taille, 1)
    For i = 0 To Taille
        T(i, 0) = i + 1
        T(i, 1) = Rnd
    Next i
    For i = 0 To Taille
        For j = 0 To Taille
            If T(i, 1) > T(j, 1) Then
                Buffer = T(i, 0): T(i, 0) = T(j, 0): T(j, 0) = Buffer
                Buffer = T(i, 1): T(i, 1) = T(j, 1): T(j, 1) = Buffer
            End If
        Next j
    Next i
    For i = 2 To Taille
        Cells(i, "D") = T(i, 0)
    Next i
End Sub
 

Pièces jointes

  • test Nbre Alea.xlsm
    20.1 KB · Affichages: 2

zinessen

XLDnaute Nouveau
Bonjour Zinessen, M12,
@M12,
Je pense que cette formule peut générer des doublons : Int((14 * Rnd) + 1), par ex :
Regarde la pièce jointe 1137303
Une autre approche en PJ avec :
VB:
Sub CommandButton1_Click()
    Dim Taille%, i%, j%, Buffer
    Taille = Range("A65500").End(xlUp).Row
    ReDim T(Taille, 1)
    For i = 0 To Taille
        T(i, 0) = i + 1
        T(i, 1) = Rnd
    Next i
    For i = 0 To Taille
        For j = 0 To Taille
            If T(i, 1) > T(j, 1) Then
                Buffer = T(i, 0): T(i, 0) = T(j, 0): T(j, 0) = Buffer
                Buffer = T(i, 1): T(i, 1) = T(j, 1): T(j, 1) = Buffer
            End If
        Next j
    Next i
    For i = 2 To Taille
        Cells(i, "D") = T(i, 0)
    Next i
End Sub
c'est presque parfait,Reste un ptit blème, ya 15 équipe et sa donne le chiffre 17 parmi les chiffre aléa
 

M12

XLDnaute Accro
Bonjour Zinessen, M12,
@M12,
Je pense que cette formule peut générer des doublons : Int((14 * Rnd) + 1), par ex :
Regarde la pièce jointe 1137303
Une autre approche en PJ avec :
VB:
Sub CommandButton1_Click()
    Dim Taille%, i%, j%, Buffer
    Taille = Range("A65500").End(xlUp).Row
    ReDim T(Taille, 1)
    For i = 0 To Taille
        T(i, 0) = i + 1
        T(i, 1) = Rnd
    Next i
    For i = 0 To Taille
        For j = 0 To Taille
            If T(i, 1) > T(j, 1) Then
                Buffer = T(i, 0): T(i, 0) = T(j, 0): T(j, 0) = Buffer
                Buffer = T(i, 1): T(i, 1) = T(j, 1): T(j, 1) = Buffer
            End If
        Next j
    Next i
    For i = 2 To Taille
        Cells(i, "D") = T(i, 0)
    Next i
End Sub
Bonjour Sylvanu,
Après plusieurs TEST, pas de doublons chez moi
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Re M12,
Bizarrement j'ai souvent des doublons avec la PJ du post #2:

20220420_094301.gif


J'ai mis en E votre formule avec seulement Equiv, il semblerait que ce soit le nombre aléatoire en C2 qui est trouvé deux fois car ce nombre se trouve une fois en C2 et une fois dans la liste.
Est ce que je fais une erreur quelque part ? Mais je ne fais qu'exécuter votre macro.
J'ai mis en PJ le fichier tester, c'est exactement le votre à part la colonne E enrichie de Equiv.
 

Pièces jointes

  • test Nbre Alea (4).xlsm
    19.9 KB · Affichages: 2

Dranreb

XLDnaute Barbatruc
Utuilisez donc mon objet ListeAléat. Il est extrêmement pratique pour de nombreux algorithmes de tirages pour compétitions, et garantit de n'avoir jamais de doublon car il permuète aléatoirement à l'Init l'ensemble des valeurs possibles demandées.
 

Pièces jointes

  • ListeAléat.xlsm
    413.4 KB · Affichages: 3
Dernière édition:

dysorthographie

XLDnaute Accro
Bonjour,
Je suis sur mon téléphone portable difficile dans ces conditions de pondre du code mais voilà comment je ferai !

Si j'ai un tableau de 10 lignes
1) je défini un variable de type collection
2) je fais un add pour chaque cellules a traiter
3) je fait un do untile collection.count=0
4) dans cette boucle je fais un rnd sur le count
5) j'incremente i et je l'affect au range de la collection
6) je remove l'item de la collection
 

Discussions similaires

Statistiques des forums

Discussions
311 721
Messages
2 081 928
Membres
101 842
dernier inscrit
seb0390