XL 2016 sélection aléatoire de 5% d'une liste

lplv

XLDnaute Nouveau
Bonjour à tous,

Je viens d'arriver sur le forum et me tourne donc vers vous car je suis bloquée face à une sélection aléatoire. Je voudrais en effet savoir s'il est possible sur excel de tirer au sort (donc aléatoirement) - et sans doublon - 5% d'une liste avec un minimum de 3 items sélectionnés.

Je m'explique si la liste est de 150 alors il y aura 8 items sélectionnés (on arrondit au supérieur)
Si la liste n'est que de 35 alors il y aura tout de même 3 items sélectionnés (35/0.05=1.75 mais minimum de 3)

Je vous remercie d'avance pour votre aide
 

lplv

XLDnaute Nouveau
Bonjour,

Je vous remercie pour votre aide. Il faudrait que ça ressemble à cela.

Peut on automatiser la chose si je change le nombre de projet dans la liste ?
 

Pièces jointes

  • Nouveau Feuille de calcul Microsoft Excel.xlsx
    10.6 KB · Affichages: 7

patricktoulon

XLDnaute Barbatruc
si je reprend l'exemple de PierreJean sans dictionnaire ca donne ceci
VB:
Sub test2()
    Dim tablo, t, x&, i&, q&
    Randomize
    tablo = Range("A1", Cells(Rows.Count, "A").End(xlUp)).Value
    q = Int(UBound(tablo) * Range("F1"))
    ReDim t(1 To q, 1 To 1)
    Do While i < q
        x = 1 + Round(Rnd * (UBound(tablo) - 1))
        If IsError(Application.Match(tablo(x, 1), t, 0)) Then i = i + 1: t(i, 1) = tablo(x, 1)
    Loop
    Range("C1:C" & q).Value = (t)
End Sub

ca peut être intéressant pour Mac qui n'ont pas le dico a dispo ou ceux qui ne veulent pas se servir des objets scripting...

pour l'arrondi supperieur
Code:
q = Int(UBound(tablo) * Range("F1"))+1
 

patricktoulon

XLDnaute Barbatruc
re
regarde le code tu dois trouver le même ligne sans le "-1" .. ben tu la remplace
ensuite j'ai zappé le 3 minimum voila qui est corrigé
donc le code sans dico et arrondi sup avec condition 3 minimum ca donne ceci
VB:
Sub test2()
    Dim tablo, t, x&, i&, q&
    Randomize
    tablo = Range("A1", Cells(Rows.Count, "A").End(xlUp)).Value
    q = Application.Max(Int(UBound(tablo) * Range("F1")) + 1, 3)
    ReDim t(1 To q, 1 To 1)
    Do While i < q
        x = 1 + Round(Rnd * (UBound(tablo) - 1))
        If IsError(Application.Match(tablo(x, 1), t, 0)) Then i = i + 1: t(i, 1) = tablo(x, 1)
    Loop
    Range("C1:C" & q).Value = (t)
End Sub
 

Discussions similaires

Réponses
20
Affichages
553

Statistiques des forums

Discussions
314 760
Messages
2 112 574
Membres
111 604
dernier inscrit
Darkanou