Timer sur Userform inactif et fermeture du classeur

Bonjour le forum,

je vous lance une réflexion avant le weekend!

J'ai un classeur qui fonctionne seulement avec des formulaires, les feuilles étant inaccessibles aux usagers. Et je voudrais que le classeur se ferme automatiquement s'il n'y a aucune activité dans les userforms. Il y a potentiellement deux formulaires d'ouvert en même temps (celui de l'accueil et un autre de recherche).

J'ai trouvé plusieurs optons de code sur le net. Or, j'ai mis un timer sur l'userform de l'accueil (10 minutes) et un pour le fichier (1 seconde). Les timers fonctionnent bien, mais comme j'ai mis un code pour empêcher de fermer l'userform par le X , la fermeture ramène au msgBox de la commande:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

MsgBox "Utilisez le bouton rouge : Quittez le répertoire"

If CloseMode = 0 Then Cancel = True

End Sub

Je me demande comment il serait possible de fermer le tout sans aucune intervention?

Merci pour vos lumières, je vous refile les codes.

TIMER pour l'userform

Userform

Private Sub UserForm_Initialize()
  dTime = Time + TimeValue("00:10:00")
Application.OnTime dTime, "KillUserForm"
End Sub

Module

Public dTime As Date

Sub KillUserForm()
    'Unload UserForm1
    Unload UserForm2
    'Unload UserForm3
End Sub

TIMER pour le classeur

Workbook

Private Sub Workbook_Open()
UserForm2.Show
'=Code '' =explication

''Le temps pendant lequel le fichier n'est pas activé
'' à ajuster ici c'est réglé sur 05 minutes !
    Arrêt = False: Laps = Timer
    Durée = TimeValue("01:00:00")
    Départ

End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
'Remarque : cette macro événementielle détecte les clics dans une cellule du classeur.
'Vous pouvez bien entendu utiliser un autre événement pour décider qu'un classeur est inactif
'Pas de clic dans une cellule donnée, pas de saisie dans un userform, pas de changement de feuille...
Arrêt = True
Laps = Timer
End Sub

Module

Option Explicit

Public Durée As Date
Public Arrêt As Boolean
Public Laps As Double

Sub Départ()

Dim D As Date
D = Now + TimeValue(Durée)
Application.OnTime D, "FermerLeClasseur"
Durée = TimeValue("01:00:00")
End Sub
Sub FermerLeClasseur()

Dim M As Integer
Dim s As Integer
Dim R

If Arrêt = False Then
    'Ferme et enregistre le classeur.
  ThisWorkbook.Close True

Else
    Laps = Timer - Laps
    M = Int(Laps / 60)
    s = Int(Laps - M * 60)
    R = TimeValue("00:" & M & ":" & s)
    Durée = TimeValue(Durée) - R
    Arrêt = False
    Départ
End If

End Sub

Bonsoir le forum,

Interlude :

165usf-timer.xlsm (19.60 Ko)

Bonsoir,

Je m'arrête à ton QueryClose cité au début de ton post !

Je pense toujours que vouloir faire passer à toute force l'utilisateur par le bouton que l'on a dédié à la fermeture, c'est de la réaction de petit chef complexé imbu de son pouvoir dont il craint à tout moment la mise en cause...

Curieux ! Mais ça m'incite généralement à passer outre ! Va savoir pourquoi !

Il est tout de même fort simple d'éliminer tout problème en redirigeant la demande de fermeture sur la procédure prévue pour cela !

    If CloseMode = vbFormControlMenu Then NomProcdeFermeture

Ainsi on n'emmerde pas bêtement l'utilisateur, et on élimine un problème.

Cordialement.

Bonjour MFerrand,

Si je comprends bien, vous ne maîtrisez pas uniquement Excel à la perfection, mais aussi le DSM 6!

Pouvez vous, svp, me préciser où je dois intégrer votre solution.

Merci pour tout, c'est grandement apprécié.

Bonsoir,

La procédure à modifier est celle que tu cites : UserForm_QueryClose...

La modification à apporter consiste à appeler la procédure attachée au bouton rouge Quittez le répertoire que tu mentionnes dans ton message, et que j'ignore (mais c'est toi qui connaît ton code...) : au lieu d'un mesage à l'utilisateur, on dit simplement au code d'aller exécuter la procédure que l'on demandait à l'utilisateur de lancer avec le bouton...

Cordialement.

Bonjour MFerrand

L'idée est super, je comprends le principe.

Autre petite question : Est ce que le NomProcdeFermeture sera le nom du bouton de fermeture (CommandButton)?

Le nom de la procédure (que tu n'as pas fourni).

Bonsoir MFerrand

celle-là vous voulez dire ?

Private Sub CommandButton5_Click()
ThisWorkbook.Close True
End Sub

C'est toi qui sait !

Si c'est celle-ci, tu remplaces NomProcdeFermeture par CommandButton5_Click...

Bonsoir MFerrand,

trop génial!

Merci beaucoup

Bonne continuation !

Rechercher des sujets similaires à "timer userform inactif fermeture classeur"