Prélever 23 valeurs aléatoirement dans un tableau.

controlo

XLDnaute Occasionnel
Bonsoir ,


Me revoilà avec un nouveau problème et j'aimerais avoir votre aide, vous trouverez ci-dessous un exemple de ce que j'ai à faire. Mon problème est le suivant : j'ai en feuille 1 un tableau de 3 colonnes (a,b et c) et de 71 lignes , ce que je veux faire en automatique c'est prélever aléatoirement 23 lignes parmi ces 71 lignes et les retranscrires dans les cellules du tableau qui se trouve en feuilles 2.J'ai commencé à remplir le tableau de la feuille 2 pour vous montrer par exemple que si l'on prend la valeur 560 qui correspond à ligne 2 de la colonne a on doit aussi reporter dans le classeur de la feuille 2 la valeur qui se trouve dans la colonne b de la ligne 2 ,idem pour c.

Merci de votre coup de main
 

Pièces jointes

  • exemple 24-02-12.xls
    19.5 KB · Affichages: 62

controlo

XLDnaute Occasionnel
Re : Prélever 23 valeurs aléatoirement dans un tableau.

bonjour tous :):):):):):)

une autre facon de l'ecrire je mets pas dans l'ordre il faut... il faut pas ??

Code:
Sub es()
 Dim T(), i As Long, m As Object
 Set m = CreateObject("Scripting.Dictionary")
 Do Until i = 23
 v = Int((72 - 2 + 1) * Rnd() + 2)
 If Not m.Exists(v) Then m.Add v, v: i = i + 1
 Loop
 T = m.Items
 For i = 0 To UBound(T)
 Feuil2.Cells(i + 9, 3) = Feuil1.Cells(T(i), 1)
 Feuil2.Cells(i + 9, 4) = Feuil1.Cells(T(i), 3)
 Feuil2.Cells(i + 9, 5) = Feuil1.Cells(T(i), 5)
 Next i
 Set m = Nothing: Erase T
End Sub

Non il ne faut pas trier , mais il me faut des commentaires pour comprendre (je suis un peu bête !!!!)
 

R@chid

XLDnaute Barbatruc
Re : Prélever 23 valeurs aléatoirement dans un tableau.

Salut,
le voila ton fichier sans tri ...
je peux pas te donner des commentaires sur les solutions en VBA presentes par mes amis puisque je ne sais pas en faire.
Amicalement
 

Pièces jointes

  • Alea_Rachid_Alea-Sansdoublons.xls
    40.5 KB · Affichages: 36

youky(BJ)

XLDnaute Barbatruc
Re : Prélever 23 valeurs aléatoirement dans un tableau.

Bonjour à tous,..... je vois que nous sommes nombreux sur le fil.
Pour controlo, voici des commentaires afin de comprendre le principe qui reste l'essentiel.
A savoir le principe de ma macro date de plus de 15 ans et l'ai fait seul.
Je viens de voir que la macro de mapomme est très bien et doit gagné qlq milisecondes sur la mienne.
Voici mes commentaires

Bruno

Code:
Private Sub CommandButton1_Click()
Feuil2.[C9:E31].ClearContents ' on efface l'ancien tableau
Dim deja(1 To 100) As Boolean 'on dimensionne la variable deja (vrai ou faux)
Dim lig(1 To 30) As Long ' idem mais pour N°ligne
Randomize ' Initialise le générateur de nombres aléatoires
Do 'Do>Loop....repete à l'infinit jusqu'a exit DO
n = Int(Rnd * 70) + 2 'tirage aléatoire entre 2 et 72
If Not deja(n) Then deja(n) = True: i = i + 1: lig(i) = n 'si n n'est pas deja sorti lig(i)=n ..i étant incrémenté
If i = 23 Then Exit Do ' on sort
Loop 'le Do loop
For k = 1 To 23 ' boucle de 1 à 23
Feuil2.Cells(k + 8, 3) = Feuil1.Cells(lig(k), 1) 'k+8 est la ligne en feuil2
Feuil2.Cells(k + 8, 4) = Feuil1.Cells(lig(k), 3) 'lig(k) est le N° ligne du tirage au sort ..i étant remplacé par k avec la boucle
Feuil2.Cells(k + 8, 5) = Feuil1.Cells(lig(k), 5)
Next
Feuil2.Select
End Sub
 

controlo

XLDnaute Occasionnel
Re : Prélever 23 valeurs aléatoirement dans un tableau.

Bonjour à tous,..... je vois que nous sommes nombreux sur le fil.
Pour controlo, voici des commentaires afin de comprendre le principe qui reste l'essentiel.
A savoir le principe de ma macro date de plus de 15 ans et l'ai fait seul.
Je viens de voir que la macro de mapomme est très bien et doit gagné qlq milisecondes sur la mienne.
Voici mes commentaires

Bruno

Code:
Private Sub CommandButton1_Click()
Feuil2.[C9:E31].ClearContents ' on efface l'ancien tableau
Dim deja(1 To 100) As Boolean 'on dimensionne la variable deja (vrai ou faux)
Dim lig(1 To 30) As Long ' idem mais pour N°ligne
Randomize ' Initialise le générateur de nombres aléatoires
Do 'Do>Loop....repete à l'infinit jusqu'a exit DO
n = Int(Rnd * 70) + 2 'tirage aléatoire entre 2 et 72
If Not deja(n) Then deja(n) = True: i = i + 1: lig(i) = n 'si n n'est pas deja sorti lig(i)=n ..i étant incrémenté
If i = 23 Then Exit Do ' on sort
Loop 'le Do loop
For k = 1 To 23 ' boucle de 1 à 23
Feuil2.Cells(k + 8, 3) = Feuil1.Cells(lig(k), 1) 'k+8 est la ligne en feuil2
Feuil2.Cells(k + 8, 4) = Feuil1.Cells(lig(k), 3) 'lig(k) est le N° ligne du tirage au sort ..i étant remplacé par k avec la boucle
Feuil2.Cells(k + 8, 5) = Feuil1.Cells(lig(k), 5)
Next
Feuil2.Select
End Sub


Youki ,

J'aimerais comprendre comment tu dimensionne tes deux tableaux deja et lig ?
 

controlo

XLDnaute Occasionnel
Re : Prélever 23 valeurs aléatoirement dans un tableau.

Youki ,

J'aimerais comprendre comment tu dimensionne tes deux tableaux deja et lig ?Et je voudrais savoir comment les dimensionnés si j'augmente le nombre de ligne de mon tableau en feuille1 par jusqu'à 120 valeurs

Merci
 

ROGER2327

XLDnaute Barbatruc
Re : Prélever 23 valeurs aléatoirement dans un tableau.

Bonjour à tous


Une synthèse des contributions de youky(BJ), mapomme et des miennes (que les autres me pardonnent !) dans le classeur joint.
Les méthodes de mapomme et les miennes sont fondamentalement les mêmes. Elles ne se distinguent que par leur mise en œuvre.
Celle de youky(BJ) est différente par sa technique de sélection des données. Il utilise un dictionnaire dont l'élaboration nécessite en moyenne 28 boucles pour choisir les 23 lignes. Les autres créent une liste ordonnée de 23 entiers consécutifs (de 0 à 22, ou de 1 à 23), puis y introduisent du désordre.

Pour l'affichage des résultats, les méthodes de youky(BJ) et mapomme sont différentes des miennes puisqu'ils écrivent une à une les données dans la feuille de résultats. J'ai préféré utiliser un tableau dans le code pour enregistrer les données sélectionnées, puis les afficher en une seule fois. Cette solution est avantageuse si la procédure agit dans un milieu chargé de procédures évènementielles nombreuses ou lourdes : elles ne seront déclenchée qu’une seule fois (ou deux si on fait un tri dans la feuille, comme avec ROGER2327 (2)) contre 69 fois (ou 70 avec mapomme (2)) en écrivant les résultats un à un. Et c'est là qu'on perdra le plus de temps...​


ROGER2327
#5557


Lundi 2 Pédale 139 (Saint André Marcueil, ascète cycliste - fête Suprême Quarte)
6 Ventôse An CCXX, 6,9365h - asaret
2012-W08-6T16:38:51Z
 

Pièces jointes

  • Tirages_sans_doublons_179376.xls
    81 KB · Affichages: 35

laetitia90

XLDnaute Barbatruc
Re : Prélever 23 valeurs aléatoirement dans un tableau.

rebonjour tous :):):):):):):):)

code a peu pres identique que l'ami youky(BJ)

la difference pour generer les nombres je passe par un object par definition un object est unique
la j'utilise
Code:
Scripting.Dictionary
j'aurais trés bien peu prende directement Dictionary plus rapide dans certains cas
je mets les nombres generer dans un tableau
Code:
T = m.Items
je boucle sur ce tableau & j'ecris en feuille2
Code:
For i = 0 To UBound(T)
charge en memoire avec la ligne precedente
je vide le tableau ici
Code:
T
par erase & vide
Code:
Dictionary
cela peut etre tres important sur certains code


par contre l'ami youky(BJ) parle de vitesse d'exe...

pour 23 lignes j'ai fait simple suffisant pour cela
autrement pour la vitesse si tu dois travailler sur un tres grand nombres de lignes

la pas d"erreurs il faut prendre le code de l' ami roger:):):) mois d'une seconde sur 10000 lignes pour 3 column
il
Code:
redim
un tableau

attention pas simple a comprendre les tableaux on est un peu dans du virtuel :p:p:p
j'ai mis un moment a maitriser cela & je pleure encore des fois:eek::eek::eek:

autrement ce qu'a fait l'ami rachid c'est tres bien aussi:):)


ps pas vu les 2 derniers messages
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 323
Messages
2 087 291
Membres
103 510
dernier inscrit
baloty