XL 2019 vba nbre alea sans doublon

  • Initiateur de la discussion Initiateur de la discussion zinessen
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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.😉😎😱
 

Pièces jointes

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

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

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

Dernière édition:
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
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour