[déplacé VB.NET -> VBA] Tirage aléatoire - Extraction d'une donnée

Résolu
cs_Lilie23 Messages postés 6 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010 - 12 janv. 2010 à 11:37
cs_Lilie23 Messages postés 6 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010 - 13 janv. 2010 à 16:45
Bonjour, je suis débutante en VBA et un peu bloquée, je viens donc quérir votre aide.

Je crée une liste (en rouge) puis, l'utilise dans un for each pour générer des valeurs aléatoires.

Le problème c'est que mon code actuel génère un tirage avec remise et je voudrais le générer sans remise.

Je cherche donc, dans mon for each, à supprimer la ligne une fois utilisée (ici la ligne R) de ma liste Rg.

Est-ce possible?

Bien cordialement,

Sub GenererTetesSerie()

Dim Adr1 As String, Adr As String


NomFeuilleListe = "Participants"     
Adr = "C3:C6"              
Adr1 = "A3,A12,A21,A32"            
NomFeuilleRes = "Poules"

With Worksheets(NomFeuilleListe)
    Set Rg = .Range(Adr)
End With
With Worksheets(NomFeuilleRes)
    Set Rg1 = .Range(Adr1)
End With

Application.ScreenUpdating = False
On Error Resume Next
Nb = Rg.Rows.Count
For Each Cell In Rg1
    Do
    R = Int((Nb * Rnd) + 1)
    Cell.Value = Rg(R)
    C.Add "zaza", Cell.Text
    If Err <> 0 Then Err = 0
    Loop Until Cell <> ""
Next
Set Rg Nothing: Set Rg1 Nothing

End Sub

10 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 janv. 2010 à 21:45
BVon...
Un petit exercice pour toi (c'est le jour)...
Sur une feuille Feuil1 :
1) en cellule C3 : "mon zozo", en C4, "son frère", en C5 : "son cousin", en C6, "sa voisine"
2) un bouton de commande et ce code :
Private Sub CommandButton1_Click()
 Dim montab(3) As String, i As Integer, nb As Integer, oyu As Integer
 For i = 3 To 6
   montab(i - 3) = Sheets("feuil1").Range("C" & i)
 Next
 Randomize Timer
 nb = UBound(montab)
 For i = 0 To nb \ 2
  ou = Int(((nb - i) * Rnd))
  temp = montab(ou)
  montab(ou) = montab(nb - i)
  montab(nb - i) = temp
 Next
  madistrib = Array("A3", "A12", "A21", "A32")
  For i = 0 To nb
   Sheets("feuil2").Range(madistrib(i)).Value = montab(i)
  Next
End Sub


Lance, clique...===>> va voir ce qui s'est passé sur feuil2 ...
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 janv. 2010 à 11:42
Ben... ('je vois que tu as tout compris de mon cvode )
Il te suffit de remplacer
1) les 2 1ères lignes par ceci :
Dim montab(3) As String, i As Integer, nb As Integer, ou As Integer, nombre_a_tirer As Integer
 nombre_a_tirer = 2 ' <====== ben...tu définis ici le nombre à tirer

2) les 3 dernières par ceci :
For i = 0 To nombre_a_tirer - 1
   Sheets("feuil2").Range(madistrib(i)).Value = montab(i)
Next


Explications, pour que tu saches ce que tu fais ;
voilà l'ordre des opérations faites par mon code :
- constitution d'un tableau (contenant les valeurs des colonnes C3 à C6)
- "touillage" (comme avec un jeu de cartes) des valeures de ce tableau ===>> tout y est mélangé aléatoirement
- extraction, dans l'ordre touillé, du nombre nb que l'on veut (comme tout est mélangé, l'extraction de l'indice 0 à l'indice nb est également forcément aléatoire)

Pigé ?
____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 janv. 2010 à 14:52
Bonjour,

1) Tu aurais du nous préciser ce qu'est C ! on devine bien que c'est le nom d'une listbox, mais nous n'en connaissons pas les propriétés...
2) tu t'y prends mal . Pourquoi ne pas constituer d'abord la liste, dans ta listbox, liste composée de tous les éléments de ta plage Rg ? Il te suffirait alors ensuite de tirer aléatoirement dans ta listbox, ce qui te permettrait de ne pas supprimer de ligne dans ta plage Rg.
Comment tirer aléatoirement sans doublons dans une listbox ? ===>> regarde dans les sources déposées par jmfmarques : tu y trouveras ta solution
3) les "on error resume next" sont à éviter soigneusement lorsqu'inutiles ! Ils ne sont pas là pour faire face à des carences du développeur (qui doit tout simplement écrire son code sans les générer), mais pour faire face à des erreurs qu'il ne saurait gérer (indépendantes de lui et de la sagesse de son code, donc !).




____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
cs_Lilie23 Messages postés 6 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010
12 janv. 2010 à 16:19
Bonjour et merci de me répondre, l'avantage que je trouvais à ce code c'est que je peux sélectionner ma liste dans une feuille et éparpiller les résultats dans une autre.

J'ai regardé le code de jmfmarques, ici : http://www.vbfrance.com/codes/EXTRAIRE-NOMBRES-ALEATOIRES-SANS-DOUBLONS_40774.aspx

Je n'arrive pas à l'executer, il me dit "erreur 424 : objet requis".

En parallèle j'ai rédigé ceci après avoir gribouillé mon algo :
Sub GenererTetesSerie()

Top = 4
Dim Adr1 As String, Adr As String
Dim flag() As Integer
ReDim flag(Top)
For i = 1 To Top
        flag(i) = 1
        Next i

'nom de la feuille où se trouve les données
NomFeuilleListe = "Participants"     'A adapter
'Plage liste de tous les noms
Adr = "C3:C6"              'A adapter
'Plage où sera copiée la sélection retenue
Adr1 = "A3,A12,A21,A32"            'A adapter
NomFeuilleRes = "Poules"

With Worksheets(NomFeuilleListe)
    Set Rg = .Range(Adr)
End With
With Worksheets(NomFeuilleRes)
    Set Rg1 = .Range(Adr1)
End With

Application.ScreenUpdating = False
On Error Resume Next

For Each Cell In Rg1
    Do
Nb = Rg.Rows.Count
    R = Int((Nb * Rnd) + 1)
    If flag(R) = 1 Then
                            flag(R) = 0
                     
                    Else
                    While flag(R) = 0
                    sortie = Int(Rnd() * Top) + 1
                    Wend
                             flag(R) = 0
                    End If

    Cell.Value = Rg(R)

    Loop Until Cell <> ""
Next
Set Rg Nothing: Set Rg1 Nothing

End Sub


Ca ne marche pas et je n'arrive pas à trouver pourquoi.

Autant dire que je me retrouve au point mort.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
12 janv. 2010 à 18:23
Ca ne marche pas car tu as tout fait, sauf ce que je t'ai dit de faire !
Allez, explique-moi simplement et clairement
1) sur quelles cellules tu veux tirer aléatoirement ('et combien au total sont-elles)
2) ce qu'elles contiennent
3) sur quoi (je te propose une listbox) tu veux afficher tes tirages
4) combien de tirages tu dois faire sur l'ensemble de tes cellules.

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
cs_Lilie23 Messages postés 6 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010
12 janv. 2010 à 20:36
Ok, merci pour ton attention.

1 : C3 à C6 sur la feuille "Participants" (il me les faut toutes --> 4)
2: elles contiennent des noms (String)
3 : dispachées aléatoirement sur les cellules A3,A12,A21,A32 de la feuille "Poules"
4 : Je n'en fait qu'un

Ceci me permettrait de générer mes poules pour un tournoi de jeux vidéos.

Merci encore de ton aide
0
cs_Lilie23 Messages postés 6 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010
13 janv. 2010 à 09:33
Merci beaucoup pour ton aide ucfoutu, ça marche à la perfection!
0
cs_Lilie23 Messages postés 6 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010
13 janv. 2010 à 11:15
Par contre, dernière question, promis ^^
Si je veux faire une selection plus précise (par exemple, sur les 4 je ne voudrais en choisir que 2) que dois-je modifier?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
13 janv. 2010 à 11:57
MLaintenant ...
Si tu veux en plus pouvoir choisir sur ta feuille les seuls joueurs parmi lesquels tirer (et les tirer alors tous pour les répartir sur ta feuille2 dans l'ordre touillé), tu le dis et je fais (mais ce sera ma dernière participation à ton appli, sinon ce sera moi qui te l'aurait faite complètement ou presque, ce qui n'est pas ma tassez de thé).
Si tu veux développer, il te faut y mettre un peu du tien (et la chose devrait être facile, avec mes différents codes + celui (le dernier) que je ferai pour cette appli)

____________________
Très intéressante fable, L'OISELEUR, L'AUTOUR ET L'ALOUETTE !
Cliquer sur "Réponse acceptée" (en bas d'une solution avérée adéquate) rendra service à d'autres. PENSEZ-Y.
0
cs_Lilie23 Messages postés 6 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 13 janvier 2010
13 janv. 2010 à 16:45
Je te remercie, j'ai tout compris et je pense pouvoir me débrouiller sans t'importuner plus.

Merci pour tout.
0
Rejoignez-nous