VBA chiffre aleatoire

Résolu/Fermé
wave13960 Messages postés 25 Date d'inscription samedi 12 juillet 2014 Statut Membre Dernière intervention 21 mai 2015 - 20 janv. 2015 à 21:52
wave13960 Messages postés 25 Date d'inscription samedi 12 juillet 2014 Statut Membre Dernière intervention 21 mai 2015 - 1 avril 2015 à 20:31
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

PipoWIL Messages postés 21 Date d'inscription lundi 5 mai 2014 Statut Membre Dernière intervention 19 juin 2022 2
20 janv. 2015 à 22:01
essaye ceci :
=2*(1+ROUND(RAND();0))
0
Whismeril Messages postés 17823 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 4 octobre 2022 862
20 janv. 2015 à 22:03
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.
0
ThauTheme Messages postés 1442 Date d'inscription mardi 21 octobre 2014 Statut Membre Dernière intervention 29 juillet 2022 159
20 janv. 2015 à 22:06
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


0
wave13960 Messages postés 25 Date d'inscription samedi 12 juillet 2014 Statut Membre Dernière intervention 21 mai 2015
21 janv. 2015 à 13:28
c'est ce que j'ai fait à quelque chose près, merci !
0
wave13960 Messages postés 25 Date d'inscription samedi 12 juillet 2014 Statut Membre Dernière intervention 21 mai 2015
21 janv. 2015 à 13:18
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 ?
0
wave13960 Messages postés 25 Date d'inscription samedi 12 juillet 2014 Statut Membre Dernière intervention 21 mai 2015
Modifié par pijaku le 21/01/2015 à 15:31
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
0
pijaku Messages postés 12259 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 9 août 2022 2 703 > wave13960 Messages postés 25 Date d'inscription samedi 12 juillet 2014 Statut Membre Dernière intervention 21 mai 2015
21 janv. 2015 à 15:26
Bonjour,

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.
0
pijaku Messages postés 12259 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 9 août 2022 2 703 > wave13960 Messages postés 25 Date d'inscription samedi 12 juillet 2014 Statut Membre Dernière intervention 21 mai 2015
21 janv. 2015 à 15:35
j'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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 12259 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 9 août 2022 2 703
21 janv. 2015 à 15:35
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
0
Whismeril Messages postés 17823 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 4 octobre 2022 862
21 janv. 2015 à 17:18
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 ;-)

--
0
pijaku Messages postés 12259 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 9 août 2022 2 703 > Whismeril Messages postés 17823 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 4 octobre 2022
21 janv. 2015 à 20:20
Bien 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+
0
Whismeril Messages postés 17823 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 4 octobre 2022 862 > pijaku Messages postés 12259 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 9 août 2022
21 janv. 2015 à 21:06
Bonne soirée à toi aussi!

--
0
wave13960 Messages postés 25 Date d'inscription samedi 12 juillet 2014 Statut Membre Dernière intervention 21 mai 2015
1 avril 2015 à 20:31
merci bcp ! (dsl pour le retard)
0
pijaku Messages postés 12259 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 9 août 2022 2 703
Modifié par pijaku le 22/01/2015 à 07:56
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 🎶
0