Générer valeur dans une grille de cellule à partir d'1 BDD
- Messages
- 24
- Excel
- 2010 FR
- Inscrit
- 16/03/2017
- Emploi
- (Responsable Omniscience et Prédiction ROP) - Prévisionniste dans une entreprise Équipementier
Bonjour à tous!
J'espère que tout le monde va bien en ce jour un peu grisou!
Je vous appelle à l'aide car j'ai besoin de votre expérience pour faire un truc
Voici la description du truc que je souhaite faire :
Dans une plage définit, je souhaite générer aléatoirement des valeurs disposés de manière aléatoire dans cette plage.
donc 2 choses :
- placement aléatoire dans la plage de mes valeurs
- la valeur elle même est est aléatoire, mais parmi un choix définit (une BDD)
je vous joint un Excel du cahier des charges de mon projet pour aider la compréhension ^^
Je vous remercie de l'aide que vous pourrez m'apporter, c'est très gentil de passer un peu de temps pour me répondre/dire bonjour/m'aider =)
Je suis pas super doué en Excel, je pense que ce truc peut se faire en 2 minutes
Bonne journée et à bientôt !
Bonjour,
Sub GénérerGrille()
Dim txBd0$, txBd1$, txGr0$, txGr1$, txT$, i%, x%, n%, c%, g%
n = [Grille].Cells.Count
For i = 1 To n
txGr0 = txGr0 & ChrW(i + 32)
Next i
Randomize
For i = 1 To n
x = Int(Len(txGr0) * Rnd + 1)
txT = Mid(txGr0, x, 1): txGr1 = txGr1 & txT
txGr0 = Replace(txGr0, txT, "")
Next i
n = [BDD].Rows.Count
For i = 1 To n
txBd0 = txBd0 & Chr(i + 32)
Next i
For i = 1 To n
x = Int(Len(txBd0) * Rnd + 1)
txT = Mid(txBd0, x, 1): txBd1 = txBd1 & txT
txBd0 = Replace(txBd0, txT, "")
Next i
Application.ScreenUpdating = False
With [Grille]
If n > .Cells.Count Then n = .Cells.Count
.ClearContents
For i = 1 To n
x = Int(Len(txBd1) * Rnd + 1)
txT = Mid(txBd1, x, 1): c = Asc(txT) - 32
txBd1 = Replace(txBd1, txT, "")
x = Int(Len(txGr1) * Rnd + 1)
txT = Mid(txGr1, x, 1): g = AscW(txT) - 32
txGr1 = Replace(txGr1, txT, "")
.Cells(g) = [BDD].Cells(c, 1)
Next i
End With
End SubNB- Plages nommées : Grille et BDD (cette dernière en dynamique). Voir dans gestionnaire de noms.
Déroulement de la procédure, se passe comme si
- On compte les cellules de la grille. On affecte un identifiant littéral à chacune, on les met dans un sac, on mélange.
- On compte les codes de la BDD. On affecte un identifiant littéral à chacun, on les met dans un chapeau, on mélange.
- On tire un élément du chapeau, on identifie le code correspondant, on tire un élément du sac, on identifie la cellule à servir, on affecte le code à la cellule de la grille.
- On procède ainsi tant qu'il reste des codes dans le chapeau. Si le nombre de code était supérieur au nombre de cellules de la grille, on s'arrête lorsque la grille est pleine.
Cordialement.
- Messages
- 24
- Excel
- 2010 FR
- Inscrit
- 16/03/2017
- Emploi
- (Responsable Omniscience et Prédiction ROP) - Prévisionniste dans une entreprise Équipementier
Woua, merci Maitre Ferrand pour votre réactivité et votre professionnalisme.
La solution proposée est intéressante. =)
En outre, je souhaite apporter quelques améliorations à cette jolie petite programmation:
- Lorsque j'appuie sur le bouton, les codes générés ne doivent pas changer de place dans la grille.
- Appuyer sur le bouton ne doit pas modifier la position des codes déjà dans la grille.
-Appuyer sur le bouton ne génère qu'un seul code à la fois
En résumé :
1) j'appuie sur le bouton
2) Excel sélectionne UNE valeur parmi la base de donnée
2 bis) Je souhaite implanter une pondération sur le choix de valeur (ex : je veux que "0A0C" ait 70% de chance d'être choisi et que "AAAA" ait 10% de chance d'être choisi [rajout d'une colonne avec un chiffre symbolisant la pondération?]
3)Excel implante la valeur retenue dans la grille de manière aléatoire
4) Si j'appuis à nouveau sur le "bouton", Excel ne modifie pas la position de la valeur précédente!
Bonne journée!
Kureyna
Sur 2 points la procédure est facile à adapter :
1) Ne pas affacer la grille antérieure : on supprime la ligne d'effacement...
2) Ne tirer qu'un seul code et une seule cellule : on supprime la boucle pour limiter les tirages à un...
3) Là où cela se complique un petit peu, c'est dans la préparation. Il faudra parcourir la Grille pour ne recueillir (mettre dans le sac à tirer) que les cellules libres.
Dans le même temps, il faudra recueillir dans les cellules occupées les codes utilisés pour les lister.
Et lors de la récupération des codes à tirer (à mettre dans le chapeau), vérifier pour chaque code qu'il ne figure pas dans la liste des utilisés avant de le retenir.
Rien de très compliqué mais un peu plus long... Du point de vue de l'exécution, cela sera compensé par le temps plus court utilisé pour le tirage... Pour écrire le code correspondant par contre, je n'en ai pas l'intention dans l'immédiat !
La pondération des probabilités de sortie de chaque code est, elle, un nouveau problème !
Le prérequis est que dès lors que l'on pré-fixe une probabilité de sortie de chaque code, le total des probabilités est égal à 1.
On peut cependant opérer avec un indice à partir duquel on calculera la probabilité voulue.
Exemple : 3 codes auxquels on affecte des indices de probabilité de 1, 2 et 3, total=6. Les probabilités respectives seront donc de 1/6, 2/6, et 3/6 (soit : 17%, 33% et 50%). Pour obtenir cette probabilité au tirage, il suffira de mettre dans le chapeau autant de fois le code que l'indice le stipule : on tirera donc parmi 6 codes...
Au tirage suivant, mettons que le second code ait eu la chance d'être sorti, si l'on ne modifie pas les indices les probabilités des 2 restant seront de 1/4 et 3/4 (soit 25% et 75%)...
Dans tous les cas, l'utilisation d'un indice permet de pondérer sans calcul complexe... mais il convient que celui qui définit les pondérations le fasse en connaissance de cause : il définit des probabilités, exclusivement pour les codes à tirer sur le seul tirage à venir, dont la somme est par définition égale à 1 !
Si la méthode est facile à comprendre et à appliquer, c'est aussi un peu plus long à écrire
Cordialement
NB- mais ta question a une solution sûre, compatible avec la méthode de tirage que j'utilise, laquelle a l'avantage de ne jamais avoir à tester si un doublon a été tiré... On ne tire jamais de doublon !
Disparu ? Abandon ?
- Messages
- 24
- Excel
- 2010 FR
- Inscrit
- 16/03/2017
- Emploi
- (Responsable Omniscience et Prédiction ROP) - Prévisionniste dans une entreprise Équipementier
Bonjour !
Excusez-moi cela fait un moment que j'étais parti!
Pardon pour ce manque de respect...
Nous avons de notre côté réussi à programmer un outil fonctionnel grâce à vos éléments de réponse.
Merci beaucoup et bonne journée Mr Ferrand.
Cordialement,