Bonjour,
Pour pouvoir mettre en pause, il te faut utiliser une variable Booléenne publique (visible dans tout le projet par tous les objets) puis la mettre à Vrai à l'ouverture d'un formulaire et à Faux à sa fermeture avec relance du Timer. Code dans les formulaires (strictement identiques pour les trois) :
Private Sub UserForm_Activate()
Pause = True
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
RelancerTimer
End Sub
La procédure de relance appelée à la fermeture du formulaire ayant mis en pause :
Sub RelancerTimer()
Pause = False
Timer
End Sub
Et enfin, le Timer avec contrôle de la variable "Pause" :
Sub Timer()
Sheets("MENU").Label1.Caption = "Il reste " & Format(Minute, "hh:mm:ss") & " avant la femeture auto"
Progression Max - Minute, Max
Minute = Minute - Intervalle
If Pause = True Then Exit Sub '<--- contrôle pour une pause éventuelle
If Minute < 0 Then
ThisWorkbook.Save
'Application.Quit
Exit Sub
End If
Application.OnTime Now + TimeValue(Format(Intervalle, "hh:mm:ss")), "Timer"
End Sub
Concernant cette question :
Mais je me suis rendu compte que une fois le timer lancé et si j'appui à nouveau sur le bouton, le timer repart à zéro mais le décompte ne ce fait plus correctement ! Comment faire pour avoir un bouton qui reset correctement le timer ?
C'est normal qu'à chaque appuis sur le bouton (ou même en lançant directement depuis le VBE) le décompte repart à zéro puisque ça réinitialise les valeurs et on le voit bien dans le code que minute est remis à 15 (j'ai modifié pour plus de clarté) et le Label repositionné :
Sub Decompte()
Heure = 1 / 24
Minute = Heure / 60
Seconde = Minute / 60
Minute = Minute * 15
Intervalle = Seconde
With Sheets("MENU")
.LblProgress.Width = 0
.LblProgress.Top = .LblFond.Top
.LblProgress.Left = .LblFond.Left
.LblProgress.Height = .LblFond.Height
.LblProgress.TextAlign = fmTextAlignCenter
End With
Max = Minute
Timer
End Sub
Si tu mets un point d'arrêt sur la ligne de code : ThisWorkbook.Save
et que tu cliques deux ou trois secondes avant terme, le compilateur n'atteindra pas cette ligne car "Minute" est réinitialisée et donc la condition : If Minute < 0 Then
ne sera pas remplie !