Macro selection aléatoire simple

Bonjour,

Novice dans le domaine du VBA, j'essaye de concevoir un automatisme pour faire une sélection de valeurs d'une liste.

Donc j'explique, dans ma feuille j'ai une liste de noms dont le nombre varie (car la liste est changée chaque mois).

J'aimerais créer une macro me permettant de sélectionner X valeurs de cette liste.

Par exemple, au début du programme il réclamerait le nombre de valeurs qu'on veut. Imaginons que l'utilisateur choisit 25, cela résulterait quelques colonnes plus loin, une liste des 25 noms sélectionnés sans doublon.

Dans le fichier ci-joint, plusieurs macros ont été réalisés mais j'y retourne plusieurs problèmes.

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim LI As Byte 'déclare la variable LI (LIgne)
Dim TS(1 To 100) As Variant 'déclare le tableau de 100 TS (Tirage au Sort)

Set O = Worksheets("Feuil2") 'définit l'onglet O
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeurs TV
Randomize 'lance le générateur de nombre aléatoire
LI = Int((100 * Rnd) + 1) 'définit la ligne LI
TS(1) = TV(LI, 1) 'définit le 1er tirage au sort
TV(LI, 1) = "" 'vide la donnée ligne I colonne 1 de TV
For i = 2 To 100 'boucle sur les X autres tirages au sort
    LI = Int((100 * Rnd) + 1) 'définit la ligne LI
    Do Until TV(LI, 1) <> "" 'exécute en boucle jusqu'à ce que la donnée ligne LI colonne 1 de TV ne soit pas vide
        LI = Int((100 * Rnd) + 1) 'définit la ligne LI
    Loop 'boucle
    TS(i) = O.Cells(LI, 1) 'définit le Ième tirage au sort
    TV(LI, 1) = "" 'vide la donnée ligne LI colonne 1 de TV
Next  'prochain tirage azu sort de la boucle'
Range("E2").Resize(100, 1) = Application.Transpose(TS) 'renvoie dans E2 redimensionnée le tableau TS transposé
End Sub

Dans celle ci par exemple, ils prend bien le nombre de valeurs mais uniquement dans les 100 premiers de la liste...

Quelqu'un pour m'aider s'il vous plait?

Salut HondaSS,

Si j'ai bien compris, si l'utilisateur entre 25, tu aimerais récupérer 25 noms aléatoire sans doublons ?

Oui tout a fait Baboutz. On récupère 25 noms choisis aléatoirement dans la liste initiale.

Bonjour tout le monde !

Une contribution :

Option Base 1
Sub ListeAléatoire()

Dim TV(), NbTirage As Integer, i As Integer, ValTransfert()

With Sheets("Feuil1")
    TV = .Range("A2:B" & .Range("B" & Rows.Count).End(xlUp).Row).Value 'définit le tableau des valeurs TV
    NbTirage = Application.Min(UBound(TV), Int(Application.InputBox("Nombre d'entrées souhaitées", Type:=1))) 'Interroge l'utilisateur
    ReDim ValTransfert(1, 2)
    For i = 1 To UBound(TV) 'Parcourir la liste
        Randomize
        NbAlea = Int(Rnd() * UBound(TV)) + 1 'Génère un nombre aléatoire correspondant à la position d'un élément de la liste
        'Intervertit l'élément i avec l'élément NbAlea
        ValTransfert(1, 1) = TV(NbAlea, 1)
        ValTransfert(1, 2) = TV(NbAlea, 2)
        TV(NbAlea, 1) = TV(i, 1)
        TV(NbAlea, 2) = TV(i, 2)
        TV(i, 1) = ValTransfert(1, 1)
        TV(i, 2) = ValTransfert(1, 2)
    Next i
    For i = 1 To NbTirage 'Reporte les X premiers éléments
        .Range("D" & i + 1) = TV(i, 1)
        .Range("E" & i + 1) = TV(i, 2)
    Next i
End With

End Sub
121tirageliste.xlsm (22.34 Ko)

Salut Pedro22,

J'ai réalisé ça en attendant :

Cela répond à ta demande HondaSS ?

Merci infiniment pour votre aide ! C'est exactement ce que je voulais

Merci infiniment pour votre aide ! C'est exactement ce que je voulais

Je ne sais pas de laquelle des 2 propositions tu parles, mais à priori ton problème et résolu et tu peux donc cocher la case de résolution...

Juste une dernière question Pedro22? Par simple curiosité, comment fonctionne ta solution?

Faut-il sélectionner au préalable le tableau ?

Je n'ai réussi à faire fonctionner que celle de Baboutz.

Comme a dit mon collègue, je ne sais également pas quelle proposition tu as gardée, mais fais attention, je n'ai pas codé le cas des erreurs (par exemple si l'utilisateur rentre une donnée plus grande que la longueur de la liste)

Juste une dernière question Pedro22? Par simple curiosité, comment fonctionne ta solution?

Faut-il sélectionner au préalable le tableau ?

Je n'ai réussi à faire fonctionner que celle de Baboutz.

J'ai joins un fichier pour illustrer son fonctionnement. Je n'ai pas ajouté de bouton pour lancer la macro, qui est à exécuter depuis l'onglet "Développeur" ou depuis l'éditeur VBA (ALT + F11).

Le pré-requis est d'avoir une feuille nommée "Feuil1" et une liste d'éléments avec leur index numérique en colonne A, et le texte associé en colonne B. Ces références peuvent être adaptés dans le code si besoin.

D'accord merci pour les explications.

Je clôture la demande.

Rechercher des sujets similaires à "macro selection aleatoire simple"