Créer un minuteur avec événement

Bonjour,

Je suis en train de créer pour le plaisir un petit "programme" sous Excel qui vise à améliorer le confort de jeu d'un jeu vidéo en ligne connu. Mon niveau est qualifiable de Néophyte concernant le VBA, c'est une part d'Excel que je découvre à travers la création de ce mini-programme. Merci d'être indulgents et de m'excuser si je manque de détails

Dans ce jeu, il existe une part de gameplay basée sur l'élevage (il faut donc élever puis accoupler certains animaux pour obtenir des naissances). Une fois deux montures accouplées, un chrono virtuel se met en route et l'accouchement se produit à l'écoulement du temps fixé.

Mon objectif est le suivant : reproduire ce chrono virtuel sur mon tableau Excel (sous VBA)

* Ce chrono se déclencherait à l'appui d'un bouton prévu à cet effet dans le document (le temps qui s'écoule doit être visible par l'utilisateur si possible, via une cellule affichant le temps restant via un message tel que "Naissances dans : xx/xx/xx")

* Lorsque le temps fixé arrive à terme, une cellule sélectionnée se colore d'un fond sélectionné (vert)

* Un autre bouton permet de réinitialiser la cellule colorée à son état initial (ça je sais le faire)

Ca, c'est la première étape. L'idée est donc "d'avertir" l'utilisateur lorsqu'il a obtenu des naissances via la coloration d'une cellule (je sais qu'il existe des pop-up également mais je pense rester simple pour le coup : quoique ? que me conseillez-vous ? Je nage un peu dans les possibilités)

La deuxième étape, c'est qu'il me faudrait 10 chronomètres différents (sinon ce serait trop facile). En effet, il existe dans le jeu différents "temps de gestations" selon la variété de l'animal que l'on élève. Voici les différents temps et chronos nécessaires :

  • Chrono 1 : temps à fixer 48 heures - Une fois activé, affiche le temps restant à la cellule AV22. Si inactif, affiche "inactif"
  • Chrono 2 : temps à fixer 60 heures - Une fois activé, affiche le temps restant à la cellule AV23. Si inactif, affiche "inactif"
  • Chrono 3 : temps à fixer 72 heures - Une fois activé, affiche le temps restant à la cellule AV24. Si inactif, affiche "inactif"
  • Chrono 4 : temps à fixer 84 heures - Une fois activé, affiche le temps restant à la cellule AV25. Si inactif, affiche "inactif"
  • Chrono 5 : temps à fixer 96 heures - Une fois activé, affiche le temps restant à la cellule AV26. Si inactif, affiche "inactif"
  • Chrono 6 : temps à fixer 108 heures - Une fois activé, affiche le temps restant à la cellule AV27. Si inactif, affiche "inactif"
  • Chrono 7 : temps à fixer 120 heures - Une fois activé, affiche le temps restant à la cellule AV28. Si inactif, affiche "inactif"
  • Chrono 8 : temps à fixer 132 heures - Une fois activé, affiche le temps restant à la cellule AV29. Si inactif, affiche "inactif"
  • Chrono 9 : temps à fixer 144 heures - Une fois activé, affiche le temps restant à la cellule AV30. Si inactif, affiche "inactif"
  • Chrono 10 : temps à fixer 156 heures - Une fois activé, affiche le temps restant à la cellule AV31. Si inactif, affiche "inactif"
Quant à la cellule à colorer en vert lorsqu'un Chrono arrive à son échéance, il s'agit de la cellule AV32.

Chaque chrono disposerait de son propre bouton "Départ", mais chacun provoquera le même événement, à la même cellule : colorer une cellule prédéfinie en vert, avec un message du style "Naissances !".

Chaque chrono, à côté de son bouton "Départ" devra disposer d'un bouton "Réinitialiser".

S'il faut donner un nom à ces Chronos, ils s'appelleront chronologiquement "Génération 1", "Génération 2", "Génération 3",... "Génération 10".

Je ne demande pas la solution toute faite servie sur un plateau, je ne suis pas contre un coup de main voire un simple aiguillage

Le défi est-il relevable ?

Manque-t-il des détails ?

Si nécessaire je peux ajouter mon tableau en pièce jointe mais je n'ai pas jugé cela utile puisque particulièrement immergé dans l'univers du jeu vidéo.

Merci d'avance à tous,

nakSaan

Bonsoir,

Il y a un certain nombre d'éléments qu'il convient de prendre en compte dès le départ, voire avant de commencer la moindre mise en place.

D'abord la mesure du temps sur ton ordinateur est réalisée à partir d'un composant unique : l'horloge système. Toutes les applications qui ont à calculer des durées ou afficher des temps ne font qu'aller y piocher. Et avec Excel et VBA on ne fera jamais autre chose.

Donc la notion de x chronomètres est à recadrer, ce ne sont que des afficheurs dont la source de calcul du temps à partir d'un point de départ enregistré est la même.

Ensuite la notion de chronomètre : si tu entends par là un affichage permanent du décompte de temps à la seconde (en dessous de la seconde, il n'est même pas réaliste de l'envisager, et d'ailleurs cela ne présenterait aucun intérêt), tu vas avoir une procédure qui tournera en quasi-permanence. Je dis "quasi" car elle s'exécutera en quelques millisecondes mais sera relancée une fois par seconde.

Il vaut mieux donc dans ce cas ne pas avoir à travailler sur le fichier, car cela énerve assez vite !

Ceci dit, vu les temps que tu donnes, il est envisageable de mettre à jour les affichages de façon périodique, par exemple toutes les 10 minutes, de l'accentuer toutes les minutes dans la dernière heure (ou les deux dernières) et basculer sur un décompte à la seconde dans les deux dernières minutes...

Ce qu'on déclencherait est en principe un compte à rebours avant naissance. Pas de problème pour définir des cellules d'affichage (à gérer avec une variable), pour des colorations selon le temps restant à courir (affaire de MFC), stocker les temps de départ (variable, doublée peut-être d'une zone de stockage qui en permette la récupération en cas d'incident), des boutons de démarrage du décompte, la réinitialisation elle peut être automatique, lorsqu'on sera revenu à zéro.

Cela est relativement simple à réaliser et nécessite assez peu de code, à condition de ne pas se précipiter à écrire du code inutile ! Par exemple une procédure par bouton alors qu'une seule est suffisante pour tous les boutons !...

Comme d'habitude, un fichier est toujours nécessaire pour avancer et matérialiser... Je peux te décrire le programme à réaliser, ce qui sera d'ailleurs plus long que d'écrire le code, mais je doute que cela t'avance beaucoup...

Cordialement.

Bonsoir,

Un tout grand merci MrFerrand pour cette réponse riche en détails croustillants! J'ai longtemps hésité avant de venir poster ma difficulté, je suis ravi d'être aussi bien reçu sur le forum. C'est ce genre de réponses qui aident réellement le débutant à avancer vers un stade d'expérience plus avancé. Merci pour cette sagesse

J'ai parfaitement compris les éléments que vous soulevez. Concernant l'affichage en permanence du décompte des secondes, en effet ça peut rapidement devenir usant à l'oeil. Une mise à jours tous les quarts d'heures serait en effet plus adaptée au support Excel et ne nuirait pas à la précision de l'idée. Merci pour cet éclaircissement et cette mise au point sur la gestion du temps et des comptes à rebours (finalement le terme adapté était plutôt celui-ci).

Il n'est pas forcément nécessaire de "serrer" le compte à rebours (j'espère me faire comprendre) à 2 ou 5 minutes de la fin, peut-être qu'afficher le texte "Naissances imminentes !" lors du dernier quart d'heure dans la cellule qui sera ensuite colorée pourrait suffire.

Quant à la réinitialisation, j'aurais aimé une méthode automatique à la fin du décompte, mais aussi un bouton qui permette de le faire manuellement (si jamais on lance le chrono par erreur par exemple)

Puisque je fais face à un passionné, je m'empresse de joindre le fichier concerné

Pour se rendre à "l'endroit concerné", il faut cliquer sur le bouton "Mes élevages" -> Dragodindes, bouton "Voir ou modifier mes stocks" -> Vous y êtes ! Les cellules citées dans mon premier post sont déjà employées mais l'idée est de les remplacer par les différents comptes à rebours. Je trouverai une autre place pour le carré existant à cet emplacement, don't worry.

Encore merci, et bien cordialement!

Edit : Je viens apporter une précision : Vous me serez d'une énorme aide en me retournant un fichier dans lequel l'idée aura été intégrée par vos mains expertes, mais j'aimerais tout de même (à travers vos commentaires dans le code ? ou vos explications) comprendre la méthode afin de pouvoir la reproduire à d'autres endroits du fichier (je serai à nouveau confronté au cas pour un autre exemple, plus tard).

D'avance merci!

225classeur1.zip (273.91 Ko)

Je n'avais pas vu que tu étais sur Mac... mais je ne pense pas qu'on ait à utiliser d'élément incompatible.

Vu au fait que les noms de module sont affectés : deviennent ModuleÊ1, etc. J'ignore la raison de ce problème d'encodage mais c'es récurrent.

MFerrand a écrit :

Je n'avais pas vu que tu étais sur Mac... mais je ne pense pas qu'on ait à utiliser d'élément incompatible.

Vu au fait que les noms de module sont affectés : deviennent ModuleÊ1, etc. J'ignore la raison de ce problème d'encodage mais c'es récurrent.

Argh, vous voulez dire que vous ne pouvez lire le fichier sous Windows?

Problématique pour moi car l'idée à terme est de pouvoir partager le fichier, et nous sommes des utilisateurs minoritaires, sous OS X

Y'a t'il quelque chose de connu que l'on puisse faire face à ça?

Non pas de problème de lecture...

Ce qu'il y a c'est qu'un certain nombre d'éléments utilisés fréquemment sur PC ne peuvent l'être sur Mac, pas de contrôles ActiveX sur les feuilles, et d'autres bibliothèques de contrôles, de même que des outils comme le dictionnnaire ne sont pas utilisables...

Je constatais quelques modifications comme nom générique des modules qui se modifiaient, ce qui indique un problème d'encodage mais j'ignore quelle en est l'origine. C'est en tout cas une chose qui apparaît régulièrement sur des fichiers provenant de Mac.

Sinon pas de problème pour ce qu'on a à faire, je ne vois pas qu'il y ait des éléments incompatibles à utiliser. On verra ça à l'usage.

Je vois ça demain si je peux. J'ai codé un dispositif de compteurs qui présente quelques différences avec le tien il y a peu, mais la structure générale est assez semblable du point de vue fonctionnel. Pour toi il faudra prévoir soit un message indiquant les mises à jour, soit une bascule sur la plage d'affichage des temps...

Je vois déjà le "noyau dur" et je te soumettrai les choix fonctionnels...

Dans l'immédiat, si la zone Capacités spéciales est utilisée pour les compteurs de temps, où comptes-tu la déplacer ?

Sorry, j'ai mis un peu de temps à constater ta réponse.

Donc d'après ce que je déduis du début de ton retour en tout cas, c'est que les utilisateurs Windows n'auront pas de problème d'utilisation de mon fichier à l'avenir, apparemment c'est plutôt le chemin inverse qui aurait pu être problématique. Tant mieux pour moi.

Je te remercie encore pour ta réponse super chaleureuse et qui me remplit de joie (je cherchais depuis 15 heures cet après midi comment m'y prendre, noyé parmi toutes les approches trouvées sur le net, aucune ne s'adaptant réellement à ma requête).

J'espère que tu n'auras pas trop de mal à trouver comment t'y prendre.

Concernant la zone Capacités Spéciales, j'envisage de la déplacer dans le mode d'emploi carrément (qui n'existe pas encore mais prend mentalement forme peu à peu au fil du développement du programme). Je pense que le mode d'emploi sera fragmenté en autant de parties qu'il y aura de fonctions au fichier. Cela me permettra d'avancer une présentation élégante et adaptée au besoin de la recherche de l'utilisateur en difficulté. Pour en revenir aux Capacités Spéciales, c'est une information que l'on peut qualifier de "diverse" en jeu, car la majorité des "éleveurs" du jeu s'en foutent pas mal en réalité. Seuls les plus pointus sont attachés à garder ce genre de détails pas loin (les avoir sous la main, en cas de doute, d'oubli) : le mode d'emploi sera parfait pour déposer des informations qu'on a pas besoin régulièrement, mais qu'il est bon d'avoir pas loin (à mon sens).

Sinon, je m'adapterais une fois les comptes à rebours implantés, quitte à changer un peu l'aspect esthétique de la zone de la page, c'est loin d'être un souci pour moi.

Bonne fin de soirée!

nakSaan

Bonjour,

Pour anticiper d'éventuels problèmes... Peux-tu ouvrir le classeur joint et tester en appuyant successivement sur les 4 boutons.

Le premier est un lancement différé de macro, tu dois avoir un message au bout de 5 secondes qui dira si le test est OK.

En cas d'erreur d'exécution, tu devrais avoir un message affichant le numéro d'erreur.

Si erreur compilation, tu auras sans doute un arrêt te l'indiquant.

(Il s'agit de lancer en différé une macro avec argument, la méthode pour le faire n'étant pas documentée, je préfère qu'on vérifie avant si elle fonctionne sur Mac)

Pour les tests 2, 3 et 4, même chose mais il n'y a pas de temporisation.

Il s'agit d'appel d'une plage nommée, effectuée de 3 façons différentes... J'ai eu ce problème sur Mac récemment, une seule méthode fonctionnait. J'aimerais vérifier...

Cordialement.

Pour la suite, plus tard, je vais dans l'immédiat devoir renouveler mes approvisionnements alimentaires...

Bonjour,

Premier essai peu probant j'imagine, mais révélateur d'informations :

Je suppose que l'OS peut être un vrai frein entre deux utilisateurs différents. Désolé de te rajouter des difficultés

Bonnes courses, et gare à l'insolation ! 8)

Avais-tu enregistré le classeur avant de l'ouvrir ?

Curieux la référence à xml car les classeurs xls (ancienne version) ne sont pas xml !

Essaie avec celui-ci.

116naksaan-essaimac.xlsm (21.01 Ko)

Re-bonjour,

Test 2, 3, et 4 concluants!

Quant au test 1, je reçois une alerte (au bout des 5 secondes d'attente qui semblent s'activer correctement) "Impossible de trouver la macro "Essai 5".

P.S : Oui, tous mes téléchargements s'enregistrent d'office.

Si les tests 2, 3, 4 fonctionnent sans erreur, c'est déjà un souci de moins... Cela me surprend un peu car comme je l'ai dit sur un cas récent, l'intéressé avait 2 solutions sur ces 3 qui ne fonctionnaient pas. Je crois que c'était sur Excel 2011 pour Mac... en tout cas pas 2008, cela tient peut-être à ça.

Pour le test 1, si on ne peut appeler ainsi il va falloir procéder autrement, j'y réfléchis...

Par curiosité, et peut-être plus (?) : lorsque l'on utilise un nom de feuille dans une formule dans Excel (sous Windows), si le nom comporte des espaces ou est numérique, il faut l'encadrer il faut l'encadrer d'apostrophe (single quote) pour que ça fonctionne.

=Feuille Numéro 1!A1 ne fonctionnera pas (erreur)

='Feuille Numéro 1'!A1 fonctionnera.

En est-il de même sous Mac ?

(Je pose la question, car l'appel différé (avec OnTime) d'une procédure se fait en indiquant la procédure à exécuter sous la forme :

"'Essai 5'"

Il y a donc une certaine analogie...)

Ceci dit, si on trouve une méthode qui marche sur Mac, il faudra qu'elle fonctionne aussi sur PC, si ton classeur doit fonctionner sur les deux plateformes...

Cordialement.

Bonsoir MrFerrand,

J'attendais avec impatience ta réponse! Content de te lire.

Concernant ta question, je ne suis pas certain d'avoir bien saisi, je rappelle que mon niveau en VBA est qualifiable de débutant.

Néanmoins, j'ai enregistré une nouvelle Macro dans laquelle je fais une simple sélection d'une feuille qui comporte un nombre. Ici, Feuil1.

Sub Macro2()

'

' Macro2 Macro

'

'

Sheets("Feuil1").Select

End Sub

L'éditeur de Macros a pris la peine de mettre des guillemets autour du nom de la feuille.

Cela répond-il à ta question?

Sinon, je t'invite à me passer une formule toute bricolée qui permette de faire le test.

Je ne me doutais pas que l'idée serait aussi complexe à aborder.

MFerrand a écrit :

Ceci dit, si on trouve une méthode qui marche sur Mac, il faudra qu'elle fonctionne aussi sur PC, si ton classeur doit fonctionner sur les deux plateformes...

En effet. J'ai déjà commencé à faire tourner la partie fonctionnelle du fichier à quelques amis joueurs et ils sont ravis du projet, séduits par l'idée, conquis par les fonctions. Les retours des joueurs ont été plutôt motivants.

Jusqu'ici (pour avoir partagé le fichier avec des users Windows) toutes les fonctions utilisées sont fonctionnelles pour tous.

Il serait bon de pouvoir continuer, même s'il s'agit là d'un obstacle supplémentaire ! La compatibilité est un vrai problème de nos jours.

Par ailleurs, il y a une erreur quant à ma version spécifiée d'Excel. Je possède la version Mac 2016, mais je ne l'ai pas trouvé dans la (longue) liste lors de mon inscription...

Bien à toi et merci encore pour tout l'intérêt que tu portes à cette parcelle du projet.

Bonne soirée

Si quelqu'un a une idée, je suis preneur....

Bonjour,

Faut pas être impatient ! Je n'ai pas dit que je cessais de travailler dessus !

J'ai mis 9 procédures en chantier pour la mise en route des décomptes et leur mise à jour... Il s'en ajoutera sans doute pour les alertes finales et les accès automatiques à la zone...

Pour l'heure :

  • Plage nommée pour les cellules d'affichage des temps restants.
  • Sur la hauteur de la plage, le suivi des opérations utilise les colonnes AT (temps dévolu de gestation), AX (pour consigner l'unité de temps utilisée selon le temps restant...), AY (temps de départ : fécondation !), AZ (statut : "A" si actif, "M" si on passe en décompte minutage à la seconde [c'est pour les 2 dernières minutes]).
Les indications portées dans ces colonnes sont mise dans la couleur du fond, et ne sont donc pas directement visibles.

- En colonne AU, 10 boutons... (affichent des numéros de 1 à 10 : faut-il ajouter une mention ?)

- L'action sur les boutons lance une proc. Fécondation (codée) qui initialise le décompte, remplace l'affichage "inactif" par le temps restant, affecte une autre proc. au bouton (ChronoActif, non codée, qui affichera le temps restant exact si on appuie...) de façon qu'on ne puisse relancer si en cours, et programme le déclenchement différé de la prochaine mise à jour du temps.

- La mise à jour est effectuée par une proc. MajChrono (codée), lancée en différé au départ par la proc. d'initialisation, et qui programmera elle-même à chaque échéance sa relance pour la suivante.

Du début jusqu'à un temps restant de 3 heures, la mise à jour se fera par pallier de 15 minutes.

A partir de 3 heures jusqu'à un temps restant de 1 heure, la mise à jour se fera par pallier de 5 minutes.

A partir de 1 heure la mise à jour se fera par pallier de 1 minute, jusqu'à 2 minutes de temps restant.

Lors des changements de pallier, la proc. modifiera les paramètres utilisés en conséquence, jusqu'à 3 minutes de temps restant.

A 3 minutes, elle cesse de se relancer elle-même, mais programme l'initialisation du minutage pour lorsqu'on atteindra 2 minutes de temps restant (proc. InitMinuteur, non codée). Dans la mesure où il est possible que plusieurs compteurs passent en minutage dans une même période de 2 minutes, et que la programmation par la proc. de mise à jour peut ne pas les avoir programmé dans l'ordre chronologique, les compteurs à initialiser sont consignés dans une variable module (minut) et le cas échéant une proc. de vérification (VérifMinut, codée) est lancée pour les remettre dans l'ordre.

- L'initialisation du minutage lancera une proc. Minuteur (non codée) qui assurera l'affichage du décompte à la seconde sur les 2 dernières minutes. Elle désactive le bouton en lui affectant une proc. Inactif (à considérer codée, puisque sans code ! son rôle étant de conserver le comportement du bouton et empêcher qu'il soit sélectionner par un clic normal si aucune proc. ne lui était affectée).

- La proc. Naissance (à déclencher lorsque le décompte atteint 0) n'est bien sûr pas encore codée, de même qu'une proc. RepriseMaj qui sera lancée à l'ouverture du classeur. Comme le délai à suivre va de 2 à 6 jours, on peut donc imaginer que dans cet intervalle le fichier puisse être fermé, l'ordinateur éteint, ou qu'un incident quelconque aboutisse à réinitialiser des varaibles, faussant ainsi le suivi... Les temps de départ étant eux enregistrés, il est donc nécessaire de prévoir une relance globale du processus à partir d'une vérification des temps enregistrés, en cas d'interruption.

Cordialement.

Rechercher des sujets similaires à "creer minuteur evenement"