non è possibile selezionare un'altra cartella di lavoro quando la macro attivata la cartella di lavoro aperta

StackOverflow https://stackoverflow.com//questions/25071193

  •  26-12-2019
  •  | 
  •  

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
È stato utile?

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:

  1. Aggiungere una nuova routine per salvare e chiudere la cartella di lavoro, chiamiamolo: SaveWorkbookAndExit.Questo sarà chiamato da OnTime più tardi.
  2. 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 il Schedule:=False -- significa che precedentemente impostata, la procedura dovrebbe essere cancellato/cancellata, che è molto importante.

  3. Aggiungere anche il medesimo codice di cui sopra al tuo Workbook_Open gestore di eventi. A differenza di sopra, però, di notare che è necessario impostare Schedule:=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ù.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top