Forzare la chiusura di una cartella di lavoro dopo un periodo di inattività

Davide si chiede se sia possibile 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ò accade, nessun altro può modificarle, quindi vorrebbe forzare la chiusura delle cartelle di lavoro se lasciate incustodite per 60 minuti.

È possibile farlo utilizzando le macro, ma potresti non volerlo fare dal punto di vista aziendale o orientato all’utente. Ad esempio, supponiamo che un utente abbia tre cartelle di lavoro aperte sul suo sistema, in modo che sia possibile confrontarle tra loro. È possibile rimanere “vincolati” con due cartelle di lavoro per un bel po’, mentre la terza è quella che attiva l’arresto. Se il codice VBA non è scritto correttamente, potrebbe finire per chiudere qualunque cartella di lavoro sia attiva al momento, chiaramente un risultato che non desideri che si verifichi.

Inoltre, cosa fai con le modifiche non salvate alla chiusura? Se le salvi, ti imbatti nel problema che forse l’utente non intendeva salvarle. Se non le salvi, si verifica il problema opposto: forse c’erano molti dati da salvare. Non è possibile fare in modo che la procedura di chiusura chieda se le informazioni devono essere salvate; ciò manterrebbe la cartella di lavoro in sospeso con la stessa certezza con cui lo farebbe tenerla aperta (e inutilizzata).

Una possibile soluzione è semplicemente condividere o creare in modalità condivisa (Excel 2019 ed Excel in Office 365) la cartella di lavoro. Se si abilita la condivisione o la creazione condivisa, più persone possono avere la stessa cartella di lavoro aperta contemporaneamente. Se una di queste persone la lascia aperta, nessun altro sarà disturbato perché potrà ancora aprirla e, facoltativamente, apportare modifiche alla cartella di lavoro.

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

Per iniziare, aggiungi il seguente codice a un modulo macro standard. Tieni presente 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. Le prime due rispettivamente accendono il timer e lo spengono. Tieni presente che queste routine utilizzano la variabile DownTime, che viene dichiarata all’esterno di qualsiasi routine. In questo modo i suoi contenuti possono essere utilizzati in più routine.

La terza routine, ShutDown, è quella che chiude effettivamente la cartella di lavoro. Viene richiamata solo se il metodo OnTime scade, allo scadere di un’ora. Chiude la cartella di lavoro senza salvare le modifiche eventualmente apportate.

Le routine successive (ce ne sono quattro) devono essere aggiunte all’oggetto Questa_cartella_di_lavoro. Apri l’editor VBA e fai doppio clic sull’oggetto Questa_cartella_di_lavoro in Gestione progetti. Nella finestra Codice aperta da 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 all’apertura e alla chiusura della cartella di lavoro; 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 del fatto che qualcuno stia utilizzando la cartella di lavoro (non è aperta in modo inattivo). Arrestano il timer e poi lo riavviano, in modo che il conto alla rovescia di un’ora ricominci.

C’è uno svantaggio nell’utilizzare una serie di macro come queste: si elimina di fatto la funzionalità Annulla di Excel. Quando viene eseguita una macro, lo Stack di Annullamento viene automaticamente cancellato da Excel. Poiché le macro vengono eseguite con ogni modifica apportata alla cartella di lavoro, le modifiche apportate dalla 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 delle cartelle di lavoro o della creazione condivisa.

 

 

Tags: , , , , , , , , , , , , , , , , , , , ,

Ti è stato utile?