Condividi:        

Chiusura a tempo dei file.xls non attivi

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Chiusura a tempo dei file.xls non attivi

Postdi Flash30005 » 21/10/10 12:24

Con i file condivisi in rete, può capitare che qualche utente, dopo averne aperto uno o più di uno li tiene aperti costringe altri utenti alla sola lettura degli stessi file.
Con piccole parti di codice presi in questo stesso Forum ho realizzato una "utility" che risolve questo problema
Inserire In ThisWorkbook del file, che si vuole far chiudere (quando non è attivo), questo codice
Codice: Seleziona tutto
Private Sub Workbook_Activate()
Flag1 = True
End Sub

Private Sub Workbook_Deactivate()
Flag1 = False
DeltaT = "00:15:00"
Application.OnTime Now + TimeValue(DeltaT), "Chiudi"
End Sub


e in un modulo questo codice
Codice: Seleziona tutto
Public Flag1
Sub Chiudi()
If Flag1 = False Then ThisWorkbook.Close SaveChanges:=True 'oppure False
End Sub


In pratica cambiando cartella di lavoro di excel tutti i file "trattati" si chiuderanno dopo 15 minuti (valore modificabile in DeltaT) dalla loro "disattivazione" cioè quando la cartella non è attiva.

Sto notando ora, però, che attivando il browser il file rimane aperto in quanto è attiva la cartella in background
Magari si può pensare di ottenere la chiusura del file di excel anche cambiando "attività" con il Pc ... ( :?: )

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Sponsor
 

Re: Chiusura a tempo dei file.xls non attivi

Postdi ricky53 » 21/10/10 12:41

Ciao,
veramente una bella idea (e la applicherò subito prorpio perchè gestisco diversi file condivisi).

Se la macro
Codice: Seleziona tutto
Private Sub Workbook_Deactivate()
Flag1 = False
DeltaT = "00:15:00"
Application.OnTime Now + TimeValue(DeltaT), "Chiudi"
End Sub


viene messa in
Private Sub Workbook_WindowDeactivate(ByVal Wn As Window)
...
End Sub
[/code]

Potrebbe gestire l'utilizzo di un altro file e liberare quello non movimentato.

Ciao da Ricky53
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Chiusura a tempo dei file.xls non attivi

Postdi Flash30005 » 21/10/10 13:22

Non noto differenza tra Workbook_Deactivate
e Workbook_WindowDeactivate

Pensavo che agisse sulle variazione delle finestre di windows ma non è così.
In quelle funzioni c'è di tutto ma quella del passaggio da una finestra windows (excel) ad un'altra finestra di windows (qualsiasi) non c'è :cry:

Chissà con qualche trucchetto... (?)

Per quanto riguarda i file attivi penso sia buono lo spunto di Anthony
Anthony47 ha scritto:...
Codice: Seleziona tutto
For Each wb In Workbooks
    If wb.Name = "NomeFile1.xls" Then Flag1 = True
    If vb.Name = "NomeFile2.xls" Then Flag2 = True
Next wb
...


Che ne pensi? ;)

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Chiusura a tempo dei file.xls non attivi

Postdi ricky53 » 21/10/10 13:57

Ciao,
io ho provato con
Workbook_WindowDeactivate
come avevo suggerito nel mio precedente intervento in questo modo:
1. ho aperto due file XLS
2. sono passato dall'uno all'altro

dopo "X" tempo mi si è chiuso il file non movimentato.

Prova ma se vuoi ti invio un file di esmpio.

Ciao da Ricky53
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Chiusura a tempo dei file.xls non attivi

Postdi Flash30005 » 21/10/10 14:04

ricky53 ha scritto:Ciao,
io ho provato con
Workbook_WindowDeactivate
come avevo suggerito nel mio precedente intervento in questo modo:
1. ho aperto due file XLS
2. sono passato dall'uno all'altro

dopo "X" tempo mi si è chiuso il file non movimentato.

Prova ma se vuoi ti invio un file di esmpio.

Ciao da Ricky53


La stessa cosa la ottieni con Workbook_Deactivate :D

Diverso sarebbe stato se WindowsDeacivate si fosse riferito alle finestre di windows e non ai soli file di excel

ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Chiusura a tempo dei file.xls non attivi

Postdi ricky53 » 21/10/10 14:27

Vero,
avevo dedotto che avsse un comportamento diverso: senza provarlo.

Mai scrivere senza provare !!!

Ciao da Ricky53
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Chiusura a tempo dei file.xls non attivi

Postdi gaetano73 » 05/04/11 09:40

Ciao.

Vorrei utilizzare la utility postata da Flash30005; come si accede a "ThisWorkbook"?

Grazie


Gaetano
gaetano73
Utente Senior
 
Post: 250
Iscritto il: 03/09/02 18:36

Re: Chiusura a tempo dei file.xls non attivi

Postdi Avatar3 » 05/04/11 13:50

Non so cosa sia l'utility da te descritta ma se vuoi solo sapere come si accede a ThisWorkbook è sufficiente che tu acceda al VBa
nelle due finestra...
a sinistra hai gli oggetti (fogli, form, moduli etc) a destra il codice specifico (per fogli, form o moduli)
noterai che oltre all'elenco dei fogli (in fondo) esiste la voce (oggetto) ThisWorkBook.
Tutto ciò che scriverai lì dentro si attiverà a seconda della funzione selezionata ad esempio Workbook_Open()
Workbook_Activate() e riguarderà l'intera cartella e non il singolo foglio

ciao
Per il funzionamento delle macro si deve impostare la protezione a Bassa o Media.
Menu Strumenti -> Macro -> Protezione...
Avatar utente
Avatar3
Utente Senior
 
Post: 569
Iscritto il: 04/04/11 09:04

Re: Chiusura a tempo dei file.xls non attivi

Postdi gaetano73 » 06/04/11 16:36

OK. Ho inserito in ThisWorkbook del file, che si vuole far chiudere (quando non è attivo), il codice
Codice: Seleziona tutto
Private Sub Workbook_Activate()
Flag1 = True
End Sub

Private Sub Workbook_Deactivate()
Flag1 = False
DeltaT = "00:01:00"
Application.OnTime Now + TimeValue(DeltaT), "Chiudi"
End Sub


ed in un modulo questo codice:
Codice: Seleziona tutto
Public Flag1
Sub Chiudi()
If Flag1 = False Then ThisWorkbook.Close SaveChanges:=True 'oppure False
End Sub


Funziona (ovvero, si chiude dopo 1 minuto) ma solo se lavoro su un altro file Excel.
Se mi sposto su Internet Explorer, il file che voglio far chiudere resta aperto...
Quale accorgimento devo adottare per far funzionare il progetto quando si abbandona il file Excel e, ad esempio si naviga in Internet con un browser?
Grazie

Gaetano
gaetano73
Utente Senior
 
Post: 250
Iscritto il: 03/09/02 18:36

Re: Chiusura a tempo dei file.xls non attivi

Postdi Avatar3 » 06/04/11 20:35

Se leggi bene la discussione mi sembra che Flash abbia fatto presente questo problema.
Non credo ci sia soluzione perché la macro lavora solo se stai in excel
non se navighi magari lasciando il foglio o file di excel attivo in background

ciao
Per il funzionamento delle macro si deve impostare la protezione a Bassa o Media.
Menu Strumenti -> Macro -> Protezione...
Avatar utente
Avatar3
Utente Senior
 
Post: 569
Iscritto il: 04/04/11 09:04

Re: Chiusura a tempo dei file.xls non attivi

Postdi Anthony47 » 06/04/11 22:36

Si potrebbe usare la Proprietà Hwnd, insieme con la funzione di sistema GetActiveWindow, per testare se excel e' il programma attivo o meno, e con qualche ragionamento capire se il file e' da chiudere o meno. Ad esempio

Codice: Seleziona tutto
Public InFoc
Public Flag1
Private Declare Function GetActiveWindow Lib "user32" () As Long

Sub InFocusYN()
    If GetActiveWindow <> Application.Hwnd Then
        If InFoc = True Then InFoc = Now()
    Else
        InFoc = True
    End If
'If Flag1 = False Then ThisWorkbook.Close SaveChanges:=True 'oppure False
If InFoc <> True Then
    If InFoc + TimeValue("00:15:00") < Now Then
    ThisWorkbook.Close SaveChanges:=True 'oppure False
    End If
End If
If Flag1 <> True Then     '**Vedi descrizione
    If Flag1 + TimeValue("00:15:00") < Now Then
'    ThisWorkbook.Close SaveChanges:=True 'oppure False
    End If
End If
DeltaT = "00:01:00"
Application.OnTime Now + TimeValue(DeltaT), "InFocusYN"
End Sub

Va messa in un modulo vuoto, in modo che le dichiarazioni siano in testa a tutto.

Questa va lanciata inizialmente alla Open del workbook, poi si esegue ogni minuto.
Se excel e' la finestra attiva, allora InFoc viene messo True, altrimenti viene compilato con l' orario in cui per la prima volta excel non e' la finestra attiva.
Dopo 15 minuti che excel non e' piu' la finestra attiva il file viene chiuso.

A questo punto suggerirei di usare anche Falg1 come "Vero" (workbook attivo) o come "timestamp" di quando il workbook e' andato inattivo. Il codice per controllare Flag1 e' gia' inserito nella macro InFocYN, per abilitarlo va pero' scommentata l' istruzione ThisWorkbook.Close
Tutto questo richiede macro in ThisWorkbook come le seguenti:
Codice: Seleziona tutto
Private Sub Workbook_Activate()    ' Gestione Flag1, INVARIATA
Flag1 = True
End Sub

Private Sub Workbook_Deactivate()   'Gestione Flag1, VARIATA
Flag1 = Now()
End Sub

Private Sub Workbook_Open()   'AGGIUNTA per lanciare InFocYN la prima volta
Flag1=True
Call InFocusYN
End Sub


Ciao

Workbook_Open editata il 7-apr-2011 @ 14:30

Vedi anche viewtopic.php?f=26&t=107686&p=631483#p631466 che dovrebbe correggere un errore nel caso che il file sia stato normalmente chiuso
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Chiusura a tempo dei file.xls non attivi

Postdi Flash30005 » 06/04/11 22:53

Perfetto Anthony!

Hai risolto un problema che a ottobre 2010 era stato motivo di discussione e ci eravamo arenati

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Chiusura a tempo dei file.xls non attivi

Postdi Anthony47 » 06/04/11 22:59

Declino ogni responsabilita' per le inc******re degli utenti che si troveranno col file chiuso solo perche' gli scappava qualcosa...
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Chiusura a tempo dei file.xls non attivi

Postdi Flash30005 » 06/04/11 23:15

Comunque ho messo in "cascina" la macro ;)

Ciao
Flash
Win10 + Office 2010 Ita
"Fotografica" al servizio dell'immagine
Avatar utente
Flash30005
Moderatore
 
Post: 8517
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Chiusura a tempo dei file.xls non attivi

Postdi ricky53 » 07/04/11 00:05

Ciao,
tempo fa avevo realizzato un "prodotto" per chiudere un file XLS se non veniva aggiornato dopo "nn" secondi o veniva "Deattivato" il file in utilizzo.
Vi riporto il codice che ho utilizzato ed allego un esempio.

Da inserire in un "MODULO"
Codice: Seleziona tutto
Public Dato As String, Nome_File As String
Public Orario_Precedente As Date, Orario_Attuale As Date, Orario_Nuovo As Date, _
    DeltaA As Date, DeltaT As Date

Sub TempoX()
    DeltaA = "00:00:20"
    Orario_Attuale = Time
    Leggi_Tempo
    Ora = Left(Right(Dato, 8), 2)
    Min = Left(Right(Dato, 5), 2)
    Sec = Right(Dato, 2)
    Orario_Precedente = Ora & ":" & Min & ":" & Sec
    Orario_Nuovo = Orario_Precedente + DeltaA
    If Orario_Attuale > Orario_Nuovo Then
        Chiudi
        Exit Sub
    End If
    Application.OnTime Now + TimeValue(DeltaA), "TempoX"
End Sub

Sub Chiudi()
    MsgBox "'Chiusura Automatica' del file per tempo msssimo raggiunto senza aggiornamenti" & _
        Chr(13) & Chr(13) & "Il file verrà comunque salvato !!!"""
    ThisWorkbook.Close SaveChanges:=True ' <<------------ RIATTIVARE a fine prove !!!!
End Sub

Sub Scrivi_Tempo()
    Nome_File = "D:\Tempo.txt"
    Dato = Date & "-" & Format(Time, "hh:mm:ss")
    Open Nome_File For Output As #1
    Write #1, Dato
    Close 1
    MsgBox "Inizio temporizzazione per chiusura automatica dopo: " & DeltaT
End Sub

Sub Leggi_Tempo()
    Nome_File = "D:\Tempo.txt"
    Open Nome_File For Input As #1
    Input #1, Dato
    Close 1
End Sub[code]

Da inserire in un "ThisWorkbook"
[code]Private Sub Workbook_Activate()
    DeltaT = "00:00:10"
    Scrivi_Tempo
    TempoX
End Sub

Private Sub Workbook_Deactivate()
    DeltaT = "00:00:15"
    Application.OnTime Now + TimeValue(DeltaT), "Chiudi"
End Sub

Private Sub Workbook_Open()
    DeltaT = "00:01:00"
    Scrivi_Tempo
End Sub
[code]

Da inserire nel vai fogli
[/code]Private Sub Worksheet_Activate()
    Scrivi_Tempo
End Sub


Gli intervalli del tempo di attesa sono volutamente "piccoli" per consentire le prove: vanno adattati in base alle esigenze.
L'esempio è QUESTO
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Chiusura a tempo dei file.xls non attivi

Postdi ricky53 » 07/04/11 00:53

Ciao Anthony,
interessante la tua ultima implementazione !!!
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Chiusura a tempo dei file.xls non attivi

Postdi gaetano73 » 07/04/11 13:11

@Anthony47: grazie! Mi hai risolto un (altro) grande problema!
@ricky53: grazie anche a te... il tuo file da un errore di runTime (errore 71 - disco non pronto) ma penso che non dipenda dalla tua implementazione; io "eseguo" il file su un Thin Client... che non ha (fisicamente) il disco.

Grazie ancora.


Gaetano
gaetano73
Utente Senior
 
Post: 250
Iscritto il: 03/09/02 18:36

Re: Chiusura a tempo dei file.xls non attivi

Postdi Anthony47 » 07/04/11 13:25

Anthony ha scritto:Declino ogni responsabilita' per le inc******re degli utenti che si troveranno col file chiuso solo perche' gli scappava qualcosa...

Pero' almeno le macro le devo suggerire corrette…
E' opportuno che Flag1 sia messo True alla Open, altrimenti alla prima esecuzione di InFocusYN (cioe' subito all' apertura) risultera' probabilissimamente un timeout di Deactivate e il file si chiudera' (se e' abilitata la gestione di Flag1); modificare quindi la macro di Workbook_Open come segue:
Codice: Seleziona tutto
Private Sub Workbook_Open()   'AGGIUNTA per lanciare InFocYN la prima volta
Flag1=True
Call InFocusYN
End Sub

(ho corretto anche nel post di ieri sera)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Chiusura a tempo dei file.xls non attivi

Postdi ricky53 » 07/04/11 13:36

Ciao,
l'anomalia che hai riportato
@ricky53: grazie anche a te... il tuo file da un errore di runTime (errore 71 - disco non pronto)

è causata dalla "non disponibilità" dell'untià "D" sulla quale la macro va a scrivere/leggere ----> cambia l'istruzione
Codice: Seleziona tutto
 Nome_File = "D:\Tempo.txt"

sostituendo "D" con la lettera dell'unità presente sul tuo PC.


Guarda anche la correzione alla macro di Anthony, sopra
Dice il vecchio saggio provare e riprovare è l'unica strada per imparare

Più chiara è la vostra spiegazione
Più immediata sarà la nostra soluzione


. . . . . . . . . .
S.O. W10; Office 2003-10-13-16-19
Avatar utente
ricky53
Utente Senior
 
Post: 4565
Iscritto il: 11/04/09 19:29
Località: Italia

Re: Chiusura a tempo dei file.xls non attivi

Postdi gaetano73 » 07/04/11 16:08

@Anthony47: corretto, grazie.
PS: le inc*****ure sono le mie e quelle di altri (pochi) colleghi che, come me, usano il file che si deve autochiudere per pochi minuti; (molti) altri, invece, se lo dimenticano aperto per delle ore!
@ricky53: si, avevo sostituito la tua "D" con la mia "C" prima dell'errore ma mi si è presentato lo stesso quindi, l'ho associato al fatto che utilizzassi un client senza hard disk fisico.

Gaetano
gaetano73
Utente Senior
 
Post: 250
Iscritto il: 03/09/02 18:36

Prossimo

Torna a Applicazioni Office Windows


Topic correlati a "Chiusura a tempo dei file.xls non attivi":


Chi c’è in linea

Visitano il forum: Nessuno e 38 ospiti

cron