Tirage Aléatoire de valeurs dans un tableau

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
 

gibson92

XLDnaute Junior
Re : Tirage Aléatoire de valeurs dans un tableau

Bonjour et merci pour les explications

Je vous envoie un échantillon du fichier excel (l'original contient 615 000 lignes) sur lequel je dois travailler puisque je l'ai à disposition, puis le code VBA que vous m'avez fait que j'ai quelque peu modifié

Je dois tirer aléatoirement des valeurs d'index que j'efface dans la feuille 1 que je mets dans la feuille 2 en compagnie des 2 autres colones (ref compteur et date)

Le problème est que je tire aléatoirement la même ligne plusieurs fois dans le meme tirage...ce qui n'est pas mon souhait
Je trouve donc dans ma deuxième feuille des index vides tirés une première fois que j'ai effacés dont j'aimerai me débarrasser

Pouvez vous regarder le code VBA éxécuté à l'exemple que je vous envoie et me dire ce que je dois modifier pour ne plus avoir de doublons?
Le i correspond au nombre de tirage aléatoire que je souhaite effectuer, il est à 200 dans cet exemple

Merci


Sub TirageAlé()
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
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
Le = LDéb + Int(Rnd * (LFin - LDéb + 1))
If Feuil1.Cells(Le, "B").Value <> "" Then
DateTirée = CDate(Feuil1.Cells(Le, "B").Value)
If DateTirée >= DateDéb And DateTirée <= DateFin Then

Feuil2.Cells(i, "A").NumberFormat = Feuil1.Cells(Le, "A").NumberFormat
Feuil2.Cells(i, "A").Value = Feuil1.Cells(Le, "A").Value
Feuil2.Cells(i, "B").Value = Feuil1.Cells(Le, "B").Value
Feuil2.Cells(i, "C").Value = Feuil1.Cells(Le, "C").Value: Feuil1.Cells(Le, "C").ClearContents
Feuil1.Cells(Le, "D").Value = "Selectionnée"
i = i + 1
End If
End If
Loop

End Sub
 

Pièces jointes

  • exemple.xls
    44 KB · Affichages: 94
  • exemple.xls
    44 KB · Affichages: 90
  • exemple.xls
    44 KB · Affichages: 100

Dranreb

XLDnaute Barbatruc
Re : Tirage Aléatoire de valeurs dans un tableau

Bonsoir.
Il y a deux problème dans votre code:
1) - Vous n'effacez plus la date tirée Cells(Le, "B"), c'est donc normal que vous puissiez retomber dessus puisque c'est elle qu'on testait Jusqu'à présent non vide. Il faut donc plutot tester maintenant la Cells(Le, "C") <> "" ou la Cells(Le, "D") <> "Selectionnée".
2) - Vous ne faite pas 200 tirages aléatoire, là, mais 200 tentatives de tirages. Est-ce ce que vous voulez après tout ? Ce serait moins dangereux que d'en vouloir 200 à tout prix ! Une fois épuisées toute les dates comprises entre les 2 bornes, ça ne s'arrêterait plus de tourner !
À +
 

pierrejean

XLDnaute Barbatruc
Re : Tirage Aléatoire de valeurs dans un tableau

Bonjour gibson92

Salut Dranreb

Pour le cas ou il faut 200 tirages

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 < 200
Le = LDéb + Int(Rnd * (LFin - LDéb + 1))
If Feuil1.Cells(Le, "B").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
Feuil2.Cells(i, "A").NumberFormat = Feuil1.Cells(Le, "A").NumberFormat
Feuil2.Cells(i, "A").Value = Feuil1.Cells(Le, "A").Value
Feuil2.Cells(i, "B").Value = Feuil1.Cells(Le, "B").Value
Feuil2.Cells(i, "C").Value = Feuil1.Cells(Le, "C").Value: Feuil1.Cells(Le, "C").ClearContents
Feuil1.Cells(Le, "D").Value = "Selectionnée"
i = i + 1
End If
End If
Wend
'Loop
End Sub
 

gibson92

XLDnaute Junior
Re : Tirage Aléatoire de valeurs dans un tableau

1) OK je vais corriger ceci

2) je veux faire 200 tirages, (ceci est un exemple dans la réalité c'est beaucoup plus), mais j'aimerai paramétrer le nombre de tirage comme je le fais.
Avez vous une idée pour remédier à ce problème?

Merci
 

Dranreb

XLDnaute Barbatruc
Re : Tirage Aléatoire de valeurs dans un tableau

Bonjour.
VB:
Sub TirageAlé()
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, NTnt As Long
DateDéb = CDate(InputBox("Date mini", "TirageAlé"))
DateFin = CDate(InputBox("Date maxi", "TirageAlé"))
LDéb = 2: LFin = Feuil1.[A65536].End(xlUp).Row
Randomize
For Ls = 1 To 200
   NTnt = 0
   Do
      If NTnt >= 100000 Then MsgBox NTnt & " tentatives infructueuses d'obtenir le tirage ligne " _
         & Ls & ". ==> Abandon", vbCritical + vbExclamation, "TirageAlé": Exit Sub
      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 Exit Do
         End If
      NTnt = NTnt + 1: Loop
   Feuil2.Cells(Ls, "A").NumberFormat = Feuil1.Cells(Le, "A").NumberFormat
   Feuil2.Cells(Ls, "A").Value = Feuil1.Cells(Le, "A").Value
   Feuil2.Cells(Ls, "B").Value = Feuil1.Cells(Le, "B").Value
   Feuil2.Cells(Ls, "C").Value = Feuil1.Cells(Le, "C").Value: Feuil1.Cells(Le, "C").ClearContents
   Feuil1.Cells(Le, "D").Value = "Selectionnée"
   Next Ls
End Sub
À +
 

gibson92

XLDnaute Junior
Re : Tirage Aléatoire de valeurs dans un tableau

Bonjour,

J'aurais une dernière petite question en ce qui concerne le tirage aléatoire.
Ce code VBA ci dessous appliqué au fichier excel exemple ci joint me tire donc pour chaque référence une ou plusieurs valeurs dans la feuille 1 qu'il renvoie (avec la référence et la date) dans la feuille 2.

Ce code fonctionne bien.

J'aimerai apporter une amélioration c'est à dire que pour chaque valeur tirée aléatoirement pour chaque référence, j'aimerai qu'on me renvoie les valeurs à partir date tirée aléatoirement jusqu'au 30 septembre (il s'agit de la dernière date) et me renvoyer idem que dans le code initial toute la ligne dans la feuille 2 et supprimer uniquement les valeurs dans la feuille 1

Par exemple pour une référence j'ai la valeur du 15 septembre qui est tirée, donc les valeurs du 15 au 30 septembre sont supprimées dans la feuille 1 et me sont retournées avec leur date et réference dans la feuille 2, pour une autre référence j'ai la valeur du 23 septembre qui est tirée, donc les valeurs du 23 au 30 septembre sont supprimées dans la feuille 1 et me sont retournées avec leur date et réference dans la feuille 2, etc...
Pouvez vous m'indiquer les modifications à apporter dans le code ci dessous?
Merci

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 < 300000
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
Feuil2.Cells(i, "A").NumberFormat = Feuil1.Cells(Le, "A").NumberFormat
Feuil2.Cells(i, "A").Value = Feuil1.Cells(Le, "A").Value
Feuil2.Cells(i, "B").Value = Feuil1.Cells(Le, "B").Value
Feuil2.Cells(i, "C").Value = Feuil1.Cells(Le, "C").Value: Feuil1.Cells(Le, "C").ClearContents
Feuil1.Cells(Le, "D").Value = "Selectionnée"
i = i + 1
End If
End If
Wend
'Loop
End Sub
 

Pièces jointes

  • exemple.xls
    44 KB · Affichages: 76
  • exemple.xls
    44 KB · Affichages: 83
  • exemple.xls
    44 KB · Affichages: 87

Dranreb

XLDnaute Barbatruc
Re : Tirage Aléatoire de valeurs dans un tableau

Bonsoir
Je pense que vous avez désormais suffisamment d'exemples de programmations correctes pour être capable d'écrire vous même ce que vous comprenez vouloir faire, et dans quel but.
Cordialement.

P.S. Pourquoi utilisez vous une collection ???
Ce n'est aucunement nécessaire si vous diposez d'un autre critère pour ne pas réemployer une date déjà tirée.
 
Dernière édition:

gibson92

XLDnaute Junior
Re : Tirage Aléatoire de valeurs dans un tableau

Bonjour
Si j'avais la science infuse je ne serai pas venu sur ce forum demander de l'aide
Je n'ai jamais programmé de ma vie, cela fait une semaine que j'ai découvert les macros et le langage VB
Chaque ligne du code que je vous ai montré provient des aides que j'ai eu sur cette page, et je vous en remercie Atout de même ent
J'essaie au minimum de comprendre des choses dans ce code, donc je me contente pas de demander mais aussi de comprendre
Maintenant personne n'est un pro du VBA comme vous, il faut l'accepter
 

pierrejean

XLDnaute Barbatruc
Re : Tirage Aléatoire de valeurs dans un tableau

Re
@ gibson92

J'ais vainement cherché à comprendre ce que vous souhaitez au vu du melange entre expressions (valeurs d'index , compteur ,intervalle de date avec une date finale au 30) et code initial
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

@ Dranreb

Je suis navré que gibson ait opté pour mon code (peu professionnel je l'admet volontiers, mais XLD n'est pas uniquement reservé aux pros)
 

gibson92

XLDnaute Junior
Re : Tirage Aléatoire de valeurs dans un tableau

Bonjour Pierre Jean

En gros j'essaie de faire la même chose qu'avant sauf qu'au lieu de me ramener la valeur aléatoire tirée, j'aimerai que cela me ramène la plage de valeur à partir de la date tirée aléatoirement jusqu'au 30 septembre à chaque fois

En gros dans ce que vous me proposiez par exemple si je tire 2 dates aléatoires une valeur était tirée le 20 septembre et l'autre de 23 elles m'étaient ramener dans la feuille 2 toutes les 2

Maintenant j'aimerai ramener les valeur du 20 au 30 septembre et du 23 au 30 sept

Pour les expressions dans mon fichier excel cela reste les mêmes sauf que je les ai renommés

Merci pour votre aide en tt cas
 

Dranreb

XLDnaute Barbatruc
Re : Tirage Aléatoire de valeurs dans un tableau

Bonjour Pierrejean.
Je tiens à préciser qu'il n'y avait dans ma proposition nulle critique de ton code insinuée.
Il aurait le mérite de marcher dans divers cas sans se préoccuper du problème.
Mais le demandeur employait cette collection sans l'utiliser dans ce but.
Cordialement.



j'aimerai que cela me ramène la plage de valeur à partir de la date tirée aléatoirement jusqu'au 30 septembre à chaque fois
alors il est évident que Ls ne peut plus être utilisé comme compteur de la grande boucle. Utilisez donc une autre variable pour ça; Ls lui est mis à 1 au départ, et dans une toute petite boucle plus bas (instruction Do ou While) vous l'incrémentez et notez toutes les dates jusqu'à une qui atteind le 30 septembre.
À +
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 671
Messages
2 090 764
Membres
104 658
dernier inscrit
amomo