Rapport de message :*
 

Re: Double chrono dans un usf

Titre du sujet : Re: Double chrono dans un usf
par JeanMarie le 10/11/2012 09:38:57

Bonjour Fabrice, Didier, le forum

Mes connaissances en VBA sont plutôt faible, j'espère que je ne vais pas trop dire de bêtises.

Un premier point, tu utilises un bouton qui va avoir plusieurs actions différentes en fonction de l'étape ou tu te trouves, je pense personnellement que cela complique les choses, il vaut mieux avoir plusieurs boutons que l'on affiche ou que l'on masque ou que l'on rend provisoirement actif ou inactif.
J'ai donc créer 2 boutons "Stop", et 2 boutons "Reset" supplémentaires aux mêmes emplacements que les boutons Start.

Ensuite supprimé un module de gestion d'affichage du Timer, pour n'en avoir qu'un seul.

Modifier des déclarations de variables au niveau du module Timer
'Déclaration des variables, variable utilisable pour la globalité du projet
Public Temp1 As Double
Public Temp2 As Double
Public Depart1 As Double
Public Depart2 As Double
Public FinChrono1 As Byte
Public FinChrono2 As Byte
et ensuite modifier la sub de gestion de l'affichage des Timer, et supprimé tous les autres codes

Sub StartTimer()
'La gestion des chronos a été demandée
Do While (FinChrono1) = 0 Or (FinChrono2 = 0)
'tant que FinChrono1 ou que FinChrono2 est à 0
'cette boucle est exécutée
    If FinChrono1 = 0 Then
        'le chrono1 est lancé, actualisation du Timer1
        Temp1 = [now()] - Depart1
        UserForm1.Timer1.Caption = WorksheetFunction.Text(Temp1, "mm:ss.00")
    End If
    If FinChrono2 = 0 Then
        'le chrono2 est lancé, actualisation du Timer2
        Temp2 = [now()] - Depart2
        UserForm1.Timer2.Caption = WorksheetFunction.Text(Temp2, "mm:ss.00")
    End If
    DoEvents
Loop

End Sub
Cette Sub prend en charge la gestion globale des Timer

C'est dans le code du Userform1 qu'il y a le plus de modifications.

Rajout dans l'initialisation du Userform de l'affichage des boutons
Private Sub UserForm_Initialize()
    'Initialisation de l'userform
    Lap1.Enabled = False 'pour éviter de lancer le chrono par erreur
    Lap2.Enabled = False 'pour éviter de lancer le chrono par erreur
    Timer1.Caption = "00:00.00"
    Timer2.Caption = "00:00.00"
    'Affichage des boutons "Start"
    UserForm1.Go1.Visible = True
    UserForm1.Go2.Visible = True
    'Masque à l'affichage les autres Boutons
    UserForm1.Stop1.Visible = False
    UserForm1.Stop2.Visible = False
    UserForm1.Reset1.Visible = False
    UserForm1.Reset2.Visible = False
    'Initialisation à 1 des deux variables
    FinChrono1 = 1
    FinChrono2 = 1
End Sub

Rajout des codes Reset des 2 chronos
Private Sub Reset1_Click()
    'Clic sur le Bouton Reset du chrono1
    'RAZ des variables du chrono1
    Depart1 = 0
    UserForm1.Timer1.Caption = "00:00.00"
    'Masque le bouton Reset du chrono1 de l'affichage
    UserForm1.Reset1.Visible = False
    'Affichage du bouton Start du chrono1
    UserForm1.Go1.Visible = True
End Sub
Rajout des codes Stop des 2 chronos
Private Sub Stop1_Click()
    'Arrêt de la gestion du chrono1
    FinChrono1 = 1
    'Masque le bouton Stop du chrono1 de l'affichage
    UserForm1.Stop1.Visible = False
    'Affichage du bouton Reset du chrono1
    UserForm1.Reset1.Visible = True
    'Supprime la possibilité de cliquer sur le bouton RAZ du chrono1
    UserForm1.Lap1.Enabled = False
End Sub
De la modification des boutons Start
Private Sub Go1_Click()
'Sub pour le lancement du chrono1
'la variable Depart1 prend l'heure actuelle
Depart1 = [now()]
'Active la gestion du chrono1
FinChrono1 = 0
'Masque de l'affichage le bouton Start du chrono1
UserForm1.Go1.Visible = False
'Affichage du bouton Stop du chrono1
UserForm1.Stop1.Visible = True
'Active le bouton RAZ du chrono1
UserForm1.Lap1.Enabled = True
UserForm1.Lap1.SetFocus

If FinChrono2 = 1 Then
    'Lance la gestion du chrono, si celle-ci ne l'est pas
    StartTimer
End If

End Sub
Deux petites choses sur cette sub, La première instruction de cette sub est la mémorisation de l'heure machine dans la variable, pour coller au plus près de l'action du clic de l'utilisateur, les autres actions pouvant être effectuées pas la suite.
On ne relance pas la procédure StartTimer de gestion des Timers si celle-ci l'est déjà.

Modification du code de RAZ du timer, la RAZ est réduite à sa plus simple expression
Private Sub Lap1_Click()

'ici des lignes de codes seront rajoutées pour copier la valeur de la variable Temp1 dans un feuille du classeur

'ici on relance le chrono1
Depart1 = [now()]
End Sub

Modification de la procédure de fermeture du Userform
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
'Le Ueserform n'est plus actif
'Suppression de la gestion des chronos
'La sub StatTimer s'arrêtera d'elle même
    FinChrono1 = 0
    FinChrono2 = 0
End Sub
C'est le passage des variables qui arrête la gestion des Timers,

Et pour finir la modification de fermeture du fichier
Private Sub Workbook_BeforeClose(Cancel As Boolean) '
    FinChrono1 = 0
    FinChrono2 = 0
End Sub

Voilà pour ce qui est des modifications de tes codes.

@+Jean-Marie