Macro pour msgbox aléatoire pose probleme une fois intégrée

Bonjour

J'ai fait une macro (module) qui englobe 20 messages différents supposés s'afficher à la fin d'une macro appelée au demarrage de mon fichier excel.

Lorsque je la lance toute seule, elle fonctionne parfaitement :

Sub messages()
Dim tableau(20)
    tableau(0) = "A toi de jouer !"
    tableau(1) = "Allez, GO !"
    tableau(2) = "Courage !"
    tableau(3) = "On croit en toi !"
    tableau(4) = "N'aie pas peur..."
    tableau(5) = "Sois fort"
    tableau(6) = "Message 6"
    tableau(7) = "Béééééééé !!!"
    tableau(8) = "C'est prêt tu peux y aller !"
    tableau(9) = "Faut s'y mettre maintenant ! Hop hop hop !"
    tableau(10) = "Tu peux y aller ! Mais n'oublie pas..."
    tableau(11) = "Cooool"
    tableau(14) = "Non !"
    tableau(15) = "Bon courage"
    tableau(16) = "Message 16 !!!"
    tableau(17) = "C'est prêt !"
    tableau(18) = "Let's go !"
    tableau(19) = "ouiiii"
    tableau(20) = "Go Go Gooooooo !!!"

MsgBox (tableau(Int(Rnd * UBound(tableau)))), , "TRAITEMENT TERMINÉ"

End Sub

Mais une fois ce module appelé dans une suite d'actions à l'ouverture du fichier excel, elle renvoie toujours la même phrase. Voici le code qui appelle message()

Private Sub Workbook_Open()
AlerteRappel
Application.Goto (Sheets("Prospection").Range("A5"))
StructuresSupprSpace
Application.Goto (Sheets("Prospection").Range("A5"))
messages
End Sub

Auriez-vous déjà rencontré ce type de problème, quelles pourrait être les pistes de recherche pour résoudre ce dysfonctionnement ? Merci de votre aide ;)

bonjour alxdesign,

Rnd prend toujours le même "seed",si vous ne prend pas d'action. Donc c'est préférable d'ajouter "Randomize" au début de votre macro, autrement, ce "rnd" n'est pas 100% aléatoire. voir https://www.excel-pratique.com/fr/astuces_vba/generer_nombres_aleatoires#google_vignette

Moi je préfère cette construction

MsgBox (tableau(WorksheetFunction.RandBetween(0, 20))), , "TRAITEMENT TERMINÉ"

Un grand merci ! ça fonctionne très bien maintenant ;)

Sinon, est-ce ok avec ma déclaration de tableau (20) si j'ai des lignes allant de 0 à 20 (qui ferait logiquement 21). Mon "dim tableau" doit il mentionner le nombre de ligne sans prendre en compte la ligne 0 ? J'avais repris ce code sur un autre post mais j'ai un doute sur le nombre à utiliser (20 ou 21)

En tous cas merci beaucoup et belle journée.

C tout bon, j’ai ma réponse pour le dernière question ;)

re,

si vous ne le savez pas ou si vous êtes paresseux, vous pouvez aussi utiliser les les limites inférieure et supérieure.

MsgBox (tableau(WorksheetFunction.RandBetween(lbound(tableau),ubound(tableau)))), , "TRAITEMENT TERMINÉ"

Pour votre "Dim tableau(20)", comme vous n'aviez rien spécifié concernant la limite inférieur, le lbound(tableau) est 0.

Si vous aviez utilisé "Dim tableau(1 to 20)", le lbound(tableau) serait 1.

PS. c'est au-delà de cette question, mais "Dim tableau(-20 to 0)" est aussi une possibilité avec vos 21 éléments, mais, admis, c'est ridicule.

Merci pour cette précision. Ca signifie qu'en utilisant (tableau(WorksheetFunction.RandBetween(lbound(tableau),ubound(tableau)))) à la place de (1 to 20) je ne suis plus obligé de renseigner de valeur dans Dim tableau(20) en début de code ? Ce qui deviendrait simplement Dim tableau () ?

re,

non, non !!! Avec "Dim tableau ()", vous déclarez ce tableau comme variant sans autres propriétés, donc sans Lbound et UBound. Vous pouvez aussi lire le contenu d'une plage et comme çà, vous ne devez pas préciser les dimensions, par exemple tableau=range("B4:D10") ce qui donne une matrice avec 2 dimensions, la première aura comme lbound 1 et ubound 10-4+1=7 et la 2eme aura comme lbound aussi 1 et ubound 3

Merci beaucoup pour ces précisions. Je crois que je vais explorer d'avantage ces notions, çà va régler pas mal de mes blocages d'"ultra débutant"

Belle soirée.

re,

encore un capture d'écran avec le résultat

image
Rechercher des sujets similaires à "macro msgbox aleatoire pose probleme fois integree"