tirage au sort ?

  • Initiateur de la discussion mafaro
  • Date de début
M

mafaro

Guest
comment à partir d'une liste de nom dans un tableau effectuer automatiquement un autre tableau avec cette même liste mais modifiée dans son ordre: faire un tirage au sort qui soit différent à chaque demande de tirage au sort. :whistle:
 

galopin01

XLDnaute Occasionnel
Bonjour,
Comme on n'a pas beaucoup d'indication sur cette liste, la réponse est générique et à adapter :

Cette macro suppose que ta liste commence à la cellule A1 et que la colonne B est vide
En face de chaque nom la macro attribue un N° d'ordre :
Yapuka trier !
Sub Test()
Dim Tablo, i%, j%, k%, x%
Tablo = Range('A1:B' & Range('A1').End(xlDown).Row)
j = UBound(Tablo)
For i = 1 To j
Do
Tablo(i, 2) = Int(j * Rnd()) + 1
For k = 1 To i
If Tablo(k, 2) = Tablo(i, 2) Then x = x + 1
If x > 1 Then
x = 0
Exit For
End If
Next
Loop Until x = 1
x = 0
Next
Range('A1:B' & Range('A1').End(xlDown).Row) = Tablo
Tablo = Clear
End Sub
Ok ?
 
P

PhiBou

Guest
Bonjour Mafaro, dj62, Galopin01, le Forum

Une autre solution sans VBA

Bonne après-midi

PhiBou [file name=aleatoireMafaro.zip size=7198]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/aleatoireMafaro.zip[/file]
 

Pièces jointes

  • aleatoireMafaro.zip
    7 KB · Affichages: 501

galopin01

XLDnaute Occasionnel
Bonsoir,
Dans le même gout que la précédente mais beaucoup plus rapide, la macro suivante prend les item de la colonne 1 et te les ressort dans un autre ordre en colonne B (5000 en 13 secondes !)
J'ai testé sur des nombres car je n'ai malheureusement pas de base de données ad'hoc mais je pense que ça ne fait pas de différence :
Attention pour exécuter correctement cette macro il faut mettre cette première ligne dans les déclarations du module avant toute macro : Option Base 1
Option Base 1

Sub test()
Dim Tablo, i%, j%, k%
Application.ScreenUpdating = False
i = Range('A1').End(xlDown).Row
ReDim Tablo(i)
For j = 1 To i
k = Int(((i + 1 - j) * Rnd) + 1)
Tablo(j) = Cells(k, 1)
Cells(k, 1).Delete Shift:=xlUp
Next
Range('B1:B' & i) = Application.Transpose(Tablo)
Tablo = Clear
End Sub
Nota :
A noter que dans la dernière ligne :
Range('B1:B' & i) = Application.Transpose(Tablo)
on peut remplacer B par A :
Range('A1:A' & i) = Application.Transpose(Tablo)
dans ce cas le tableau est purement et simplement remplacé par un autre tirage.

A+

Message édité par: galopin01, à: 19/04/2005 08:10
 
M

mafaro

Guest
bonjour,dj62, phibou,galopin01,le forum,

je suis 'épaté' par les réponses proposées, moi qui ne prend pas le temps à me former aux macros ...
J'aurais du expliquer mon problème bien plutôt:

je gére une liste de noms(A2)et prénoms (B2);A1 et B1 étant titre nom et prenom.(excel 2000).Je pars d'un classeur vierge et j'y inscrit des noms au fur et à mesure.
Cette liste au départ n'est pas triée. j'ai donc un nombre X de noms et prénoms (maxi 100 pour l'instant....) sur 2 colonnes.
Je voudrais allouer un chiffre aléatoire à chaque noms (merci à galopin01 1° solution), si 30 noms....chiffres de 1 à 30.Ce 'nouveau tableau pouvant être trié par ces chiffres associés aux noms.
Ce que j'ai appelé: tirage au sort.

pour ta 2°proposition je suis dépassé car 'déclaration du module' est déjà trop fort pour moi....(très basique que je suis). Peux-tu m'expliquer comment faire??
Merci Phibou, les fonctions F9 et total des noms sont bien rapide, sans mes explications beau travail....que je ne saurais reprendre pour associer au macro de galopin01
 
M

mafaro

Guest
re-bonjour (suite),
Avec un peu de reflexion j'ai réussi à mettre en place ta 2° propostion galopin01.Interressant. J'ai le choix maintenant entre 2 solutions : ou un chiffre est associé, ou les noms sont mis directement dans un ordre aléatoire. Bien.
J'opterai bien pour la premiére. Dans quelle ligne de la macro changer l'emplacement des chiffres (en C1)???
Merci
 

galopin01

XLDnaute Occasionnel
bonjour,
Comme ça entre 2 portes et sans vérif, pour un tirage en colonne C:

Option Base 1

Sub testC()
Dim Tablo, i%, j%, k%
Application.ScreenUpdating = False
i = Range('C1').End(xlDown).Row
ReDim Tablo(i)
For j = 1 To i
k = Int(((i + 1 - j) * Rnd) + 1)
Tablo(j) = Cells(k, 3)
Cells(k, 3).Delete Shift:=xlUp
Next
Range('C1:C' & i) = Application.Transpose(Tablo)
Tablo = Clear
End Sub

Sinon tu peux aussi essayer ça (toujours sans filet...)
En supposant que
colonne A contienne les noms et
colonne B les prenoms, cette macro devrait faire un tirage avec les noms, prenoms concaténés.
Il suffit de mettre au départ une copie de la liste des noms (ou des prénoms, ou des chiffres...) en colonne C
Il faut et il suffit qu'il y ait autant d'éléments dans chaque colonne.

Option Base 1

Sub testConc()
Dim Tablo, i%, j%, k%
Application.ScreenUpdating = False
i = Range('C1').End(xlDown).Row
ReDim Tablo(i)
For j = 1 To i
k = Int(((i + 1 - j) * Rnd) + 1)
Tablo(j) = Cells(k, 1) & ' ' & Cells(k, 2)
Range(Cells(k, 1), Cells(k, 2)).Delete Shift:=xlUp
Next
Range('C1:C' & i) = Application.Transpose(Tablo)
Tablo = Clear
End Sub

Ok ?

Message édité par: galopin01, à: 19/04/2005 23:17
 
M

mafaro

Guest
remerci galopin01

essai de ta premiere macro :
elle me renvoie une erreur à la ligne 6 'trop d'arguments.....'
je n'ai pas testé le seconde car si je concatene il me faudra déconcaténé dans access..;alors là !!!??????


mais ce n'est pas grave j'ai, pour ma part, tout ce qu' il me faut. Ton premier jet a été le bon . j'ai juste changé la colonne où apparaît les chiffres (je la voulais en c).
je suis heureux, je vais pouvoir m'amuser à faire des tirages au sort........
Encore Merci..Excel et surtout galopin01
 

galopin01

XLDnaute Occasionnel
Bonsoir,
Ben, c'est curieux je viens de tester les 2 à la maison :
La première marche bien.
Quand à la deuxième la concaténation pose problème, mais j'avais vraiment fait çà la sauvette entre la poire et le café, c'est pas trop étonnant... mais je vais gratter dessus quand même !

Sinon, je pense qu'on peut valider la 1ére (TestC) quand même ¿

A+
 

galopin01

XLDnaute Occasionnel
Bonsoir,
Pour info je viens de modifier la deuxième (TestConC) qui concatène maintenant correctement les colonnes A et B
Attention ! Elle efface en même temps colonne A et B : ensuite c'est la première macro (testC) qui s'applique...
Compte tenu de la vitesse de travail je pense qu'on peut les conserver en archives.
Pour indication la toute première macro travaillait 3000 lignes en 35 '
J'en ai bricolé une autre assz performante également avec CountIF qui faisait aussi ses 3000 en 18 ' mais là l'algo est vraiment fantastique 5000 en 13 secondes c'est quasiment 10 fois plus rapide !
C'est toute la puissance des tableaux...
Bonne nuit !
A+
 

Statistiques des forums

Discussions
312 581
Messages
2 089 910
Membres
104 303
dernier inscrit
Patdec