Je ne suis pas sûr de répondre correctement à la question, toutefois je fais une proposition:
Dans la cellule “A1” l’heure actuelle.
La cellule “C2” tirer vers le bas autant que nécessaire.
2 codes VBA dans le Thisworkbook
L’un servant a stopper “OnTime” à la fermeture du fichier
L’autre servant a déclencher automatiquement “OnTime” à l’ouverture du fichier.
Option Explicit
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'StopTempo à la fermeture du fichier
StopTempo
End Sub
Private Sub Workbook_Open()
'Activation de l'heure à l'ouverture du fichier
Tempo
End Sub
Option Explicit
Dim Tps As Date
Sub Tempo()
'Programmation de l'évènement toutes les secondes
Tps = Now + TimeValue("00:00:01")
Application.OnTime Tps, "Tempo"
'Traitement
Sheets(1).Range("A1").Value = Format(Now, "hh:nn:ss")
End Sub
Sub StopTempo()
On Error Resume Next
'Stopper la gestion de l'évènement OnTime en cours
Application.OnTime Tps, "Tempo", , False
End Sub
Ses 2 Macros sont associées aux 2 boutons que j’ai nommé “Go Start” pour déclencher le démarrage des chronos et l’autre “Stop Start” pour arrêter les chronos.
A tu fais un petit essai avec ton classeur de décompte d’heure en route et ouvrir un nouveau classeur ou un classeur existant.
Il me semble que la cellule A1 de la feuil1 sera impactée de l’heure actuelle
C’est le but de ce forum de @DocteurExcel, ne pas se contenter d’apporter la réponse, mais d’expliquer dans un langage le plus clair possible la méthode pour arriver au résultat attendu.
Ce qui permet le partage des connaissances avec plus grand nombre d’entre nous.
Une autre approche avec un Userform (ce qui évitera d’avoir l’heure sur un autre classeur que l’ouvre par mégarde et qui prendra la valeur de l’heure actuelle - Si formule en C6 dans ce classeur, la formule est détruite)
code Module
Option Explicit
Dim mDate As Date ' Variable
Dim h%, m%, s%, i%
Dim mCourse$
Sub LanceCompteur()
i = 3 'N° ligne départ
h = Hour(Sheets("Feuil1").Range("AB" & i).Value) 'Récupère heure - minute - seconde sur première course
m = Minute(Sheets("Feuil1").Range("AB" & i).Value)
s = Second(Sheets("Feuil1").Range("AB" & i).Value)
mDate = Now + TimeSerial(h, m, s) 'place dans la variable heure - minute et seconde
mCourse = Sheets("Feuil1").Range("Z" & i).Value ' variable affiche le nom de la course
MajCompteur
End Sub
Sub MajCompteur() ' Procedure mise à jout compteur
Dim dRestant As Date
If mDate > 0 Then 'si l'heure existe
dRestant = mDate - Now 'calcul temps restant
If dRestant > 0 Then 'si temps restant sup. à 0
Application.OnTime Now + TimeValue("00:00:01"), "MajCompteur" ' Auto-Rappel dans 1s pour Mise à jour
UserForm1.L_Rebours.Caption = Sheets("Feuil1").Range("C3").Value 'affiche nom de course
Else
i = i + 1 'ajoute une ligne et recherche Heure - minute - secondes
h = Hour(Sheets("Feuil1").Range("AB" & i).Value)
m = Minute(Sheets("Feuil1").Range("AB" & i).Value)
s = Second(Sheets("Feuil1").Range("AB" & i).Value)
mCourse = Sheets("Feuil1").Range("Z" & i).Value 'affiche nom de course
mDate = Now + TimeSerial(h, m, s) 'place dans la variable heure - minute et seconde
If Sheets("Feuil1").Range("Z" & i).Value <> "" Then ' si colonne Z n'est paasvide
MajCompteur 'recommence l'opération
Else 'sinon
UserForm1.L_Rebours.Caption = "Fin des courses" 'affiche fin des courses
UserForm1.T_Rebours = "00:00:00" 'met le Textbox du compte à rebours à 0
mDate = 0
Exit Sub 'sort de la macro
End If
End If
UserForm1.L_Rebours.Caption = mCourse
UserForm1.T_Rebours = Format(dRestant, "hh:mm:ss")
UserForm1.T_Heure = Time
End If
End Sub
Le bouton Raz, remet le départ depuis la première course avec un délai de 1 sec. (obligatoire)
l’Userform se lance à l’ouverture du classeur, en haut à gauche de l’écran, mais peut être déplacé
l’Userform en mode non modal permet de travailler sur le classeur.
J’ai ajouté sur colonne AB une formule permettant de mettre le compteur à “0:00:01” si l’heure de AE est dépassée par l’heure actuelle. Décompte d’une Heure a la suivante V2.xlsm (31,6 Ko)