Numérotation successive
Bonsoir à tous,
Je voudrais grâce à une macro écrire des nombres de C5 à J2 un par un, en suivant le sens des flêches, 100 fois à la suite.
Je vous remercie.
Bonsoir Roger,
Je te propose la solution suivante :
Sub SERIE()
Dim i As Integer
Dim i2 As Integer
Dim Nbre As Integer
Dim Test As Integer
For i = 5 To 2 Step -1
For i2 = 3 To 10
essai:
Nbre = Int(Rnd * 90 + 1)
On Error GoTo suivant
Test = WorksheetFunction.Match(Nbre, Range(Cells(i, 3), Cells(i, 10)), 0)
GoTo essai
On Error GoTo -1
suivant:
Cells(i, i2) = Nbre
On Error GoTo -1
Next i2
Next i
End Sub
Si besoin d'explications, n'hésites pas à me revenir
Bonne continuation
Chris
Bonjour,
Si le but est d'insérer des nombres aléatoires sans doublons par ligne sur un ensemble de cellules en 4 lignes de 8 colonnes alors je ne vois pas l'intérêt de définir un sens de remplissage tant horizontal que vertical.
Tu demandes de le faire 100 fois. OK mais comment veux-tu que nous positionions tes 100 tableaux ? Les uns sous les autres sur la même feuille ? Sur 100 feuilles différentes toujours dans la zone "C5:J2" ?
Bonsoir,
Merci de vos réponses et la macro jointe.
Une précision, est- il possible que les nombres soient croissants sur la ligne (comme mon exemple) et de les 'tirer' un à un plutôt qu'avoir le tableau rempli d'un coup?
Alea peut-il être réinitialisé entre chaque nombre pour faire abstraction du nombre précédent tiré ? je ne sais pas si c'est possible.
Bonne soirée
ps: les 100 fois se font au même endroit
est- il possible que les nombres soient croissants sur la ligne
Oui mais attention. Dans ce cas cela veut dire que tu changes ta demande initiale. Si tu veux des nombres croissants sans doublon alors la fourchette du nombre à générer change pour chaque colonne par ligne. La valeur min est la valeur précédente + 1 et la valeur max est 83 pour la première colonne, 84 pour la seconde, .... sinon tu risque de ne pas pouvoir compléter la ligne. Imagine si tu "tires" 90 pour le premier numéros de ta ligne. Comme tu veux des nombres croissants tu ne pourras pas compléter les autres cellules de cette ligne.
les 'tirer' un à un plutôt qu'avoir le tableau rempli d'un coup?
C'est déjà le cas. Ces nombres sont déjà générés et positionnés 1 par 1 sur la feuille. La grille ne se remplit pas "d'un coup toutes les cellules en même temps". C'est la vitesse d'exécution qui te donne cet effet.
Alea peut-il être réinitialisé entre chaque nombre pour faire abstraction du nombre précédent tiré ?
C'est déjà le cas. Int(Rnd * 90 + 1) génère un nouveau nombre à chaque fois que que soit le précédent.
les 100 fois se font au même endroit
Donc tu écrases les anciens remplissages de tableau au fur et à mesure. Excepté pour créer une espèce d'animation c'est inutile.
bonjour Roger8247, salut Alex020181,chris1945
un essai (éspérons que cela fonctionne en 2007
Edit : maintenant avec temporisation
Bonsoir tout le monde,
Roger : et si tu nous expliquais à quoi tu veux arriver et à quoi cela sert... nous pourrions certainement mieux t'aider car ici on tourne en rond.
Toutes les remarques d'Alex sont justifiées pourquoi tu veux un goutte à goutte pour l'apparition des nombres ?
Veux-tu faire une intervention manuelle entre chaque création d'un nombre ?
Merci d'éclairer notre lanterne.
A bientôt
Chris
Bonjour à tous
Ma p'tite version au goutte-à-goutte.
Modifier la valeur de la tempo pour régler le goutte-à-goutte (0 <-> aucune tempo)
Sub TirageAleatoire()
Const Tempo = 3500 ' durée de la tempo (à adapter pour chaque PC)
Dim t(1 To 90), i&, j&, k&, n&, aux&, ech As Boolean
[c2].Resize(4, 8).ClearContents ' effacer le dernier tirage
For i = 1 To 90: t(i) = i: Next ' remplissage de t avec 1..90
For i = 0 To -3 Step -1 ' pour les quatre lignes en remontant
For k = 1 To 90: n = 1 + Int(Rnd * 90): aux = t(k): t(k) = t(n): t(n) = aux: Next ' mélange de t
Do ' tri de t (de 41 à 48 -> pour le fun)
ech = False
For k = 41 To 47
If t(k) < t(k + 1) Then ech = True: aux = t(k): t(k) = t(k + 1): t(k + 1) = aux
Next k
Loop Until Not ech
n = 0 ' affichage pour une ligne
For j = 0 To -7 Step -1 ' affichage pour les colonnes
n = n + 1: [j5].Offset(i, j) = t(41 - j) ' de droite à gauche
For k = 1 To Tempo: DoEvents: Next ' temporisation
Next j
Next i
End SubBonjour à tous et merci pour vos résultats de macro.
(à Mafraise, l'apparition des numéros va de gauche à droite)
"Imagine si tu "tires" 90 pour le premier numéros de ta ligne. Comme tu veux des nombres croissants tu ne pourras pas compléter les autres cellules de cette ligne." Bien vu ! (sauf à imposer des aléas de dizaines, c'est pas le but )
Mon idée était de créer un boulier numérique de 1 à 90. Je m'aperçois en effectuant des tirages à partir de vos macros que je dois encore réfléchir au meilleur moyen de le réaliser.
Bonne journée
Re Roger8247,
Roger8247 a écrit :
(à Mafraise, l'apparition des numéros va de gauche à droite)Encore une fois, j'ai lu de travers ! Voici la version corrigée :
Pour continuer donc voici ma proposition.
Option Explicit
Sub tirages_lanceur()
Dim num_boucle_cours As Long
Dim ligne_cours As Long
Dim colonne_cours As Long
Dim min_possible As Long
Dim max_possible As Long
Dim tirage_cours As Long
Dim delai_pause As Single
Dim heure_reprise As Single
Randomize
delai_pause = 0.125 'en secondes 1 = 1 sec // 0.5 = 0.5 sec ...
For num_boucle_cours = 1 To 3 'j'ai mis 3 par souci de gain de temps pour les tests mais toi tu demandes 100 fois alors remplace 3 par 100
ThisWorkbook.Sheets("boulier").Range("C2:J5").ClearContents
For ligne_cours = 5 To 2 Step -1
min_possible = 1
For colonne_cours = 3 To 10
max_possible = colonne_cours + 80
tirage_cours = Application.WorksheetFunction.RandBetween(min_possible, max_possible)
heure_reprise = Timer() + delai_pause
ThisWorkbook.Sheets("boulier").Cells(ligne_cours, colonne_cours) = tirage_cours
Do While Timer() < heure_reprise
Loop
min_possible = tirage_cours + 1
Next colonne_cours
Next ligne_cours
Next num_boucle_cours
End SubLe fichier avec le code.
Attention comme tu peux le voir dans mon commentaire du code j'ai mis une boucle de 3 fois pour gagner du temps pour les tests. Toi tu demandes 100 fois. Il te suffit de modifier ce 3 par 100
Concernant le timer tempo entre le remplissage de 2 cellules tu peux modifier le délai à loisir en début de macro. Je t'ai mis un commentaire également.
Le bouton "GO" te permet de lancer le code.
Teste et dis nous.
re,
ma petite contribution, c'est seulement Alex020181 qui a parlé des doublons, donc ma version ne les a pas ! Comme preuve, j'ai augmenté le nombre de colonnes.
En fait il y a plusieurs "sources" de demande.
Il y a d'abord son fichier joint dans son premier post.
Puis il y a une demande supplémentaire dans un autre de ses posts.
est- il possible que les nombres soient croissants sur la ligne
J'ai cumulé les 2. Voili voilou.
Édit : c'est vrai que je n'ai pas fais gaffe à la version d'Excel de Roger8247
@Roger8247 : Peux-tu nous dire si le code fonctionne chez toi du coup ?
Édit 2 : Oui cette fonction est présente. (cf cet article de février 2007 https://monsieur-excel.blogspot.com/2007/02/et-la-fonction-aleaentrebornes.html) mais à priori il faut l'activer. Sinon l'article donne une formule de remplacement.
@Alex020181, vous êtes sûr qu'il n'y a pas des doublons dans votre proposition ?
Si vous faites la même chose, augmentez le nombre de colonne, par exemple 45 (la moitié de 90)
Je suis sûr qu'il n'y a pas de doublons puisque je lui dis que pour chaque tirage le minimum à prendre en compte est le tirage précédent + 1.
min_possible = tirage_cours + 1
Après je n'ai pas la science infuse. Peut-être que je me suis planté quelquepart. Mais avec ce + 1 je ne vois pas comment je pourrais avoir un doublon (ou alors dans mon algo).
Attention. Si vous mettez plus de colonnes pensez à modifier le max possible puisque je me sers du numéro de la colonne pour le définir et éviter ainsi de tirer des nombres trop grands trop tôt par ligne.
Je ferai avec plus de colonnes demain mais là je vais dodo.
Bonne nuit.
Bonjour à tous
Une autre proposition avec une nouvelle méthode. On n'ajoute pas de nombres au tirage d'une ligne mais on en supprime à partir de la liste initiale de tous les nombres possibles. On a évité l'utilisation d'un "dictionary" (qui pourtant aurait raccourci le code du tirage) pour rester compatible Apple.
On peut choisir :
- En A5, le nombre d'élément de chaque ligne en cellule (8 par exemple)
- En A12, le nombre maximum de la plage des nombres pouvant être tirés (90 par exemple)
- En A19, le nombre de tirage de 4 lignes à faire (3 par exemple). 100 c'est trop long pour les tests
- dans le code, la tempo entre l'affichage de deux nombres
- dans le code, la tempo entre deux tirages de quatre lignes
L'affichage a été un peu plus soigné que dans la v1.
...
Voilà BsAlv. Comme convenu. Sur 45 colonnes.
Pas bête mafraise. Il ne manque éventuellement que le nombre de colonnes à pouvoir être saisi comme les autres paramètres et ce sera du sur mesure.
Re Alex020181
Alex020181 a écrit :
Il ne manque éventuellement que le nombre de colonnes à pouvoir être saisi comme les autres paramètres et ce sera du sur mesure
Je ne comprends pas
Qu'appelles-tu donc "nombre de colonnes" ?
...
edit : ne serait-ce pas plutôt le nombre de lignes ?
Dans ce cas, voir le classeur ci-dessous :
re,
nice ! Mais on n'entend plus Roger8247 !
Mafraise m'a donné une nouvelle idée, continuer avec la même matrice !
Chez Alex020181, ce sont surtout des chiffres >50, donc pas vraiment aléatoire.
edit : ne serait-ce pas plutôt le nombre de lignes ?
Exact. Pardon pour la confusion.
Chez Alex020181, ce sont surtout des chiffres >50, donc pas vraiment aléatoire.
Oui je viens de voir ça en mettant plus de 3 boucles. J'utilise pourtant en VBA la fonction ALEAENTREBORNES interne à Excel (cf https://support.microsoft.com/fr-fr/office/alea-entre-bornes-alea-entre-bornes-fonction-4cc7f0d1-87d...).
Serait-ce à dire que c'est cette fonction qui déconne ?
D'un point de vue purement logique algorithmique, sans me jeter des fleurs hein, je trouve pourtant que ma logique est bonne : pour chaque tirage le min possible est le tirage précédent + 1 et le max possible est le 90 par rapport aux numéros de colonnes.
Plus d'infos : https://www.datacamp.com/fr/tutorial/excel-random-number-generator