Excel peut être votre nouveau coach sportif en utilisant une fonctionnalité bien précise du VBA.
Vidéo de présentation de l'exercice
Nous allons recréer un exercice très courant au tennis ou au ping-pong ; aller toucher des verres disposés en carré
Comment transformer Excel en coach avec du VBA ?
C'est Excel qui va nous annoncer le numéro du verre à toucher 😉
Nous allons créer un programme VBA qui va énoncer de façon aléatoire un numéro de 1 à 4 avec une seconde de délai entre chaque numéro.
Conception du programme
Le programme repose sur seulement 4 aspects
- Créer un nombre aléatoire entre 1 et 4
- Convertir ce nombre en chaîne de caractères
- Demander à Excel de prononcer ce mot
- Recommencer la séquence un nombre de fois défini
Gérer un nombre aléatoire
Créer un nombre aléatoire est assez simple a réaliser.
- L'instruction Rnd (pour random en anglais) va créer un nombre aléatoire entre 0 et 1 (1 exclu).
- Maintenant, en multipliant cette fonction Rnd par 4, nous allons avoir un nombre en 0 et 3,99999.
- Puis, grâce à la fonction Int (Integer ou Entier), nous n'allons conserver que la partie entière du nombre aléatoire soit 0, 1, 2 ou 3.
- Il ne reste plus qu'à rajouter la valeur 1 au résultat obtenu pour avoir un nombre aléatoire entre 1 et 4.
NbreAlea = Int(Rnd() * 4) + 1
Spécificité du VBA pour les nombres aléatoires
Seulement, cette instruction n'est pas suffisante. En effet, en VBA, il faut "forcer" le recalcul aléatoire avec l'instruction Randomize.
Sans cette instruction, il y a un risque que la séquence aléatoire se répète.
Convertir les chiffres en chaînes de caractères
Maintenant, il est important de convertir le chiffre trouver en chaîne de caractères. En effet, la commande qui permet de faire parler Excel doit avoir comme paramètre une chaîne de caractères (String en anglais) et pas un chiffre.
Pour cela, nous allons faire appel à la fonction CHOISIR d'Excel mais depuis le VBA. Pour cela, il faut utiliser l'instruction Application.WorksheetFunction.Choose
Ensuite, il faut écrire les paramètres exactement de la même façon qu'avec la fonction CHOISIR. Soit
Application.WorksheetFunction.Choose(NbreAlea, "un", "deux", "trois", "quatre")
Faire parler Excel
Pour demander à Excel de prononcer une phrase, il suffit de passer la phrase en paramètre de la méthode Application.Speech.Speak
Application.Speech.Speak TextNumber
Intégrer une temporisation
Tout est presque parfait. Il faut juste intégrer une temporisation d'une seconde pour nous laisser le temps d'atteindre le verre 😉 Ici, nous allons intégrer une pause d'une seconde après chaque mot prononcé avec l'instruction
Application.Wait (Now + TimeValue("00:00:01"))
Répéter la séquence plusieurs fois
Une fois que cette séquence est construite, il suffit d'insérer ces instructions dans une boucle For ... Next pour répéter ces instructions autant de fois que vous le souhaitez
Le programme complet
Sub Sport()
Dim i As Long
Dim RndNumber As Long
Dim TextNumber As String
Dim QteNombrePrononce As Long
QteNombrePrononce = 10 'Changer cette valeur pour jouer plus longtemps
Application.Speech.Speak "Prêt ?"
Application.Wait (Now + TimeValue("00:00:02"))
Application.Speech.Speak "Go"
For i = 1 To QteNombrePrononce
Randomize
If i = QteNombrePrononce Then
Application.Speech.Speak "Last One"
End If
NbreAlea = Int(Rnd() * 4) + 1
TextNumber = Application.WorksheetFunction.Choose(NbreAlea, "un", "deux", "trois", "quatre")
Application.Speech.Speak TextNumber
Application.Wait (Now + TimeValue("00:00:01"))
Next
End Sub
Comment intégrer le code ?
Pour faire fonctionner ce code, il faut le copier dans le visual basic editor
- Ouvrez un nouveau classeur Excel
- Ouvrez le visual basic editor avec le raccourci-clavier Alt + F11
- Ajouter un nouveau module
- Coller le code dans le module
- Fermer le VBA
Lancer la macro
- Depuis Excel, appuyer sur les touches Alt + F8
- Appuyer sur le bouton Exécuter
Comment débugger un programme VBA
Si vous avez des difficultés à trouver l'origine de vos erreurs en VBA, ce guide va vous expliquer comment utiliser le débuger.
Jamais 2 fois le même nombre
Une variante intéressante du code c'est de ne jamais répéter 2 fois le même nombre à la suite. Pour cela, il faut rajouter un simple test lors de la génération du nombre aléatoire pour vérifier que le précédent nombre n'est pas égal au nouveau.
Sub Sport_2()
Dim i As Long
Dim RndNumber As Long
Dim TextNumber As String
Dim QteNombrePrononce As Long
QteNombrePrononce = 10 'Changer cette valeur pour jouer plus longtemps
Application.Speech.Speak "Prêt ?"
Application.Wait (Now + TimeValue("00:00:02"))
Application.Speech.Speak "Go"
For i = 1 To QteNombrePrononce
Randomize
Do
NbreAlea = Int(Rnd() * 4) + 1
Loop While NbreAlea = NombrePrecedent
NombrePrecedent = NbreAlea
TextNumber = Application.WorksheetFunction.Choose(NbreAlea, "un", "deux", "trois", "quatre")
Application.Speech.Speak TextNumber
Application.Wait (Now + TimeValue("00:00:01"))
Next
End Sub