Tirage Aléatoire de valeurs dans un tableau

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

gibson92

XLDnaute Junior
Bonjour,

J'aimerai effectué sous Excel (ou Access) un tirage aléatoire de nombre suivant des dates, par exemple:

Date Valeur

01/01/2011 12
02/01/2011 40
...
31/01/2011 160

J'aimerai choisir une plage de données de date (14/01/2011 au 22/01/2011) ou je tire aléatoirement des valeurs qui sont supprimées (case blanche) dans le tableau d'origine et qui me sont retournées ailleurs (dans un autre tableau).

Avez vous des propositions à me faire
Merci par avance
 
Re : Tirage Aléatoire de valeurs dans un tableau

Re

A tester:

Code:
Sub TirageAlé_a()
Dim DateDéb As Date, DateFin As Date, DateTirée As Date, LDéb As Long, LFin As Long, Le As Long, Ls As Long, i As Long
Dim coll As New Collection
Feuil2.Cells.ClearContents
DateDéb = CDate(InputBox("Date mini", "TirageAlé"))
DateFin = CDate(InputBox("Date maxi", "TirageAlé"))
LDéb = 2: LFin = Feuil1.Cells(Feuil1.Rows.Count, "A").End(xlUp).Row
i = 1
Randomize
'Do Until i = 200
While coll.Count < 5
Le = LDéb + Int(Rnd * (LFin - LDéb + 1))
If Feuil1.Cells(Le, "C").Value <> "" Then
DateTirée = CDate(Feuil1.Cells(Le, "B").Value)
If DateTirée >= DateDéb And DateTirée <= DateFin Then
On Error Resume Next
coll.Add DateTirée
On Error GoTo 0
cpt = 0
 For n = DateTirée To CDate("30/" & Month(DateTirée) & "/" & Year(DateTirée))
  Feuil2.Cells(i, "A").NumberFormat = Feuil1.Cells(Le, "A").NumberFormat
  Feuil2.Cells(i, "A").Value = Feuil1.Cells(Le + cpt, "A").Value
  Feuil2.Cells(i, "B").Value = Feuil1.Cells(Le + cpt, "B").Value
  Feuil2.Cells(i, "C").Value = Feuil1.Cells(Le + cpt, "C").Value: Feuil1.Cells(Le + cpt, "C").ClearContents
  Feuil1.Cells(Le + cpt, "D").Value = "Selectionnée"
  i = i + 1
  cpt = cpt + 1
 Next n
End If
End If
Wend
'Loop
End Sub
 
Re : Tirage Aléatoire de valeurs dans un tableau

Cela marche merci beaucoup Pierre Jean
Est ce que vous pouvez m'expliquer ce que vous avez changé par rapport à l'ancien code?

Par contre est ce que cela tiens compte du fait qu'une fois qu'une date d'une référence compteur est tirée elle ne peut plus l'être?
Car le but c'est de tirer une date aléatoirement d'une référence compteur, de prendre jusqu au 30 sept, puis de ne plus toucher à cette référence compteur

Merci
 
Re : Tirage Aléatoire de valeurs dans un tableau

Re

Pour les explications voir le nouveau code commenté

Oui cela tient compte

Code:
Sub TirageAlé_a()
Dim DateDéb As Date, DateFin As Date, DateTirée As Date, LDéb As Long, LFin As Long, Le As Long, Ls As Long, i As Long
Dim coll As New Collection
Feuil2.Cells.ClearContents
DateDéb = CDate(InputBox("Date mini", "TirageAlé"))
DateFin = CDate(InputBox("Date maxi", "TirageAlé"))
LDéb = 2: LFin = Feuil1.Cells(Feuil1.Rows.Count, "A").End(xlUp).Row
i = 1
nbtirages = 0
limite = 10000
Randomize
'Do Until i = 200
'tant que la collection n'atteint pas le nombre de tirages specifié
While coll.Count < 5
'choisir un N° de ligne entre Ldéb et LFin
Le = LDéb + Int(Rnd * (LFin - LDéb + 1))
'Si la cellule colonne "C" pour la migne concernée n'est pas vide
' ce qui serait le cas si la ligne avait deja été tirée
If Feuil1.Cells(Le, "C").Value <> "" Then
'definir la date tirée : Valeur de la ligne choisie colonne B
DateTirée = CDate(Feuil1.Cells(Le, "B").Value)
'S'assurer que cette date est comprise dans l'intervalle fixé par les inputbox
If DateTirée >= DateDéb And DateTirée <= DateFin Then
'si oui
'enregistrer dans la collection
On Error Resume Next
coll.Add DateTirée
On Error GoTo 0
'initialiser un compteur pour definir la ligne ou ecrire
cpt = 0
'boucle travaillant de la date choisie jusqu'au trente du meme mois de la meme année
 For n = DateTirée To CDate("30/" & Month(DateTirée) & "/" & Year(DateTirée))
 'ecrire en Feuil2
  Feuil2.Cells(i, "A").NumberFormat = Feuil1.Cells(Le, "A").NumberFormat
  Feuil2.Cells(i, "A").Value = Feuil1.Cells(Le + cpt, "A").Value
  Feuil2.Cells(i, "B").Value = Feuil1.Cells(Le + cpt, "B").Value
  Feuil2.Cells(i, "C").Value = Feuil1.Cells(Le + cpt, "C").Value: Feuil1.Cells(Le + cpt, "C").ClearContents
  Feuil1.Cells(Le + cpt, "D").Value = "Selectionnée"
  'incrementer la ligne ou ecrire
  i = i + 1
   'incrementer le compteur pour chaque date entre la date choisie et le trente
  cpt = cpt + 1
 'fin de boucle
 Next n
End If
'increment du nb d'essais
nbtirages = nbtirages + 1
'alerte si nb d'essias depasse la limite
If nbtirages > limite Then
  MsgBox (limite & " tirages effectués sans atteindre le nombre souhaité")
  Exit Sub
End If
End If
Wend
'Loop
End Sub
 
Re : Tirage Aléatoire de valeurs dans un tableau

Merci beaucoup pour ces explications Pierre Jean
Par contre, une référence compteur peut être tirée plusieurs fois de suite
Par exemple un 1er tirage sur une référence a lieu le 23/09 et me retourne bien les valeurs du 23 au 30, puis sur la même référence un deuxième tirage a lieu au 18/09 et me retourne les valeurs du 18 au 30 avec des valeurs vides du 23 au 30 puisque tiré précédemment
 
Re : Tirage Aléatoire de valeurs dans un tableau

Re

Ce qui gêne c'est qu'une valeur aléatoire est tirée plusieurs fois de suite dans la même référence, elle ne devrait l'être qu'une seule fois.
Donc cela engendre des cases vides dans la feuille 2 car comme je le disais quand pour la même référence on tire une première fois une valeur au 23/09, cela renvoie dans la feuille 2 les valeurs du 23 au 30 (qui sont rendus vide dans la feuille1), puis on tire une deuxième fois une valeur au 16/09, cela renvoie les valeurs du 16 au 30 dans la feuille 2 avec les valeurs du 23 au 30 vides car elles ont été rendu vides au 1er tirage
En gros il n'y aura plus de problème de cases vides si une seule valeur est tirée chaque référence
 
Re : Tirage Aléatoire de valeurs dans un tableau

Re
voici ce que je disais precedemment
Par ailleurs la structure de la feuill1 me laisse a penser que vous cherchez plutot a choisir aleatoirement une reference pour ensuite en extraire l'intervalle entre un jour et le 30
Pouvez vous donner une explication plus claire de ce qu'il y a lieu de faire

Code:
Sub TirageAlé_a()
Dim DateDéb As Date, DateFin As Date, DateTirée As Date, LDéb As Long, LFin As Long, Le As Long, Ls As Long, i As Long
'creer un dictionaire qui contiendra les ref tirées
Set d = CreateObject("scripting.dictionary")
Feuil2.Cells.ClearContents
DateDéb = CDate(InputBox("Date mini", "TirageAlé"))
DateFin = CDate(InputBox("Date maxi", "TirageAlé"))
LDéb = 2: LFin = Feuil1.Cells(Feuil1.Rows.Count, "A").End(xlUp).Row
i = 1
nbtirages = 0
limite = 10000
Randomize
'Do Until i = 200
'tant que le nbre de ref dans le dictionaire n'atteint pas le nombre de tirages specifié
While d.Count < 4
'choisir un N° de ligne entre Ldéb et LFin
Le = LDéb + Int(Rnd * (LFin - LDéb + 1))
'definir la date tirée : Valeur de la ligne choisie colonne B
DateTirée = CDate(Feuil1.Cells(Le, "B").Value)
'definir la reference associée
ref = Feuil1.Cells(Le, "A").Value
'S'assurer que cette date est comprise dans l'intervalle fixé par les inputbox
'et que la ref n'est pas deja dans le dictionaire
If DateTirée >= DateDéb And DateTirée <= DateFin And Not d.exists(ref) Then
'si oui
'mettre la ref dans le dictionaire
d(ref) = ref
'initialiser un compteur pour definir la ligne ou ecrire
cpt = 0
'boucle travaillant de la date choisie jusqu'au trente du meme mois de la meme année
 For n = DateTirée To CDate("30/" & Month(DateTirée) & "/" & Year(DateTirée))
 'ecrire en Feuil2
  Feuil2.Cells(i, "A").NumberFormat = Feuil1.Cells(Le, "A").NumberFormat
  Feuil2.Cells(i, "A").Value = Feuil1.Cells(Le + cpt, "A").Value
  Feuil2.Cells(i, "B").Value = Feuil1.Cells(Le + cpt, "B").Value
  Feuil2.Cells(i, "C").Value = Feuil1.Cells(Le + cpt, "C").Value
  Feuil1.Cells(Le + cpt, "C").ClearContents
  Feuil1.Cells(Le + cpt, "D").Value = "Selectionnée"
  'incrementer la ligne ou ecrire
  i = i + 1
   'incrementer le compteur pour chaque date entre la date choisie et le trente
  cpt = cpt + 1
 'fin de boucle
 Next n
End If
'increment du nb d'essais
nbtirages = nbtirages + 1
'alerte si nb d'essias depasse la limite
If nbtirages > limite Then
  MsgBox (limite & " tirages effectués sans atteindre le nombre souhaité")
  Exit Sub
End If
Wend
'Loop
End Sub
 
Re : Tirage Aléatoire de valeurs dans un tableau

Si je tirerai une référence aléatoirment cela laisserai supposer qu'on ne tiendrait pas compte de la date?
Dsl si cela n'est pas clair, je vais essayer de l'être:
Je veux tirer une date aléatoirement (qui est associée à une référence on est d'accord je pense) mais qu'une seule fois par référence, c'est à dire que dès lors qu'une date est tirée pour le référence 333 par exemple, les prochains tirages ne devront pas tirer de date pour la référence 333
Et cette date me retournera les valeurs à partir de la date tirée jusqu'au 30 (mais ça vous l'avez compris)
Jsp avoir été clair
Merci
 
Re : Tirage Aléatoire de valeurs dans un tableau

Re
Ok ben super merci beaucoup, quel était la modication apportée?
Par contre j'ai voulu faire 20 000 tiarges et à la fin de l'éxécution j'ai eu le message suivant:"10 000 tirages effectués sans atteindre le nombre souhaité"
cela est du à quoi?
Encore merci
 
Re : Tirage Aléatoire de valeurs dans un tableau

Re

Est-ce si difficile de comprendre que pour 20000 tirages réussis il peut falloir plus de 10000 tirages qui reprennent la même reference sachant qu'il y a 30 fois moins de references que de lignes ???
Rappel: 615000 lignes soit 20500 references
on fait le choix aleatoire sur les lignes comme tu l'as demandé !!
Et d'ailleurs si limite etait a 30 000 le message aurait dit 30 000
 
Re : Tirage Aléatoire de valeurs dans un tableau

Bonjour,

J'ai fait un fichier classeur1.xls pour en faire comme le jeu Amigo de le Fdj, mais voilà pour le tirage des 7 numéros ça fonctionne, mais j'aimerais pouvoir ajouté dans mon tableau le tirage des 5 numéros bonus en jaune en plus des numéros bleus sélectionnés.

Pour le tirage des numéros bonus pas de possibilite de doublons avec les numéros bleus sélectionnés et de pouvoir lancer les 2 tirages à la suite et par le même bouton (Si cela c possible bien sur).

Serait-il possible aussi que lors des 2 tirage les numéros sorte dans un ordre indéterminé (ex: le 1er numéro sélectionnés et le 28 et le 2eme numéro c'est le 5.

Merci de vôtre aide
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour