Boite de dialogue et fermeture automatique

Nplayer76

XLDnaute Nouveau
Bonjour,
je m'en remets une nouvelle fois au savoir de ce forum.

Voici mon problème :
J'ai fait une macro pour qu'un fichier se ferme au bout d'un certain temps (Pour éviter que certaines personnes le laissent ouvert toute la journée)
Une boite de dialogue s'affiche 10 secondes avant la fermeture pour prévenir.
Mais je souhaiterai donner la possibilité à quelqu'un d'indiquer qu'elle travaille encore sur le fichier et qu'il faut repousser la fermeture.

Soit je passe par une msgbox, mais dans ce cas le fichier ne se ferme pas si on ne clique pas sur la msgbox.
Soit je passe par CreateObject("Wscript.shell").Popup, mais dans ce cas je ne peux pas repousser le chrono.

Après de nombreuses recherches sur internet je n'ai pas trouvé de solution.

L'un d'entre vous pourra-t-il me venir en aide ?

Voici mon code utilisé :
Code:
Sub Timing() 'Déclenche le chrono de 10 minutes

Application.OnTime Now + TimeValue("00:10:05"), "Alerte_Fermeture"

End Sub

Sub Alerte_Fermeture() 'Affiche la boite de dialogue

CreateObject("Wscript.shell").Popup "Le tableau de suivi du courrier est ouvert depuis 10 minutes." & vbLf & vbLf & "Veuillez sauvegarder votre travail et fermer le fichier .", 5, "! ATTENTION !", vbExclamation

Application.OnTime Now + TimeValue("00:00:10"), "Fermeture"

End Sub

Sub Fermeture() 'Ferme le fichier

ThisWorkbook.Close True

End Sub

D'avance merci
 
Dernière édition:

Nplayer76

XLDnaute Nouveau
Bonjour,
merci pour la réponse rapide.

Je viens de tester le fichier, et il ne se passe rien chez moi. Et n'ayant pas de connaissance sur les modules de classe, votre macro me dépasse complètement. Je ne trouve même pas comment régler le délai ^^

Merci de me redire si vous trouvez d'où vient le problème.
 

Dranreb

XLDnaute Barbatruc
Notez que si vous préférez on pourrait aussi l'écrire comme ça.

Et si on pouvait consacrer une cellule au temps restant, affiché en permanence, on pourrait encore le faire différemment, et mettre une mise en forme conditionnelle la faisant passer progressivement du vert au rouge quand la fermeture devient imminente.
 

Pièces jointes

  • PlanifNplayer76.xlsm
    25.3 KB · Affichages: 51

Dranreb

XLDnaute Barbatruc
Une autre version qui semble en même temps résoudre le problème de la détection avant fermeture effective du classeur, et non avant fermeture possible sous réserve que l'utilisateur fasse Annuler lors du message demandant s'il veut ou non enregistrer les modifications.
En cas de désactivation de la fenêtre non consécutive à une demande de fermeture du classeur, le dialogue est lancé dans la seconde qui suit.
 

Pièces jointes

  • PlanifNplayer76.xlsm
    25.8 KB · Affichages: 70

Nplayer76

XLDnaute Nouveau
Bonjour,

je viens de me rendre compte que lorsque l'on reporte la fermeture du fichier, le compte à rebours de 10 secondes de la prochaine alerte ne se déclenchera pas si le fichier excel n'est pas en fenêtre "active". Si la personne n'est pas devant son PC le fichier ne se fermera alors pas.

Je n'ai pas trouvé le paramètre en cause.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Effectivement lorsqu'on n'est pas sur l'application, Windows demande à l'activer pour que l'UserForm puisse s'afficher. C'est bien embêtant. Je ne vois qu'une possibilité qui pourrait peut être résoudre le problème: mettre sa propriété ShowModal à False et l'afficher en permanence dès le début. Ça vous irait ?
 

Dranreb

XLDnaute Barbatruc
Non, je n'ai pas dit que c'était suffisant: ça change complètement la programmation à mettre derrière aussi, en la simplifiant un tout petit peu d'ailleurs.
L'UserForm serait affiché en permanence, dès l'ouverture.

Dans ThisWorkbook :
VB:
Option Explicit
Private WithEvents FermetureAnnulée As Planification, _
   FermetureDemandée As Boolean

Private Sub Workbook_Open()
UFmPrévFerm.Show
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
FermetureDemandée = True
Set FermetureAnnulée = New Planification
FermetureAnnulée.PlanifierDans 1
End Sub

Private Sub FermetureAnnulée_Échoit()
FermetureDemandée = False
End Sub

Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
If FermetureDemandée Then MPlanificateur.DéplanifierTout
End Sub
Dans UFmPrévFerm :
VB:
Option Explicit
Private WithEvents Décompte As Planification, SecRest As Long

Private Sub UserForm_Initialize()
Set Décompte = New Planification
SecRest = 600
MàJTempsRest
End Sub

Sub MàJTempsRest()
Labinfo.Caption = "Fermeture dans " & Format(SecRest / 86400, "mm:ss")
Décompte.PlanifierDans 1
End Sub

Private Sub Décompte_Échoit()
SecRest = SecRest - 1
If SecRest > 0 Then
   MàJTempsRest
Else
   ThisWorkbook.Close SaveChanges:=True
   End If
End Sub

Private Sub CBnReporter_Click()
SecRest = 300
MàJTempsRest
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode > vbFormControlMenu Then Exit Sub
Décompte.Déplanifier
ThisWorkbook.Close SaveChanges:=True
End Sub
À tester.
 

Discussions similaires

Statistiques des forums

Discussions
314 653
Messages
2 111 584
Membres
111 208
dernier inscrit
estalavista