Supprimer une valeur dans un array avec Randomize [Résolu]

GermPeru 166 Messages postés mercredi 7 décembre 2016Date d'inscription 5 décembre 2017 Dernière intervention - 5 déc. 2017 à 14:35 - Dernière réponse : GermPeru 166 Messages postés mercredi 7 décembre 2016Date d'inscription 5 décembre 2017 Dernière intervention
- 5 déc. 2017 à 19:59
Bonjour,

En ces périodes de fetes je fais une interface qui tire au "hasard" les gagnants ainsi que les cadeaux.

Pour traiter mes doublons dans mes tables je voudrais éliminer la valeur tiré au sort et ainsi réinitialisé ma table pour procéder a un nouveau tirage.

' fonction gagnant
'TPar est un array contenant la liste des participants, et TGani un array vide pour enregistrer les gagnants
Function TirageP(TPar As Variant, TGani As Variant)
Dim i%, Inti%
' un peu plus de la moitié des participants ont un cadeau
Inti = Int((UBound(TPar) / 2) + 0.5)
ReDim TGani(Inti)
Randomize
For i = 0 To Inti
 TGani(i) = TPar(Int(UBound(TPar) * Rnd))
'a ce moment sortir la valeur TGani dans ma table TPar
Next
End Function


Je n´ai pas vu de remove ou autre fonction donc pense que je dois passer par une boucle et une autre table temporaire mais la je bloque un peu...

J´utilise tout récement des tables, donc si vous avez des commentaires ludiques je suis prenneur aussi :)

Merci d´avance!
Afficher la suite 
166Messages postés mercredi 7 décembre 2016Date d'inscription 5 décembre 2017 Dernière intervention

11 réponses

Répondre au sujet
yg_be 4066 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 7 décembre 2017 Dernière intervention - 5 déc. 2017 à 15:04
0
Utile
10
bonjour, moi j'essaierais avec des Collections et pas des tables.
yg_be 4066 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 7 décembre 2017 Dernière intervention > GermPeru 166 Messages postés mercredi 7 décembre 2016Date d'inscription 5 décembre 2017 Dernière intervention - 5 déc. 2017 à 17:13
je trouve ceci très clair, en Anglais, cependant:
https://excelmacromastery.com/excel-vba-collections/
GermPeru 166 Messages postés mercredi 7 décembre 2016Date d'inscription 5 décembre 2017 Dernière intervention > yg_be 4066 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 7 décembre 2017 Dernière intervention - 5 déc. 2017 à 19:15
Function TirageP(TPar As Variant, TGani As Variant)
Dim i%, Inti%, j%
Dim myCol As Collection, Elmt As Variant
Set myCol = New Collection
For i = 0 To UBound(TPar)
    myCol.Add TPar(i)
Next i
Inti = Int((UBound(TPar) / 2) + 0.5): ReDim TGani(Inti)
Randomize
For i = 0 To Inti
TGani(i) = myCol(Int(1 + myCol.Count * Rnd))
    For j = myCol.Count To 1 Step -1
        If myCol(j) = TGani(i) Then myCol.Remove (j): Exit For
    Next j
Next i
End Function


Je croie que cela fonctionne:
- j´ai transféré les valeurs de ma table dans ma collection
- je fais un rnd ma colone de ma collection
- je boucle sur les élément de ma collection pour faire un remove sur l´element rencontré, et je sors de ma boucle

Ce la serait plus simple si j´avais la possibilité de faire un remove juste sur la valeur de l´élément et non pas sur son index colone... j ´aurai besoin d´un 'indexof' mais existe pas a ce que j´ai pu lireur cela que je passe par une boucle

Je reste attentif a tout type de commentaire

Merci yg_be
GermPeru 166 Messages postés mercredi 7 décembre 2016Date d'inscription 5 décembre 2017 Dernière intervention - 5 déc. 2017 à 17:54
euh un peu perdu, laisse moi le temps d´assimiler je te réponds quand j´ai une proposition réfléchie a faire... J'espere avant demain.

Merci
yg_be 4066 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 7 décembre 2017 Dernière intervention > GermPeru 166 Messages postés mercredi 7 décembre 2016Date d'inscription 5 décembre 2017 Dernière intervention - 5 déc. 2017 à 18:17
exemple:
Sub testcoll()
Dim tout As Collection, gag As Collection
Set tout = New Collection
Set gag = New Collection
Dim Item
tout.Add "moi1"
tout.Add "lui2"
tout.Add "elle3"
tout.Add "toi4"
tout.Add "5"
Call TirageP(tout, gag)
Debug.Print "__"
For Each Item In gag
    Debug.Print Item
Next Item
End Sub
Sub TirageP(CPar As Collection, CGani As Collection)
Dim i%, Inti%, auhasard As Integer
' un peu plus de la moitié des participants ont un cadeau
Inti = Int((CPar.Count / 2) + 0.5)
'ReDim TGani(Inti)
Randomize
For i = 1 To Inti
     auhasard = 1 + Int(CPar.Count * Rnd)
     CGani.Add CPar(auhasard)
    'a ce moment sortir la valeur TGani dans ma table TPar
    CPar.Remove (auhasard)
Next
End Sub
GermPeru 166 Messages postés mercredi 7 décembre 2016Date d'inscription 5 décembre 2017 Dernière intervention > yg_be 4066 Messages postés lundi 9 juin 2008Date d'inscriptionContributeurStatut 7 décembre 2017 Dernière intervention - 5 déc. 2017 à 19:59
Je viens tout juste de voir... bcp plus simple...

Un grand merci yg_be ta pédagogie m´a bcp aider a progreser, et plus d´une fois
Commenter la réponse de yg_be