Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

vba alea entre bornes sans doublon en VBA

pascal21

XLDnaute Barbatruc
bonsoir
j'ai trouvé ce code qui ma permet de générer une liste de nombres entre bornes mais sans doublons
c'est = à alea.entre.bornes mais sans les doublons
elle à fonctionné deux ou trois fois et voilà que à chaque fois maintenant excel bug dessus
avez-vous une idée du problème
ou mieux avez-vous une autre solution à ma proposer
merci
Code:
Sub HasardSansDoublons1()
Range("f6:f260").Value = ClearContents 'j'efface les anciens choix
a = 1
b = Range("f2") 'cellule qui contient le chiffre maxi que devra avoir la liste maxi dans tous les cas 256
n = 60 'je ne sais pas ce que c'est si vous avez une idée .....
Set dico = CreateObject("Scripting.Dictionary")
Do Until i = n
v = Int((b - a + 1) * Rnd() + a)
If Not dico.Exists(v) Then
dico.Add v, v
i = i + 1
End If
Loop
[e6].Resize(i) = Application.Transpose(dico.items) 'colonne où se trouve la liste 'départ en E6
End Sub
 
Dernière édition:

Softmama

XLDnaute Accro
Re : code vba qui fait bugguer excel

Bonjour,

je te propose cette adaptation :
VB:
Sub HasardSansDoublons2()
Range("e6:e261").ClearContents 'j'efface les anciens choix
a = 1 ' borne Mini
b = 256 ' borne Maxi
Set dico = CreateObject("Scripting.Dictionary")
Do Until i = b - a +1
v = Int((b - a + 1) * Rnd() + a)
If Not dico.Exists(v) Then
dico.Add v, v
i = i + 1
End If
Loop
[e6].Resize(i) = Application.Transpose(dico.items) 'colonne où se trouve la liste 'départ en E6
End Sub
 
Dernière édition:

pascal21

XLDnaute Barbatruc
Re : code vba qui fait bugguer excel

j'ai toujours un blocage
ça doit venir de chez moi
je vais faire un essai sur un classeur vierge pour voir
sur le classeur vierge ça fonctionne
 
Dernière édition:

pascal21

XLDnaute Barbatruc
Re : code vba qui fait bugguer excel

bonsoir Grand Chaman Excel
que faut-il mettre dans ce cas sachant que le nombre en F2 peut varier de 1 à 256
merci
edit: j'ai changé le titre il est plus explicite
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : vba alea entre bornes sans doublon en VBA

Bonjour à tous


Une autre approche avec une fonction "tirage".
VB:
Sub test()
    [E6].Resize(Range("F2").Value) = tirage(1, Range("F2").Value)
End Sub

Function tirage(min&, max&)
Dim i&, tmp&, alea!
    If min > max Then Exit Function
ReDim Table&(min To max, 0)
    For i = min To max: Table(i, 0) = i: Next
    Randomize
    For i = min To max
        tmp = Table(i, 0)
        alea = Int(i + (max - min - i + 2) * Rnd)
        Table(i, 0) = Table(alea, 0): Table(alea, 0) = tmp
    Next
    tirage = Table
End Function


ROGER2327
#5524


Mardi 24 Gueules 139 (Conversion de Saint Matorel, bateleur - fête Suprême Quarte)
29 Pluviôse An CCXX, 0,0523h - chélidoine
2012-W07-6T00:07:32Z
 

Grand Chaman Excel

XLDnaute Impliqué
Re : vba alea entre bornes sans doublon en VBA

Bonsoir,

Combien de valeurs aléatoires veux-tu générer? Tant que F2 est compris entre 1 et 256, ça devrait fonctionner...
Quel genre de message d'erreur reçois-tu ?

Peux-tu joindre ton fichier? Ça nous aiderait peut-être à cerner ton problème.
 

Lone-wolf

XLDnaute Barbatruc
Re : vba alea entre bornes sans doublon en VBA

Bonjour à tous,

@ pascal21: une proposition à adapter.

Code:
Sub TirageUnique()
Dim Tablo(1 To 52)
Dim cpt As Byte, base As Byte, n As Byte, tmp As Byte, i As Integer
For n = 1 To 52: Tablo(n) = n: Next
cpt = UBound(Tablo): base = LBound(Tablo)
Randomize Timer
For n = base To cpt
i = Int((cpt - n + 1) * Rnd + base)
tmp = Tablo(i)
Tablo(i) = Tablo(cpt - n + base)
Tablo(cpt - n + base) = tmp
Next
Range("A1").Resize(52) = Application.Transpose(Tablo)
End Sub


A+
 

pascal21

XLDnaute Barbatruc
Re : vba alea entre bornes sans doublon en VBA

bonjour et merci pour vos réponses
j'ai pris celle de roger au final
et j'ai fini pas voir ce qui clochait sur mon fichier
j'avais tout simplement rajouté une colonne sans rectifier tout le code
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…