VBA chiffre aleatoire

Résolu
Bonjour,
beaucoup de post ont été posté à ce sujet, mais mon cas est plus particulier :
je souhaite avoir, par l'intermediare du VBA, un chiffre aléatoire, mais soit 2, soit 4, auriez vous des réponses ?

PS : je tourne sous excel 2010

6 réponses

  1. Bonsoir, tu n'as pas du bien chercher.
    J'ai répondu à ce type de question il n'y a pas bien longtemps.
    Tu fais un tableau de 2 enregistrements 2 et 4.
    Ensuite tu tires aléatoirement entre 0 et 1 qui sont les indices du tableau.
    1. Bonsoir Wave, bonsoir le forum,

      Peut-ête comme ça :

      Sub Macro1()
      Dim CA As Byte
      
      Randomize
      Do
          CA = Int(3 * Rnd + 2)
      Loop Until CA <> 3
      MsgBox CA
      End Sub


      1. c'est ce que j'ai fait à quelque chose près, merci !
    2. merci tout le monde, je viens de trouver une solution ; ) qui marche, j'ai maintenant un autre problème, je le poste sur ce sujet ou j'en créer un autre ?
      1. voici ma solution (pour les intéressés):
        Dim Nb As Integer
        Randomize
        Nb = Int(Rnd() * 3) + 2
        Nombre_aléatoire:
            If Nb <> 3 Then Cells(Ligne, Colonne).Value = Nb Else GoTo Nombre_aléatoire
      2. Modérateur
        @wave13960Bonjour,

        Ce code, pour le cas ou tu tires 3, tourneras en boucle infinie.
        Je te prépares une petite réponse un peu plus étoffée.
      3. Modérateur
        @wave13960j'ai maintenant un autre problème, je le poste sur ce sujet ou j'en créer un autre ?
        Si le problème est différent postez un nouveau sujet.
    3. Modérateur
      Bonjour tout le monde,

      Mes meilleurs voeux.

      La bonne réponse est celle de ThauThème que je salues.
      J'ajouterai, juste pour être ch*ant, Timer après randomize.

      Sub Macro1()
      Dim CA As Byte
      
      Randomize Timer
      Do
          CA = Int(3 * Rnd + 2)
      Loop Until CA <> 3
      MsgBox CA
      End Sub


      Pourquoi la solution de wave13960 ne fonctionne pas.
      Pour deux raisons :
      1- GoTo, en VBA n'est à utiliser que pour le traitement d'erreur.
      Il peut être utilisé car il existe, mais, en cas de plusieurs utilisations, on se retrouve avec un code Spaghetti (nommé ainsi car l'entremêlement des lignes de codes fait penser à un tas de ces pâtes...). Pour preuve, les nouveaux "créateurs" de virus via macro utilisent un code composé essentiellement de Goto pour tromper leur monde.
      Autant prendre de bonnes habitudes et l'éviter.

      2- Le GoTo de wave13960 ne renvoie pas au bon endroit car il ne recalcule pas le chiffre aléatoire.
      Dim Nb As Integer
      Randomize
      Nb = Int(Rnd() * 3) + 2
      Nombre_aléatoire:
      If Nb <> 3 Then Cells(Ligne, Colonne).Value = Nb Else GoTo Nombre_aléatoire

      Il eut fallut utiliser :
      Dim Nb As Integer
      Randomize
      Nombre_aléatoire:
      Nb = Int(Rnd() * 3) + 2
      If Nb <> 3 Then Cells(Ligne, Colonne).Value = Nb Else GoTo Nombre_aléatoire
      1. Salut comment ça LA bonne réponse....
        La mienne marche aussi et a l'avantage de fonctionner quelques soient les valeurs voulues, il suffit de paramétrer le tableau. Non mais ;-)

        --
      2. Modérateur
        @Utilisateur anonymeBien sur Whis, je ne parlais que des deux solutions en code présentées ici.
        D'ailleurs, la tienne, je l'écrirais demain matin, poour compléter.
        Bon, il est vrai qu'elle sera peut être un peu plus longue, VBA oblige, mais ce sera fait.
        Bonne soirée.
        A+
      3. @pijakuBonne soirée à toi aussi!

        --
      4. merci bcp ! (dsl pour le retard)
    4. Modérateur
      Bonjour,

      Comme promis hier à Whismeril, voici sa façon de faire mise en code VBA. Contrairement à ce que j'ai annoncé hier, c'est plus court et plus direct.

      Dim Tabl(1) As Byte, Resulta As Byte
      Tabl(0) = 2
      Tabl(1) = 4
      Randomize Timer
      Resulta = Tabl(Round(Rnd()))


      Ce qui nous amène, bien entendu, à une autre solution, avec Split :

      Dim MesVal As String, Separ As String, Resulta As Byte
      MesVal = "2-4"
      Separ = "-"
      Randomize Timer
      Resulta = Split(Str, sep)(Round(Rnd()))


      Les deux peuvent bien sur être "raccourci" pour les codeurs fainéants des doigts, comme moi. Exemple pour le second :

      Dim Resulta As Byte
      Randomize Timer
      Resulta = Split("2-4", "-")(Round(Rnd()))


      🎼 Cordialement,
      Franck 🎶