Dave si chiede se può forzare la chiusura di una cartella di lavoro dopo un certo periodo di tempo, a condizione che non sia attualmente in uso. Nel suo ufficio le persone aprono le cartelle di lavoro che si trovano sul server e poi dimenticano che sono aperte. Quando ciò si verifica, nessun altro può modificarli, quindi vorrebbe forzare la chiusura delle cartelle di lavoro se lasciata incustodita per 60 minuti.

È possibile farlo utilizzando le macro, ma potresti non volerlo fare da una prospettiva aziendale o orientata all’utente. Ad esempio, supponiamo che un utente abbia tre cartelle di lavoro aperte sul suo sistema, in modo che sia possibile effettuare confronti tra di loro. È possibile essere “legati”

con due delle cartelle di lavoro per un bel po ‘, con la terza che è quella che fa scattare un arresto. Se il tuo codice VBA non è scritto correttamente, potrebbe finire per chiudere qualunque cartella di lavoro è attiva al momento attuale, chiaramente un risultato che non vuoi che si verifichi.

Inoltre, cosa fai con le modifiche non salvate alla chiusura? Se li salvi, ti imbatti nel problema che forse l’utente non intendeva salvarli. Se non li salvi, si verifica il problema inverso: forse c’erano molti dati che dovevano essere salvati. Non puoi fare in modo che la procedura di chiusura chieda se le informazioni devono essere salvate; ciò manterrebbe la cartella di lavoro legata con la stessa sicurezza che lo farebbe tenerla aperta (e inutilizzata).

Una possibile soluzione è semplicemente condividere o co-creare (Excel 2019 ed Excel in Office 365) la cartella di lavoro. Se abiliti la condivisione o la creazione condivisa (come discusso in altri ExcelTips), più persone possono avere la stessa cartella di lavoro aperta contemporaneamente. Se una di queste persone lo lascia aperto, nessun altro è disturbato perché può ancora aprirlo e, facoltativamente, apportare modifiche alla cartella di lavoro.

Se decidi di seguire il percorso basato sulle macro, la soluzione è piuttosto semplice. Hai bisogno di una sorta di struttura del timer (facilmente implementabile tramite l’uso del metodo OnTime) e di un modo per verificare se qualcuno sta facendo qualcosa nella cartella di lavoro.

Per iniziare, aggiungi il seguente codice a un modulo macro standard. Nota che ci sono tre routine da aggiungere:

Dim DownTime As Date

Sub SetTimer()

DownTime = Now + TimeValue("01:00:00")

Application.OnTime EarliestTime:=DownTime, _       Procedure: = "ShutDown", Schedule:=True End Sub
Sub StopTimer()

On Error Resume Next     Application.OnTime EarliestTime:=DownTime, _       Procedure:="ShutDown", Schedule:=False  End Sub
Sub ShutDown()

Application.DisplayAlerts = False     With ThisWorkbook         .Saved = True         .Close     End With End Sub

Queste tre routine sono abbastanza semplici. I primi due rispettivamente accendono il timer e lo spengono. Notare che queste routine utilizzano la variabile DownTime, che è dichiarata al di fuori di qualsiasi routine. In questo modo il suo contenuto può essere utilizzato in più routine.

La terza routine, ShutDown, è quella che chiude effettivamente la cartella di lavoro. Viene richiamato solo se il metodo OnTime scade, alla fine di un’ora. Chiude la cartella di lavoro senza salvare le modifiche che potrebbero essere state apportate.

Le routine successive (ce ne sono quattro) devono essere aggiunte all’oggetto ThisWorkbook. Apri l’editor VBA e fai doppio clic sull’oggetto ThisWorkbook in Esplora progetti. Nella finestra del codice che si apre Excel, inserisci queste routine:

Private Sub Workbook_Open()

Call SetTimer End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)

Call StopTimer End Sub
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

Call StopTimer     Call SetTimer End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _   ByVal Target As Excel.Range)

Call StopTimer     Call SetTimer End Sub

Le prime due routine vengono attivate quando la cartella di lavoro viene aperta e quando viene chiusa; avviano il timer e lo spengono. Le altre due routine vengono eseguite automaticamente ogni volta che un foglio di lavoro viene ricalcolato o ogni volta che qualcuno effettua una selezione nella cartella di lavoro. Entrambi sono buoni indicatori che qualcuno sta usando la cartella di lavoro (non è aperta in modo inattivo). Fermano il timer e poi lo riavviano, in modo che il conto alla rovescia di un’ora ricomincia.

C’è uno svantaggio nell’usare una serie di macro come queste: elimini efficacemente la funzionalità Annulla di Excel. Quando viene eseguita una macro, lo stack Annulla viene automaticamente cancellato da Excel. Poiché le macro vengono eseguite con ogni modifica apportata nella cartella di lavoro, le modifiche della persona non possono essere annullate. (Non c’è modo di aggirare questo inconveniente.)

Un altro problema è che le macro possono essere archiviate solo in cartelle di lavoro abilitate per le macro. Pertanto, la soluzione basata su macro non funzionerà con i normali file XLSX, poiché non consentono macro al loro interno. In tal caso, sei limitato a soluzioni non macro, come l’attivazione della condivisione della cartella di lavoro o la creazione condivisa.

_Nota: _

Se desideri sapere come utilizzare le macro descritte in questa pagina (o in qualsiasi altra pagina dei siti ExcelTips), ho preparato una pagina speciale che include informazioni utili.

ExcelTips è la tua fonte di formazione economica su Microsoft Excel.

Questo suggerimento (8192) si applica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 ed Excel in Office 365. Puoi trovare una versione di questo suggerimento per l’interfaccia del menu precedente di Excel qui: