Problème avec un compte à rebours

pat01200

XLDnaute Occasionnel
Bonjour le forum,

J'ai créé une minuterie sous Excel qui fonctionne plutôt bien... sauf que si je bascule sur un autre fichier Excel le compte à rebours s'arrête et ne redémarre que si je reviens sur ma minuterie. J'ai essayé d'utiliser les fonctions activate et deactivate, mais sans succès...
Quelqu'un aurait-il un bout de code pour que ma minuterie continue d'égrener ses secondes même lorsque je travaille sur un autre fichier Excel ?

En PJ mon fichier...

Merci d'avance
Pat
 

Pièces jointes

  • Minuterie.xls
    106.5 KB · Affichages: 86

Hieu

XLDnaute Impliqué
Salut,

Ton code ne prend pas en compte la feuille excel qui lance la macro. Lorsque tu dis par exemple Range("T1"), si tu changes d'onglet/ de feuilles excel, la macro cherche la cellule "T1" sur le fichier et l'onglet actif, c'est pourquoi, ça bug, si tu bouges.

Voilà une idée :
VB:
Sub Redémarrer()
Set a = Workbooks("Minuterie.xls").Sheets("Feuil1")
    a.Range("T1").Copy
    a.Range("D3").PasteSpecial Paste:=xlPasteValues
    a.Range("D3").Font.ColorIndex = 3
Call CountUp
End Sub
J'en ai profité pour retirer les .select, qui ne servent à rien.

Essaie de faire ça, sur tout ton programme, et reviens ici.
 

pat01200

XLDnaute Occasionnel
Bonjour et merci pour cette première amorce, mais ça ne résout pas mon problème. Je me suis d'ailleurs mal fait comprendre sans doute en exposant ce problème, je réexpose donc la situation :
J'ouvre un fichier de travail Excel puis je lance ma minuterie. A partir de cet instant, le compte à rebours se déclenche et fonctionne tant que la minuterie reste affichée à l'écran, mais si je retourne dans mon fichier de travail, il n'y a pas à proprement parler de bug (aucun message d'erreur !), sauf que le compte à rebours se fige et ne reprend son décompte que si je réaffiche la minuterie. A noter que si je passe de ma minuterie à n'importe quelle application autre qu'Excel, ce problème d'arrêt intempestif ne se produit pas...
 

Dranreb

XLDnaute Barbatruc
Bonjour.
De toute façon il vaudrait mieux noter dans une variable globale Private l'heure où le compteur devra retomber à 0, et toujours afficher la différence entre cette heure notée et celle de la mise à jour de l'affichage. Comme ça au moins même si elle ne se fait plus le décompte reste juste.
Par ailleurs quand on retourne dans le fichier de travail ce n'est pas pour continuer à fixer des yeux un décompte géant comme ça, normalement on ne le voit plus, alors je ne comprends pas trop l'intérêt de continuer à les égrainer visuellement, pourvu que ça reste juste quand on revient dessus comme préconisé plus haut.
 
Dernière édition:

pat01200

XLDnaute Occasionnel
Merci pour ces précisions, cependant le décompte ne me sert pas à moi, mais aux joueurs que j'arbitre en concours. J'ai créé cette minuterie "géante" pour l'afficher par vidéo projecteur afin que les joueurs (même ceux du fond de la salle !) sachent le temps qu'il leur reste, mais je dois pouvoir aller dans mon fichier de travail pour saisir par exemple les scores de ceux qui ont fini avant. J'ai donc besoin de pouvoir naviguer de l'un à l'autre à ma guise, avec un compte à rebours qui continue d'égrener les secondes bien que n'apparaissant pas à l'écran. Y a-t-il une solution pour cela ?
 

Dranreb

XLDnaute Barbatruc
Qu'est ce que ça change au fait que personne ne le voit quand vous saisissez le score ?
Si personne ne le voit l'égrenage visuel est inutile, seul l'égrenage logique doit rester juste, et je vous ai dit comment faire pour cela.
Ce serait différent naturellement si le décompte demeurait affiché via un UserForm.
 
Dernière édition:

pat01200

XLDnaute Occasionnel
Ben si personne ne le voit pendant que je saisis les scores, j'ai quand même besoin que le compte à rebours continue de tourner ! Mettons que j'aie donné 30 minutes aux joueurs pour disputer une partie (je déclenche alors ma minuterie en ayant choisi 30 mn à l'aide de mon userform), s'il me faut 30 secondes par saisie et que pendant ce temps le compte à rebours ne tourne pas, au bout de 10 saisies, cela fait 5 minutes de perdues. Au bout du compte, la sonnerie se déclenchera après 35 minutes de temps réel et non 30 minutes !!!
 

Dranreb

XLDnaute Barbatruc
Je vois que vous n'avez rien suivi de ce que je vous ai conseillé. Sans doute parce que vous vous êtes obstinément refusé à essayer de comprendre. Tant pis pour vous.
Une dernière tentative deséspérée de ma part: le décompte ne se fait plus, on s'en fout, l'heure, elle, continue d'avancer ! Alors bon sang afficher donc des différences d'heures et non pas des cumuls de secondes exécutées ou non !!
 
Dernière édition:

pat01200

XLDnaute Occasionnel
Visiblement c'est vous qui ne comprenez pas la situation. Je la réexplique donc :
1) J'utilise un fichier/programme Excel de gestion d'un concours qui se déroule en plusieurs manches (dans ce post, je l'ai appelé "mon fichier de travail").
2) Les joueurs ayant une durée limitée pour jouer chaque manche, au début de chacune d'elle (ça peut être A N'IMPORTE QUELLE HEURE !) je déclenche mon compte à rebours qui produit une sonnerie lorsqu'il arrive à zéro, indiquant ainsi aux joueurs que le temps imparti est terminé et qu'ils doivent arrêter même s'ils n'ont pas fini !
3) Si le compte à rebours ne fonctionne pas chaque fois que je vais sur mon fichier de travail, les joueurs vont jouer leurs manches en plus de temps qu'ils n'en ont le droit !!!
 

Dranreb

XLDnaute Barbatruc
Non, non, c'est bien vous qui ne comprenez rien à rien, je vous assure !
On démarre pour 45 minutes: Vous notez HeureFin = Now + TimeSerial(0, 45, 0)
À chaque occasion vous afficher HeureFin - Now, c'est tout.
HeureFin doit être une variable globale, cela va de soi. Inutile qu'elle soit Public, Private suffit.
 
Dernière édition:

pat01200

XLDnaute Occasionnel
Ah bon ? Dans vos explications, tout ce que je comprends c'est que vous voulez à tout prix que j'abandonne mon compte à rebours, et ce n'est pas du tout, mais alors là PAS DU TOUT ce que je souhaite. Moi je veux un compte à rebours FONCTIONNEL qui sonne au bout du temps que je lui demande de décompter et pas quand on arrive à telle ou telle heure !!! Si vous n'avez pas de solution pour que mon compte à rebours fonctionne, je préfère que vous me disiez par exemple que c'est impossible !
 

mutzik

XLDnaute Barbatruc
bonjour pat01200, Dranreb

j'ai été confronté au même problème
la solution réside là
https://support.microsoft.com/fr-fr/kb/2551928
en fait, il faut ouvrir deux instances d'excel sur le poste de travail si on veut que les macros continuent à fonctionner sur la première instance (sur le 2ème écran je présume)

en fait j'avais (il y a longtemps) également fait un timer de ce genre pour des parties d'echecs limitées en temps
par ex : les joueurs ont 3 minutes pour la partie
au bout de 2mn 30, si je change d'instance d'excel, les joueurs peuvent continuer au-delà des 3 minutes puisque non avertis du temps écoulé

Avec les deux instances d'excel, chacune peut faire tourner ses propres macros ... et je peux rentrer mes résultats en même temps que mon chrono continue à tourner
 

Dranreb

XLDnaute Barbatruc
En fait j'ai réfléchi, vous auriez plutôt intérêt à faire HeureFin = Now + Feuil1.[D3].Value au lancement.
À la procédure de mise à jour d'affichage: Feuil1.[D3] = HeureFin - Now
Remarquez Feuil1.[D3] au lieu de Range("D3") parce que lorsque vous activez un autre classeur, je ne pense pas que la cellule D3 de la feuille active ait un rapport avec tout ça !
N'oubliez pas les déclarations globales.
VB:
Option Explicit
Private HeureFin As Date, HeureOnTime As Date
Vous aurez besoin tot ou tard de HeureOnTime pour pouvoir faire :
VB:
Application.OnTime HeureOnTime, "Comptage", Schedule:=False
 
Dernière édition:

Discussions similaires

Réponses
24
Affichages
3 K

Statistiques des forums

Discussions
315 098
Messages
2 116 191
Membres
112 679
dernier inscrit
Yupanki