fermeture auto au bout d'un certain temps

TEMAGOULTFARID

XLDnaute Occasionnel
Bonjour,
j'ai trouvé ce fichier qui fonctionne très bien de boisgontierjacques si je ne me trompe pas .
la remise du compteur se fait en cliquant dans n'importe quelle cellule et cela fonctionne très bien.
Cependant, serait il possible que la remise du compteur au début du compte-a-rebours puisse se faire via un bouton et non sur un "cliquage" d'une cellule.
par avance , merci
prenez soins de vous
bien cordialement
 

Pièces jointes

  • OnTimeFermeInactif (2).xls
    41.5 KB · Affichages: 27

jmfmarques

XLDnaute Accro
Bonjour à tous
Je n'ai ouvert (je ne le fais jamais) aucun des classeurs joints à la présente discussion, mais ceci :
Cependant, serait il possible que la remise du compteur au début du compte-a-rebours puisse se faire via un bouton et non sur un "cliquage" d'une cellule.
qui vient en complément de la vocation recherchée, à savoir :
fermeture auto au bout d'un certain temps
me fait réagir.
Ce n'est pas la seule inactivité de l'utilisateur (par constat de clic sur ceci ou cela) qui permet de conclure à l'inactivité de l'application, que l'on risque alors dans certains cas de fermer à un moment plutôt inopportun (alors, par exemple et entre autres, que les instructions en cours d'une boucle ont des répercussions sur les données du classeur).

Observons d'ailleurs qu'aucun évènement n'est non plus déclenché dans un cas bien plus simple et courant (alors que l'utilisateur est déjà "dans" une cellule et qu'il y est en modification)

La prudence doit conduire à ne fermer une application en cours que si elle ne reçoit plus de messages/système (utilisation, entre autres, des fonctions GetLastInputInfo et GetQueueStatus de la librairie User32.dll de l'API de Windows).

Je tenais à appeler votre attention sur ces quelques points qui devraient conduire à repenser ce qui a été imaginé.

Amitiés
 

TEMAGOULTFARID

XLDnaute Occasionnel
Bonjour à tous
Je n'ai ouvert (je ne le fais jamais) aucun des classeurs joints à la présente discussion, mais ceci :

qui vient en complément de la vocation recherchée, à savoir :

me fait réagir.
Ce n'est pas la seule inactivité de l'utilisateur (par constat de clic sur ceci ou cela) qui permet de conclure à l'inactivité de l'application, que l'on risque alors dans certains cas de fermer à un moment plutôt inopportun (alors, par exemple et entre autres, que les instructions en cours d'une boucle ont des répercussions sur les données du classeur).

Observons d'ailleurs qu'aucun évènement n'est non plus déclenché dans un cas bien plus simple et courant (alors que l'utilisateur est déjà "dans" une cellule et qu'il y est en modification)

La prudence doit conduire à ne fermer une application en cours que si elle ne reçoit plus de messages/système (utilisation, entre autres, des fonctions GetLastInputInfo et GetQueueStatus de la librairie User32.dll de l'API de Windows).

Je tenais à appeler votre attention sur ces quelques points qui devraient conduire à repenser ce qui a été imaginé.

Amitiés
Bonjour et merci pour ces précisions.
effectivement , je suis entièrement d'accord avec vous concernant le flou de ma demande surtout sur un fichier conçu pour une utilisation dynamique sinon on ferme si inactivité et c'est logique, cependant et ce que je n'ai pas mentionner dans ma demande ,j'ai mis en place une sorte de GMAO avec l'aide évidement de personnes sur ce site et ailleurs, j'ai un classeur dit "Tableau principal" qui a l'ouverture me créé un fichier et enregistre automatiquement dans un dossier dont un numéro est généré sur le tableau principal en colonne A.
Apres intervention, l'agent ouvre le fichier "Tableau principal" et clic sur le numéro généré 'A2' et un fichier s'ouvre et informe son intervention et en ensuite ferme ce fichier et certaines cellules de la ligne de ce fichier qu'on nommera A5:A10 sont copiées automatiquement sur la ligne du "Tableau principal".Donc dans cette exemple , les deux fichiers sont indissociables.Donc si le premier fichier est temporisé a 15 mn mais que l'agent passe plus de temps sur le deuxième fichier il y a risque que le premier se ferme après un temps d'inactivité et lors de la fermeture du deuxième fichier je me retrouve avec un débogage car le copier /coller transposé ne pourra se faire.
c'est pour cela que je souhaite que si l'agent avait besoin de plus de temps pour compléter sont fichier , il devra remettre le compte a rebours du deuxième fichier via un bouton et par un appel de ce bouton j'appel la macro que François ma donné.
voila le pourquoi de ma demande sinon et effectivement si je travaillais sur un seul fichier , cette demande n'avais pas lieu.
merci de vous êtes penché sur ce sujet et espérant l'explication ci-dessus vous a éclaircie
 

patricktoulon

XLDnaute Barbatruc
sinon
il vous faut agir avec une variable globale module public
taper avec
le change si une donnée est changer manu ou par vba
le calculate si les donnée sont recalculé avec un tempo ( qui ne déclenche pas d'events)
le activate (dans le thisworkbook) si vous changez de sheets
la variable devra être piloté aussi éventuellement dans le initialise de votre vos userforms
 

patricktoulon

XLDnaute Barbatruc
Bonjour et merci pour ces précisions.
effectivement , je suis entièrement d'accord avec vous concernant le flou de ma demande surtout sur un fichier conçu pour une utilisation dynamique sinon on ferme si inactivité et c'est logique, cependant et ce que je n'ai pas mentionner dans ma demande ,j'ai mis en place une sorte de GMAO avec l'aide évidement de personnes sur ce site et ailleurs, j'ai un classeur dit "Tableau principal" qui a l'ouverture me créé un fichier et enregistre automatiquement dans un dossier dont un numéro est généré sur le tableau principal en colonne A.
Apres intervention, l'agent ouvre le fichier "Tableau principal" et clic sur le numéro généré 'A2' et un fichier s'ouvre et informe son intervention et en ensuite ferme ce fichier et certaines cellules de la ligne de ce fichier qu'on nommera A5:A10 sont copiées automatiquement sur la ligne du "Tableau principal".Donc dans cette exemple , les deux fichiers sont indissociables.Donc si le premier fichier est temporisé a 15 mn mais que l'agent passe plus de temps sur le deuxième fichier il y a risque que le premier se ferme après un temps d'inactivité et lors de la fermeture du deuxième fichier je me retrouve avec un débogage car le copier /coller transposé ne pourra se faire.
c'est pour cela que je souhaite que si l'agent avait besoin de plus de temps pour compléter sont fichier , il devra remettre le compte a rebours du deuxième fichier via un bouton et par un appel de ce bouton j'appel la macro que François ma donné.
voila le pourquoi de ma demande sinon et effectivement si je travaillais sur un seul fichier , cette demande n'avais pas lieu.
merci de vous êtes penché sur ce sujet et espérant l'explication ci-dessus vous a éclaircie
ca renforce justement ce que vient de dire jmfmarques
c'est pas jouable a 100%

c'est beaucoup plus simple alors si c'est pour garder ouvert un éventuel fichier de destination des données
a chaque changement dans le fichier utilisateur tu change une cellule dans le classeur de destination et dans l'events calculate tu remet le compteur a zero
 

jmfmarques

XLDnaute Accro
Bonjour patricktoulon
le change si une donnée est changer manu ou par vba
le calculate si les donnée sont recalculé avec un tempo ( qui ne déclenche pas d'events)
le activate (dans le thisworkbook) si vous changez de sheets
la variable devra être piloté aussi éventuellement dans le initialise de votre vos userforms
Es-tu vraiment certain d'avoir tout prévu de ce qui révèlerait une activité du classeur ? :cool:
 

patricktoulon

XLDnaute Barbatruc
Bonjour patricktoulon

Es-tu vraiment certain d'avoir tout prévu de ce qui révèlerait une activité du classeur ? :cool:
non jacques c'est juste le principe
et malheureusement ton astuce ne fonctionne pas non plus (et je m'en doutais)
car en effet même si tu ne fait absolument rien il y a des modif dans les commandbars en interne qui se font toute seule en silence il y a donc toujours activité
 

jmfmarques

XLDnaute Accro
Bon ...
Les explications données plus haut par TEMAGOULTFARID en son message N° 7 tendent à indiquer que la préoccupation réelle n'est pas tant celle de fermer le classeur au bout d'une certaine durée d'inactivité de l'utilisateur, mais celle de permettre à l'utilisateur de bénéficier d'une espèce de "sursis" dont il faudrait assortir l'exécution de fermeture.
On parle dès lors non de "compte à rebours", mais de détermination d'une nouvelle heure donnée à l' "ultimatum", nouvelle heure applicable sans rémission possible si l'utilisateur, informé par message de l'expiration prochaine du délai, n'intervient pas (preuve de sa vigilance, au passage) dans les ..... x secondes qui suivent sa mise en garde.
A quoi aurait-on dans ce cas à faire ? --->>
1) une procédure déclenchant un userform en cas d'inactivité repérée depuis plus de x minutes, userform invitant l'utilisateur à demander un sursis au besoin. sans réactio,n de sa part au bout de y minutes y--->> fermeture de la totalité de l'appli
2) si réaction de sa part dans le délai de réaction imparti --->> détermination de la nouvelle heure "heuresursis" de fermeture prévue (nb minutes plus tard)
3) si heujresursis atteinte à nouveau --->> retour au point 1)
etc ...
Il ne s'agit pas là d'une aptitude particulière à développer, mais de l'application raisonnée et maitrisée de choses plutôt simples.
 

jmfmarques

XLDnaute Accro
Je suis étonné de ne voir aucune réaction de ta part , TEMAGOULTFARID
Serait-ce l'acrobatie à faire qui te fait peur ? (car il s'agit là beaucoup plus d'esprit acrobatique que de quoi que ce soit d'autre).

Je ne vais certes pas (ce n'est jamais ma manière personnelle d'aider à l'éveil d'un développeur débutant), te servir ton plat tout cuit et prêt à être mangé.
je vais par contre te montrer un petit exemple (que je viens de bâcler mais qui est très "parlant") de mécanisme acrobatique. Cet exemple devrait t'inspirer et t'éveiller. ;)

une feuille de calcul dotée d'un bouton de commande avec ce code :
VB:
Private Sub CommandButton1_Click()
  SURSIS = TimeSerial(0, 0, 8) '--->> le premier ultimatum dans 8 secondes
  Application.OnTime Now + SURSIS, "ULTIMATUM"
End Sub

Un userform Userform1 avec un bouton de commande commandbutton1 et ce code :

Code:
Private Sub UserForm_Activate()
  Application.OnTime Now + TimeSerial(0, 0, 4), "jattends" 'ici : exemple de 4 secondes pour cliquer
End Sub

Private Sub CommandButton1_Click()
  SURSIS = 8 ' 8 secondes de répit additionnel
  Unload Me
End Sub

et ceci dans un module standard
Code:
Public SURSIS As Date
Public Sub ultimatum()
  SURSIS = 0
  UserForm1.Show 0
End Sub
Public Sub jattends()
  UserForm1.Hide
  If SURSIS = 0 Then
    MsgBox "out" ' remplace ce msgbox par une instruction de fermeture du classeur
  Else
    Application.OnTime Now + TimeSerial(0, 0, SURSIS), "ULTIMATUM"
  End If
End Sub

Je te laisse découvrir ce que cela fait selon que tu cliques ou non sur le bouton du userform.

(sois suffisamment patient entre chaque étape, bien que j'aie choisi des intervalles courts pour les essais).;)
 

TEMAGOULTFARID

XLDnaute Occasionnel
Je suis étonné de ne voir aucune réaction de ta part , TEMAGOULTFARID
Serait-ce l'acrobatie à faire qui te fait peur ? (car il s'agit là beaucoup plus d'esprit acrobatique que de quoi que ce soit d'autre).

Je ne vais certes pas (ce n'est jamais ma manière personnelle d'aider à l'éveil d'un développeur débutant), te servir ton plat tout cuit et prêt à être mangé.
je vais par contre te montrer un petit exemple (que je viens de bâcler mais qui est très "parlant") de mécanisme acrobatique. Cet exemple devrait t'inspirer et t'éveiller. ;)

une feuille de calcul dotée d'un bouton de commande avec ce code :
VB:
Private Sub CommandButton1_Click()
  SURSIS = TimeSerial(0, 0, 8) '--->> le premier ultimatum dans 8 secondes
  Application.OnTime Now + SURSIS, "ULTIMATUM"
End Sub

Un userform Userform1 avec un bouton de commande commandbutton1 et ce code :

Code:
Private Sub UserForm_Activate()
  Application.OnTime Now + TimeSerial(0, 0, 4), "jattends" 'ici : exemple de 4 secondes pour cliquer
End Sub

Private Sub CommandButton1_Click()
  SURSIS = 8 ' 8 secondes de répit additionnel
  Unload Me
End Sub

et ceci dans un module standard
Code:
Public SURSIS As Date
Public Sub ultimatum()
  SURSIS = 0
  UserForm1.Show 0
End Sub
Public Sub jattends()
  UserForm1.Hide
  If SURSIS = 0 Then
    MsgBox "out" ' remplace ce msgbox par une instruction de fermeture du classeur
  Else
    Application.OnTime Now + TimeSerial(0, 0, SURSIS), "ULTIMATUM"
  End If
End Sub

Je te laisse découvrir ce que cela fait selon que tu cliques ou non sur le bouton du userform.

(sois suffisamment patient entre chaque étape, bien que j'aie choisi des intervalles courts pour les essais).;)
Bonjour et merci pour ton intervention ainsi qu'aux personnes dans ce post.Effectivement je ne suis pas u pro du VBA et loin de là. Mais je laisse tomber ce choix je pense que cela ne sera pas productive dans mon service.Prenez bien soins de vous et de vos proche
 

Discussions similaires

Réponses
1
Affichages
323

Statistiques des forums

Discussions
312 211
Messages
2 086 299
Membres
103 173
dernier inscrit
Cerba95