VBA débutante création d'un RND sur une colonne sous conditions d'une liste
Bonjour,
j'ai besoins d'aide, je débute en VBA et en autodidacte.
j'ai beau tout essayer je n'arrive pas à faire une colonne de nombre aléatoire depuis une liste avec un nombre variable de noms
en colonne G j'ai ma liste de noms qui peut varier...
j'utilise la fonction RND pour créer en L une liste de nombre afin de récupérer un nom de G dans une autre colonne grace à une formule (jusque là ça va)
seulement vu que ma liste en G peut varier en nombre je souhaite automatiser ma colonne L afin que si je retire ou ajoute des noms ma colonne L se remplisse...
là je travaille sur une trentaine de noms mais le fichier final en comprendra 500 du coup je m'imagine pas retaper la fonction 500 fois
voici le code que j'ai, je n'arrive pas à dérouler le code le but étant de faire en sorte que si il y a un nom en G il y a un nombre en L
merci.
Sub OBC()
Dim colonne As Integer
colonne = 7
Do While ("g") <> Empty
[L2] = Rnd * 10
i = i + 1
loop
End Sub
je sais que ce n'est pas bon puisque cela ne fonctionne pas (j'ai tellement modifié mon code que je ne sais plus où j'en suis) : au départ j'ai testé juste la base soit avec G2 et L2 (début de ma liste)mais ensuite impossible de faire descendre jusqu'à ce que Gx soit vide. (à force de recommencer je ne sais même plus comment j'avais fait pour que cela fonctionne
si possible m'expliquer les codes employées, (je me suis acheté "la vba pour les nuls" mais je n'arrive pas à appliquer leur explication à mon besoin et j'aime comprendre ce que je fais, je ne voudrais pas juste recopier bêtement
merci de votre aide.
au départ c'est pour un tirage au sort d'équipe, cela fait plus d'un mois que je galère (d'autant que les instructions évoluent au fil du temps) mais maintenant je n'ai besoin que de cette macro pour finaliser.
Pour gagner du temps, le mieux serait de nous proposer votre fichier.
Bonjour,
2 propositions, une qui utilise les objets et les méthodes excel, une autre qui utilise du vba pur.
Function aleatoire(borne_inférieure, borne_supérieure)
aleatoire = Int(Rnd() * (borne_supérieure - borne_inférieure + 1)) + borne_inférieure
End Function
Sub aargh()
Randomize
With ActiveSheet
dl = .UsedRange.Rows.Count
.Columns("G:G").Insert shift:=xlToRight
.Range("G1:G" & dl).Formula = "=rand()"
With .Range("M1:M" & dl)
.Formula = "=rank(g1,$g$1:$g$" & dl & ")"
.Value = .Value
End With
.Columns("G:G").Delete shift:=xlToLeft
End With
End Sub
Sub aargh1()
Dim r()
Randomize
With ActiveSheet
dl = .UsedRange.Rows.Count
ReDim r(1 To dl, 1 To 1)
For i = 1 To dl
r(i, 1) = i
Next i
For i = 1 To dl
a = aleatoire(1, dl)
b = aleatoire(1, dl)
c = r(a, 1)
r(a, 1) = r(b, 1)
r(b, 1) = c
Next i
.Range("l1").Resize(dl, 1) = r
End With
End SubH2so4,
si je comprends bien c'est ce code que je dois utiliser pour remplir ma colonne L automatiquement ?
Sub aargh1()
Dim r()
Randomize
With ActiveSheet
dl = .UsedRange.Rows.Count
ReDim r(1 To dl, 1 To 1)
For i = 1 To dl
r(i, 1) = i
Next i For i = 1 To dl
a = aleatoire(1, dl)
b = aleatoire(1, dl)
c = r(a, 1)
r(a, 1) = r(b, 1)
r(b, 1) = c
Next i
.Range("l1").Resize(dl, 1) = r
End With
End Sub
je ne comprend pas a quel moment il récupère le fait que L est tributaire de G ?
désolé, je souhaite comprendre afin de pouvoir appliquer.
car ça fait un moment que je travaille sur ce projet et les modes de sélection du tirage ont changé plusieurs fois, du coup j'ai lu tellement de code différent pour effectuer mon tirage que j'ai simplifié le truc au max car une fois le projet achevé c'est quelqu'un d'autre qui prendra le relais et du coup je ne serais plus là pour expliquer à la personne, du coup j'ai crée un bouton pour que la personne puisse tirer au sort les 4 personnes et ensuite se débrouiller.
mais du coup il faut que ce soit opérationnel.
optimix,
je peux essayer, après il n'y a pas de données confidentielles mais comme c'est dans le cadre du travail sur un projet en cours de création, je ne sais pas si je peux (les noms et codes sont faux mais le projet est confidentiel)
et en reprenant c'est la colonne h que je dois prendre comme référence et pas G (mais à ce niveau c'est un détail)
Bonsoir
Si tu peux joindre ton fichier cela serait plus facile
Cordialement
Bonjour,
les 2 codes proposés donnent exactement le même résultat, ils mettent en colonne L un numéro unique tiré au hasard, associé à chaque nom de la colonne G. c'est ce que j'ai compris de ta demande sans fichier joint...
Ton dernier commentaire concernant le tirage au sort de 4 pesonnes, je ne parviens pas à le mettre en relation avec ta demande intiale.
h2so4,
en fait c'est que je dois tirer au sort 4 personnes sur un listing, les personnes sont triés dans 4 groupes, on doit en récupérer un de chaque.
pour cela j'utilise une formule excel :=INDEX(H2:H12;EQUIV(PETITE.VALEUR(L2:L12;LIGNE(1:1));L2:L12))
jusque là ça fonctionnait sur 4 tableau différent avec un rnd (que je tapais à la main )en macro mais j'ai du simplifier le projet pour n'avoir plus qu'une liste au lieu de 4 et donc un seul bouton, du coup cela ne fonctionne plus ...et surtout je ne trouvais pas le moyen d'étendre la liste de rnd car d'une quand une personne sera tiré au sort on va la sortir de la liste mais aussi il peut y avoir de nouveau arrivant (fichier de base de plus de 400personnes)...d'où mon besoin de pouvoir étendre le random jusqu'au dernier nom de la liste et que cela s'adapte selon les entrées/sorties du fichier (au début je voulais supprimer automatiquement la ligne des personnes tirés au sort mais déjà là je bloque alors il a été convenu que ce sera manuellement)
j'ai mis le fichier dans un autre com ce sera peut être plus clair.
en fait je précise car vu que je ne serais plus sur le projet une fois le tirage au sort mis en place il faut que la personne puisse ajouter ou retirer des noms de la liste et juste cliquer sur le bouton que j'ai incorporé pour avoir sa liste de "gagnants du jour" mais ne sera peut être pas en capacité d'intervenir sur les macro -comme moi quoi