Générer valeur dans une grille de cellule à partir d'1 BDD

photo generatrice

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 Sub

NB- 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.
[du point de vue procédural, le mélange est un premier tirage de tous les éléments d'un ensemble de façon à en modifier l'ordre initial]
  • 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.


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!

merci beaucoup pour le programme!

Bonne journée!

Kureyna

Ton post initial n'était pas suffisamment explicite sur le caractère unique de chaque tirage individuel et le fait que chacun devait s'ajouter aux tirages précédents en les conservant !

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 ! Cela attendra donc, mais un autre intervenant peut toujours te faire des propositions...

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 ?

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,

Rechercher des sujets similaires à "generer valeur grille partir bdd"