Macro création de nombre aléatoire
Bonjour le forum,
je cherche un moyen (je n'ai pas trouvé avec des fonctions) qui sort 8 chiffres dont 2 peuvent être équivalent (ex : 12345676) et qui génère 500 000 lignes en dessous avec des combinaisons différentes de ces chiffres.
Faut il faire une macro ?
Merci d'avance pour votre collaboration
bonjour
peu etre que cela peu vous aider!!
=ALEA.ENTRE.BORNES(1;500000)
faudouy a écrit :Bonjour le forum,
je cherche un moyen (je n'ai pas trouvé avec des fonctions) qui sort 8 chiffres dont 2 peuvent être équivalent (ex : 12345676) et qui génère 500 000 lignes en dessous avec des combinaisons différentes de ces chiffres.
Faut il faire une macro ?
Merci d'avance pour votre collaboration
bonjour,
peut-il y avoir 2 lignes identiques ? Non, je viens de voir que la réponse est dans la question ....
Merci Iliyes pour cette fonction, mais comment l'appliquer sur 500000 lignes dans la même colonne ?
Bonjour,
une solution via une macro. temps d'exécution évolue de façon exponentielle. Il te faudra être patient ... (+/- 10 minutes sur mon ordi, parfois le décompte en % reste figé(je ne sais pas pourquoi), mais cela n'empêche pas l'exécution de continuer)
Option Explicit
Sub genere8()
Dim v() As Boolean, k, kl As Long, c As Boolean, g As String, dico As Object
Dim nl As Long, l As Long, nlr As Long, i As Long, a As Long, combi As Long, ctr As Long, b As Long
Dim recommence As Boolean
nl = 500000 'nombre de séquences uniques à générer
Set dico = CreateObject("Scripting.Dictionary") ' on utilise un dictionnaire pour vérifier l'unicité
Do 'boucle de génération de nl séquences
g = "" ' contiendra la séquence générée
c = False ' indicateur de chiffre en double
ReDim v(9) ' indicateurs de chiffres tirés
For i = 1 To 8 ' on génère une séquence de 8 chiffres
Do ' on tire un chiffre au hasard jusqu'à ce qu'on en trouve un qui soit correct
recommence = False ' par défaut on ne recommence par le tirage du chiffre
a = Application.RandBetween(0, 9) ' on tire un nombre au hasard entre 0 et 9
If v(a) Then ' si chiffre déjà tiré
If c Then ' si double déjà tiré
recommence = True ' il faut tirer un autre chiffre
Else
c = True ' sinon on accepte le double
End If
Else ' chiffre non encore tiré
v(a) = True ' on indicque que le chiffre est tiré
End If
Loop While recommence
g = g & a ' on ajoute le chiffre tiré à la séquence
Next i 'on tire 8 chiffres
' si la sequence n'est pas dans le dico on l'ajoute et on incrémente le nombre de séquences générées
If Not dico.Exists(g) Then dico.Add g, True: combi = combi + 1: Application.StatusBar = Format(combi / nl, "0.00%")
Loop While combi < nl 'tant que le nombre de séquences à tirer n'est pas atteint
' copie du résultat dans la feuille, l'instruction resize est limitée à 65536
' ce qui suit vise à tenir compte de cette contrainte
k = dico.keys 'on place les séquences dans le vecteur k
b = 1 ' b = base pour la cellule de départ qui doit recevoir la première séquence
ReDim Preserve k(1 To nl) ' on redimensionne le vecteur k en partant de 1
If nl < 65536 Then l = nl Else l = 65536
nlr = nl
ReDim vg(1 To l) 'on dimensionne un tableau pouvant contenir le maximum de (65536 ou du nombre de séquences)
For i = 1 To nl
ctr = ctr + 1
vg(ctr) = k(i) 'on charge le tableau vg avec les séquences du groupe en cours
If ctr = l Then ' le groupe est complet
Range("a" & b).Resize(l) = Application.Transpose(vg) 'on le copie dans la feuille courante
b = i + 1 'on adapte la base pour la copie suivante
nlr = nlr - l 'on adapte le nombre de séquences restant à copier
If nlr < 65536 Then l = nlr Else l = 65536
If l > 0 Then ReDim vg(1 To l) '
ctr = 0
End If
Next i
End Sub
bonjour
ben....si tu étire sur quelques 100 lignes la formule
et puis su sélectionne ces cellules et tu met un copié/collé
je pense que c'est faisable
néanmoins c'est la solution facile
maintenant la macro de "h2so4" est beaucoup plus PRO ( je tire chapeau)
cordialement
Bonjour
merci pour ce code, il faut effectivement être patient mais Excel plante assez rapidement (message : ne répond pas).
En effet Iliyes mais je risque malgré tout d'avoir un doublon en étirant la formule ?
faudouy a écrit :Bonjour
merci pour ce code, il faut effectivement être patient mais Excel plante assez rapidement (message : ne répond pas).
Il faut le laisser travailler, il finira par répondre. Excel ne plante pas, en tout cas chez moi. Ce qui arrive parfois et je ne comprend pas pourquoi c'est la mise à jour du pourcentage dans la barre de statut qui ne se fait plus, mais le programme continue.
Bonjour à tous,
parfois le décompte en % reste figé(je ne sais pas pourquoi)
Peut-être mettre un DoEvents régulier ? Il ne me semble pas en voir.
eric
eriiic a écrit :Bonjour à tous,
parfois le décompte en % reste figé(je ne sais pas pourquoi)
Peut-être mettre un DoEvents régulier ? Il ne me semble pas en voir.
eric
tu as raison, il n'y en a pas.
Option Explicit
Sub genere8()
Dim v() As Boolean, k, kl As Long, c As Boolean, g As String, dico As Object
Dim nl As Long, l As Long, nlr As Long, i As Long, a As Long, combi As Long, ctr As Long, b As Long
Dim recommence As Boolean
nl = 500000 'nombre de séquences uniques à générer
Set dico = CreateObject("Scripting.Dictionary") ' on utilise un dictionnaire pour vérifier l'unicité
Do 'boucle de génération de nl séquences
g = "" ' contiendra la séquence générée
c = False ' indicateur de chiffre en double
ReDim v(9) ' indicateurs de chiffres tirés
For i = 1 To 8 ' on génère une séquence de 8 chiffres
Do ' on tire un chiffre au hasard jusqu'à ce qu'on en trouve un qui soit correct
recommence = False ' par défaut on ne recommence par le tirage du chiffre
a = Application.RandBetween(0, 9) ' on tire un nombre au hasard entre 0 et 9
If v(a) Then ' si chiffre déjà tiré
If c Then ' si double déjà tiré
recommence = True ' il faut tirer un autre chiffre
Else
c = True ' sinon on accepte le double
End If
Else ' chiffre non encore tiré
v(a) = True ' on indicque que le chiffre est tiré
End If
Loop While recommence
g = g & a ' on ajoute le chiffre tiré à la séquence
Next i 'on tire 8 chiffres
' si la sequence n'est pas dans le dico on l'ajoute et on incrémente le nombre de séquences générées
If Not dico.Exists(g) Then dico.Add g, True: combi = combi + 1:ctr=ctr+1:if ctr=500 then ctr=0:doevents: Application.StatusBar = Format(combi / nl, "0.0%")
Loop While combi < nl 'tant que le nombre de séquences à tirer n'est pas atteint
' copie du résultat dans la feuille, l'instruction resize est limitée à 65536
' ce qui suit vise à tenir compte de cette contrainte
k = dico.keys 'on place les séquences dans le vecteur k
b = 1 ' b = base pour la cellule de départ qui doit recevoir la première séquence
ReDim Preserve k(1 To nl) ' on redimensionne le vecteur k en partant de 1
If nl < 65536 Then l = nl Else l = 65536
nlr = nl
ReDim vg(1 To l) 'on dimensionne un tableau pouvant contenir le maximum de (65536 ou du nombre de séquences)
For i = 1 To nl
ctr = ctr + 1
vg(ctr) = k(i) 'on charge le tableau vg avec les séquences du groupe en cours
If ctr = l Then ' le groupe est complet
Range("a" & b).Resize(l) = Application.Transpose(vg) 'on le copie dans la feuille courante
b = i + 1 'on adapte la base pour la copie suivante
nlr = nlr - l 'on adapte le nombre de séquences restant à copier
If nlr < 65536 Then l = nlr Else l = 65536
If l > 0 Then ReDim vg(1 To l) '
ctr = 0
End If
Next i
End Sub
Bonsoir le Forum,
Merci h2so4 pour ton apport
Une question, cependant : pourquoi prévoir 500000 séquences au départ, alors que le nombre maxi de lignes est de 65536
et que le nombre de permutations pour 7 ou 8 items sur 8 est de 40320 ?
Merci de ta réponse
Cordialement
axion
axion a écrit :Bonsoir le Forum,
Merci h2so4 pour ton apport
Une question, cependant : pourquoi prévoir 500000 séquences au départ, alors que le nombre maxi de lignes est de 65536
et que le nombre de permutations pour 7 ou 8 items sur 8 est de 40320 ?
Merci de ta réponse
Cordialement
axion
selon moi on parle d'un tirage de 8 chiffres dans un lot de 10 chiffres avec tolérance pour un doublon, on est bien au delà des 500.000 possibilités.
le nombre maximum de lignes est de l'ordre du million dans les dernières versions (dès la version 2007 si je ne m'abuse). Cependant, excel ne semble pas pouvoir gérer des transferts entre tableau vba et cellules de plus de 65536 éléments, d'où la nécessité d'un algorithme spécial pour transférer le contenu du tableau vba vers la feuille excel (on aurait pu faire ce transfert élément par élément mais c'eût été fort lent).
Bonsoir, H2so4
j'étais resté à 8/8 avec doublon éventuel selon l'expression d'énoncé :
je cherche un moyen (je n'ai pas trouvé avec des fonctions) qui sort 8 chiffres dont 2 peuvent être équivalent (ex : 12345676)
j'ai dû rater un post et je te remercie de ta réponse
Cordialement
axion
axion a écrit :Bonsoir, H2so4
j'étais resté à 8/8 avec doublon éventuel selon l'expression d'énoncé :
je cherche un moyen (je n'ai pas trouvé avec des fonctions) qui sort 8 chiffres dont 2 peuvent être équivalent (ex : 12345676)
j'ai dû rater un post et je te remercie de ta réponse
Cordialement
axion
tu n'as pas raté de post, l'énoncé laissait place à l'interprétation. J'ai choisi une interprétation qui collait avec 500000 lignes.