Sauvegarder/Quitter quand inactif

Bonjour,

J'ai créé un fichier qui est utilisé régulièrement par plusieurs personnes.

J'ai donc ajouté un code, trouvé sur le net (voir plus bas), qui sauvegarde et ferme le fichier au bout de 5 minutes si le PC n'est pas utilisé (détection de mouvement de souris et de clavier).

Le problème, c'est que les utilisateurs laissent souvent le fichier excel ouvert, en arrière plan, pendant qu'ils travaillent sur un autre logiciel. Et donc, le décompte de 5 minutes ne démarre pas.

Je me demande s'il y a une façon de modifier ce code de manière à ce que le décompte démarre dès que le PC n'est pas utilisé OU que l'application n'est plus en "focus".

Une idée ?

Merci,

PS: je suis plutôt pas terrible en VBA. Je me contente de modifier les codes que je trouve.

Private Declare Function GetLastInputInfo Lib "user32.dll" (ByRef plii As LASTINPUTINFO) As Long
Private Type LASTINPUTINFO
 cbSize As Long
 dwTime As Long
End Type
Public Cycle_Ctrl, TimeOut, TesT, Ttr

Private Sub Test_Util()                 'Teste la présence d'un utilisateur
On Error Resume Next
TesT = 1                                'le Timer est On
Sheets(2).Range("U6").FormulaR1C1 = "Start"
Dim yaLastInput As LASTINPUTINFO        'c'est la variable qui detecte l'activité Clavier & Souris
Static yaMemoLastInput As Long
  yaLastInput.cbSize = Len(yaLastInput)
 If GetLastInputInfo(yaLastInput) <> 0 Then
    If yaMemoLastInput <> yaLastInput.dwTime Then
        yaMemoLastInput = yaLastInput.dwTime 'Memorise "le moment" de la derniére activité.
        YaQuelcun 'Le moment de la derniére activité à évolué on continue.
     End If
 End If
 Cycle_Ctrl = Now + TimeSerial(0, 0, Ttr) 'Cycle de Contrôle d'activité toutes les "Ttr"s
 Cpt_Off
 Application.OnTime Cycle_Ctrl, "Test_Util" 'Relance le Test
End Sub

Private Sub YaPerson()                  'Au bout de 5mn on ferme l'appli. ("Eject")
    On Error Resume Next
    Application.OnTime Cycle_Ctrl, "Test_Util", , False 'Intercepte le dernier Cycle de Contrôle
    TesT = 0                            'Le Timer est Off
    Sheets(2).Range("U6").FormulaR1C1 = "Stop"
    UserForm1.Hide
'    ZoZo = MsgBox("That's all folks !!!", vbExclamation, "TIMEOUT")
    Application.OnTime Now + TimeSerial(0, 0, 1), "Eject" 'lance la fermeture du fichier dans 1s le temps d'intercepter le timer
End Sub

Private Sub YaQuelcun()             ' On détecte l'utilisateur, on continue
     Static yaLastDate As Date      'Variable statique permettant d'effacer la tache planifiée..
     If yaLastDate <> 0 Then
       ' Efface la date planifiée ..
       On Error Resume Next
        Application.OnTime yaLastDate, "YaPerson", , False 'intercepte YaPerson et relance le timer
        UserForm1.Hide          ' le timeout est relancé, on cache le Userform
        Ttr = 5                 ' Le cycle de scrutation repasse à 5s.
     End If
'Calcule la prochaine échéance dans 5mn(+1s pour lancer "Eject")
      yaLastDate = Now + TimeSerial(0, 5, 0)
      TimeOut = yaLastDate         ' Mémorisation de la valeur du TimeOut.
      Application.OnTime yaLastDate, "YaPerson" 'Appel procédure fermeture de l'application
    End Sub

Private Sub Stop_Timer()                'Commande cachée pour arrêter TimeOut proprement.
On Error Resume Next
    Application.OnTime Cycle_Ctrl, "Test_Util", , False 'Intercepte le dernier Cycle de Contrôle
    Application.OnTime TimeOut, "YaPerson", , False ' Intercepte le TimeOut
    TesT = 0                            'le est Timer OFF
    Sheets(2).Range("U6").FormulaR1C1 = "Stop"
    UserForm1.Hide
    ZoZo = MsgBox("Arrêt du Timer", vbInformation, "TIME OUT STOP !!!") '(message Info)
End Sub

Private Sub End_Timer()             'A lancer dans "BeforeClose" pour arrêter le Timer
On Error Resume Next                ' lors de la fermeture volontaire du fichier.
    Application.OnTime Cycle_Ctrl, "Test_Util", , False 'Intercepte le dernier Cycle de Contrôle
    Application.OnTime TimeOut, "YaPerson", , False ' Intercepte le TimeOut
    TesT = 0                        'le est Timer OFF
    UserForm1.Hide
End Sub

Private Sub Start_Timer()           'Commande de demarrage du TimeOut - A lancer dand Workbook_Open.
    Ttr = 5                         ' C'est le cycle de scrutation du Timer : 5s
    Test_Util                       ' Lance le bazard.
End Sub

Private Sub Eject()
' Procédure de sortie de l'application (proprement avec sauvegarde !!)
On Error Resume Next
Dim i, xx2, xx3
    End_Timer
    UserForm1.Hide
' Ferme toutes les feuilles ouvertes , puis ferme l'application.
    xx2 = Workbooks.Count
    xx3 = xc + 1
    For i = xx2 To xx3 Step -1
    Workbooks(i).Activate
' Teste si le fichier courant est en Lecture Seule
    If Right(Application.Caption, 15) = "[Lecture seule]" Then GoTo 100 Else
    ActiveWorkbook.Save
100 '
    ActiveWorkbook.Saved = True
    ActiveWorkbook.Close
    Next
' Teste si le Workbook est en Lecture Seule
If Right(Application.Caption, 15) = "[Lecture seule]" Then GoTo 200 Else
ActiveWorkbook.Save
200 '
ActiveWorkbook.Saved = True
ActiveWorkbook.Close
End Sub

Private Function Cpt_Off()      ' C'est la fonction qui gère l'affichage du compte à rebour.
Dim aaa, ZaZa
aaa = TimeOut - Now
ZaZa = Format(aaa, "long time")
Sheets(2).Range("V6").FormulaR1C1 = Ttr
Sheets(2).Range("W6").FormulaR1C1 = Format(TimeOut, "long time")
Sheets(2).Range("X6").FormulaR1C1 = ZaZa
    If UserForm1.Visible = True Then GoTo 50 Else ' L'affichage du Userform n'est demandé qu'une seule fois.
    If ZaZa < "00:00:28" Then UserForm1.Show Else ' affiche le temps restant dans le Userform.
50  ' L'affichage du Userform passe le cycle de scutation à 1s. (compte à rebour)
UserForm1.Label3.Caption = Right(ZaZa, 2)
End Function

Personne n'a de solution à mon problème ?

Bonjour,

J'ai développé récemment un programme dont la demande ressemble beaucoup à la vôtre.

Je le mets en pièce jointe si cela peut vous aider.

Cordialement.

PMO

Patrick Morange

Rechercher des sujets similaires à "sauvegarder quitter quand inactif"