Tirage au sort liste

tibo13

XLDnaute Nouveau
Bonjour à tous,

Je dois réaliser un tirage au sort depuis une base d'environ 1100 emails. Il doit n'y avoir qu'un seul gagnant.

En cherchant sur le net, j'ai trouvé ce macro (en PJ) qui correspond bien a ce que je voudrais obtenir. Sauf qu'il est limité en nombre de valeurs. Quand je colle ma liste de mails en premiere colonne, et que je clique sur TIRAGE un message apparait pour me dire qu'il y a trop de données...

Quelqu'un peut il modifier le macro pour me permettre de faire ce tirage svp ?

De plus, si l'affichage des 3 premiers tirés au sort pouvait apparaitre de facon plus intuitive ou plus visible pour faire un genre de "podium" ce serait parfait...

Merci d'avance

Thibault
 

Pièces jointes

  • TirageAleatoireListing (2).xls
    35.5 KB · Affichages: 100

Yaloo

XLDnaute Barbatruc
Re : Tirage au sort liste

Bonsoir tibo13,

Il suffit de changer les 2 premières lignes de la macro par celles ci-dessous :

VB:
Dim TabNom As Variant, temp As Variant, lig As Integer, i As Long, j As Integer, k As Integer, l As Integer
Dim n As Long, x As Double, Z As Byte, Nbinscrits As Long

Car certaines variables étaient définies en Byte ou integer, pour ne pas avoir de problème pour le nombre de ligne il faut les passer en Long. Regardes dans l'aide VBA, Touche F1.

A te relire

Martial
 

ROGER2327

XLDnaute Barbatruc
Re : Tirage au sort liste

Bonsoir tibo13.


Une procédure à mettre dans un module standard :​
VB:
Sub Tirage(a, b, Optional n& = -1)
Dim i&, j&, pDat As Range, v, t
    With a
        t = .Value
        .Value = "x"
        Set pDat = .Parent.Range(.Cells, .Parent.Cells(Rows.Count, .Column).End(xlUp))
        .Value = t
    End With
    With b
        t = .Value
        .Value = "x"
        .Parent.Range(.Cells, .Parent.Cells(Rows.Count, .Column).End(xlUp)).ClearContents
        .Value = t
    End With
    j = pDat.Count - 1
    If n < 0 Then n = j Else n = (n + j - Abs(n - j)) / 2
    If j Then
        v = pDat.Resize(j, 1).Offset(1).Value
        If VarType(v) >= vbArray Then
            Randomize
            For i = j To 2 Step -1
                t = v(i, 1): v(i, 1) = v(1 + Int(i * Rnd), 1): v(1 + Int(i * Rnd(0)), 1) = t
            Next
        End If
        If n > 0 Then b.Offset(1).Resize(n, 1).Value = v
    End If
End Sub
Cette procédure prend trois arguments :
a = Cellule de titre des données (Sheets("TIRAGELISTING").[A1] dans votre exemple) ;
b = Cellule de titre du résultat (Sheets("TIRAGELISTING").[B1] dans votre exemple) ;
n = Nombre de valeurs tirées, paramètre facultatif.
Si n est un entier positif, n valeurs au plus seront renvoyées.
Si n est omis ou négatif, toutes les données sont renvoyées.

Par conséquent, si vous voulez n'afficher que les trois premiers du tirage en colonne B de l'onglet TIRAGELISTING, le code du bouton TIRAGE est :​
Code:
Private Sub CommandButton1_Click()
    Tirage [A1], [B1], 3
End Sub
Cette façon de faire permet un peu de souplesse : Supposons que les données soient dans l'onglet DATA à partir de H3 et que le résultat du tirage soit à afficher dans l'onglet TIRAGE à partir de C4. Il suffira d'appeler
Code:
    Tirage Sheets("DATA").[H3], Sheets("TIRAGE").[C4], 3
sans avoir à modifier quoi que ce soit dans le code de la procédure Tirage.

Une contrainte toutefois : le code suppose qu'il n'y a que des données sous le titre des données, et que que le résultat du tirage sous le titre du résultat.


ROGER2327
#6384


Mercredi 18 Décervelage 140 (Saints Pirates et Flibustiers, thaumathurges - fête Suprême Quarte)
26 Nivôse An CCXXI, 8,8198h - étain
2013-W03-2T21:10:03Z


P.s. : Bonsoir Yaloo !
 
Dernière édition:

Modeste geedee

XLDnaute Barbatruc
Re : Tirage au sort liste

Bonjour à tous,

Je dois réaliser un tirage au sort depuis une base d'environ 1100 emails. Il doit n'y avoir qu'un seul gagnant.
../.. Quand je colle ma liste de mails en premiere colonne
../..
De plus, si l'affichage des 3 premiers tirés au sort pouvait apparaitre de facon plus intuitive ou plus visible pour faire un genre de "podium" ce serait parfait...

sans macro :rolleyes:

en B2
=Alea()
double-click sur la poignée de recopie en bas à droite de B2

en D2
=INDEX(DECALER(A$1;1;0;NBVAL(A:A)-1;1);RANG(B2;DECALER(B$1;1;0;NBVAL(A:A)-1;1);1))
recopier 2 fois vers le bas
Capture.JPG


F9 pour faire un nouveau tirage

et pis c'est tout !!!
 

Pièces jointes

  • Capture.JPG
    Capture.JPG
    47.9 KB · Affichages: 126
  • Capture.JPG
    Capture.JPG
    47.9 KB · Affichages: 125

ROGER2327

XLDnaute Barbatruc
Re : Tirage au sort liste

Bonjour Modeste geedee


(...)
et pis c'est tout !!!
... mais peut-être pas assez...

Si le générateur pseudo-aléatoire d'Excel n'est pas trop mauvais, il n'est pas garanti que la colonne B ne possède pas de doublon. Il n'est guère plus garanti que la même valeur ne figure pas deux fois dans la plage B2:B4.

(Lorsqu'on lance deux dés à six faces, il y a parait-il une chance sur six d'obtenir deux faces identiques. Ici, nos dés ont un peu plus de faces, ce qui rend extrêmement faible la probabilité d'obtenir les horribles évènements que j'évoque plus haut. Mais extrêmement faible n'est pas nul...)

Remède proposé :
Code:
=TRONQUE(ALEA();6)+LIGNE()/1000000000000
en B2, à tirer vers le bas autant que besoin est.​


Bonne journée.


ROGER2327
#6385


Jeudi 19 Décervelage 140 (Saint et Sainte Cartouche, vétérinaires - fête Suprême Quarte)
27 Nivôse An CCXXI, 0,2985h - plomb
2013-W03-3T00:42:59Z
 

Modeste geedee

XLDnaute Barbatruc
Re : Tirage au sort liste

Bonsour®
Bonjour Modeste geedee
... mais peut-être pas assez...

Si le générateur pseudo-aléatoire d'Excel n'est pas trop mauvais, il n'est pas garanti que la colonne B ne possède pas de doublon. Il n'est guère plus garanti que la même valeur ne figure pas deux fois dans la plage B2:B4.

(Lorsqu'on lance deux dés à six faces, il y a parait-il une chance sur six d'obtenir deux faces identiques. Ici, nos dés ont un peu plus de faces, ce qui rend extrêmement faible la probabilité d'obtenir les horribles évènements que j'évoque plus haut. Mais extrêmement faible n'est pas nul...)

Remède proposé :
Code:
=TRONQUE(ALEA();6)+LIGNE()/1000000000000
en B2, à tirer vers le bas autant que besoin est.​


:rolleyes:
j'entends bien Roger...
[Mode faux-cul]
proposer une autre solution après le passage de Roger est toujours une façon de flirter avec le crime de lèse-majesté...
[/Mode faux-cul]
il ne s'agisssait ici que d'une alternative pour le fun, plus à même d'etre comprise par un primo-accédant déja en difficulté pour comprendre et corriger sa propre macro...
:cool:


nb : c'est toujours un plaisir et une saine émulation que d'apporter ou recevoir de quelqu'un d'autreune correction ou remède à une faille à son propre raisonnement ou limite logicielle.
Merci Roger !​
 
Dernière édition:

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 459
dernier inscrit
Arnocal