non è possibile selezionare un'altra cartella di lavoro quando la macro attivata la cartella di lavoro aperta
Domanda
Ho una macro attivata cartella di lavoro che utilizza il codice per impostare un timer - questo e ' un comune libro e spesso il libro e lasciare la scrivania etc.Esso è impostato su salva e chiudi dopo 30 minuti di inattività.Tale funzione sembra funzionare bene ma il problema è che io sono in esecuzione in modo che quando ho altre cartelle di lavoro aperte non è possibile selezionare tali, facendo clic sulla piastrella (Windows 7) o alt+tab, l'unico modo per muoversi è ctrl+maiusc.Se fosse solo a me usando la cartella di lavoro che non sarebbe un problema: qualcuno sa perché questo accade?Codice postato qui sotto:
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
Soluzione 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 metà della mia battaglia si rende conto di ciò che la gente intende per "questo" o "quel modulo", questo codice potrebbe essere un po 'eccessivo, ma sembra funzionare.Apprezzo che ti prenda il tempo per aiutare e prendermi sulla strada giusta!
Altri suggerimenti
Per cominciare, io non sono del tutto sicuri di ottenere che il comportamento, ma per favore continuate a leggere.Io il sospetto ha qualcosa a che fare con il vostro busy-wait loop (quello con la DoEvents
), ma è solo un sospetto.Qualcun altro potrebbe avere un a (migliore di) spiegazione.
Comunque, magari utilizzando Application.OnTime
è un approccio migliore.È possibile pianificare un'operazione avvenga in un determinato periodo di tempo o intervallo e c'è un'opzione per annullare e sostituire precedentemente programmato.È necessario che la struttura in Workbook_SheetChange
gestore di eventi.
In breve, è possibile effettuare le seguenti operazioni:
- Aggiungere una nuova routine per salvare e chiudere la cartella di lavoro, chiamiamolo:
SaveWorkbookAndExit
.Questo sarà chiamato daOnTime
più tardi. Sostituire il contenuto del tuo
Workbook_SheetChange
gestore di eventi come segue:Application.OnTime Now + TimeValue("00:30:00"), _ "SaveWorkbookAndExit", _ Schedule:=False
Questo, essenzialmente, pianificazioni di routine
SaveWorkbookAndExit
a essere chiamato in 30 minuti da adesso.Notare ilSchedule:=False
-- significa che precedentemente impostata, la procedura dovrebbe essere cancellato/cancellata, che è molto importante.- Aggiungere anche il medesimo codice di cui sopra al tuo
Workbook_Open
gestore di eventi. A differenza di sopra, però, di notare che è necessario impostareSchedule:=True
qui!
E che è.Quando la cartella di lavoro viene aperta, una nuova SaveWorkbookAndExit
operazione pianificata.Quindi, ogni volta che si va in Workbook_SheetChange
, precedentemente pianificata operazione verrà annullata e sarà in programma al suo posto.
Non ho testato nulla di tutto questo, ma spero di aver reso l'idea.Per favore fatemi sapere se avete bisogno di me per spiegare qualcosa di più.