impossible de sélectionner un autre classeur lorsque le classeur activé par les macros est ouvert
Question
J'ai un classeur compatible avec les macros qui utilise du code pour régler une minuterie - il s'agit d'un livre partagé et souvent les gens seront dans le livre et quitteront leur bureau, etc.Il est configuré pour enregistrer et se fermer après 30 minutes d'inactivité.Cette fonction semble fonctionner correctement mais le problème que je rencontre est que lorsque d'autres classeurs sont ouverts, je ne peux pas les sélectionner, ni en cliquant sur la vignette (Windows 7), ni en appuyant sur alt+tab, la seule façon de me déplacer est ctrl. +changement.Si c'était juste moi qui utilisais le classeur, ce ne serait pas un problème - est-ce que quelqu'un sait pourquoi cela se produit ?Code posté ci-dessous :
Private Sub Workbook_Open()
StartTimer
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
StartTimer
End Sub
Const idleTime = 1800 'seconds
Dim Start
Sub StartTimer()
Start = Timer
Do While Timer < Start + idleTime
DoEvents
Loop
Application.DisplayAlerts = False
ActiveWorkbook.Close True
Application.DisplayAlerts = True
End Sub
La solution 2
Thank you again for the reply, I couldn't quite figure you where I was supposed to put what as I am new to this as I had said. I did find a solution, or so it seems:
In the "This Workbook" module I put:
Option Explicit
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
ResetTimer
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ResetTimer
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
ResetTimer
End Sub
and in the "user" module (i right click and add module), I used:
Public CloseDownTime As Variant
Public Sub ResetTimer()
On Error Resume Next
If Not IsEmpty(CloseDownTime) Then Application.OnTime EarliestTime:=CloseDownTime, Procedure:="CloseDownFile", Schedule:=False
CloseDownTime = Now + TimeValue("00:00:30") ' hh:mm:ss
Application.OnTime CloseDownTime, "CloseDownFile"
End Sub
Public Sub CloseDownFile()
On Error Resume Next
Application.StatusBar = "Inactive File Closed: " & ThisWorkbook.Name
ThisWorkbook.Close SaveChanges:=True
End Sub
La moitié de ma bataille réalisait ce que les gens veulent dire par "ceci" ou "ce" module - ce code pourrait être un peu excessif mais il semble fonctionner.J'apprécie que vous preniez le temps de vous aider et de me procurer sur la bonne voie!
Autres conseils
Pour commencer, je ne sais pas vraiment pourquoi vous obtenez ce comportement, mais continuez à lire.je suspect ça a quelque chose à voir avec ton occupé-attendre boucle (celle avec le DoEvents
), mais ce n'est qu'une intuition.Quelqu'un d'autre pourrait avoir une (meilleure) explication.
Quoi qu'il en soit, peut-être en utilisant Application.OnTime
est une meilleure approche.Vous pouvez planifier une opération à une certaine heure ou à un certain intervalle et il existe une option pour annuler et remplacer une opération précédemment planifiée.Vous aurez besoin de cette installation dans le Workbook_SheetChange
gestionnaire d'événements.
En bref, vous pouvez faire ce qui suit :
- Ajoutez une nouvelle routine pour enregistrer et quitter le classeur, appelons-la :
SaveWorkbookAndExit
.Celui-ci sera appelé parOnTime
plus tard. Remplacez le contenu de votre
Workbook_SheetChange
gestionnaire d'événements comme suit :Application.OnTime Now + TimeValue("00:30:00"), _ "SaveWorkbookAndExit", _ Schedule:=False
Cela planifie essentiellement la routine
SaveWorkbookAndExit
être appelé dans 30 minutes.Remarquez leSchedule:=False
-- cela signifie qu'une procédure préalablement définie doit être effacée/annulée, ce qui est très important.- Ajoutez également le même code que ci-dessus à votre
Workbook_Open
gestionnaire d'événements. Contrairement à ci-dessus, notez que vous devez définirSchedule:=True
ici!
Et c'est tout.Lorsque le classeur est ouvert, un nouveau SaveWorkbookAndExit
l’opération est programmée.Ensuite, chaque fois que vous entrez Workbook_SheetChange
, l'opération précédemment programmée sera annulée et une nouvelle sera programmée à sa place.
Je n'ai rien testé de tout cela, mais j'espère que vous comprenez l'idée.S'il vous plaît laissez-moi savoir si vous avez besoin que j'explique quelque chose davantage.