-
AutoreArticoli
-
Ciao scossa.
Questo che chiedi
ma se apro il foglio, apporto una qualsiasi modifica, lo SALVO (da menu/icona) e poi lo chiudo (quindi nessun avviso) come va considerato?
è da considerare.
Con la soluzione di Alex non è inserita.
Forse cliccando salva dal menù icona è da inserire una riga in più in accessi tipo "FATTO MODIFICA" e poi anche se clicco no "CHIUSURA CON SALVATAGGIO"
Ciao scossa.
Questo che chiedi
ma se apro il foglio, apporto una qualsiasi modifica, lo SALVO (da menu/icona) e poi lo chiudo (quindi nessun avviso) come va considerato?
è da considerare.
Con la soluzione di Alex non è inserita.
Forse cliccando salva dal menù icona è da inserire una riga in più in accessi tipo "FATTO MODIFICA" e poi anche se clicco no "CHIUSURA CON SALVATAGGIO"
Non è possibile salvarlo dal menu a tendina e chiudere senza nessun avviso , quando chiudi , da qualunque parte chiudi si apre la finestra di dialogo salva non salvare o annulla , sei obbligato a segliere una selezione
ma se apro il foglio, apporto una qualsiasi modifica, lo SALVO (da menu/icona) e poi lo chiudo (quindi nessun avviso) come va considerato?
è da considerare.
La domanda era da intendersi:
ma se apro il foglio, apporto una qualsiasi modifica, lo SALVO (da menu/icona) e poi lo chiudo (quindi nessun avviso) come va considerato? "CHIUSURA" o "CHIUSURA CON MODIFICA" ?
O l'una o l'altra (chiusura o chiusura con modifica), personalmente non prendo in considerazione altre opzioni.
Domanda....ma se utilizzo una variabile public boolena (nel mio esempio la chiamo bEdit) per controllare lo stato delle modifiche e del salvataggio del Workboook può risultare stressante per il Workbook stesso? Nel senso...ad ogni modifica si scatena l'aggiornamento di questa variabile: in apertura è False, se eseguo modifiche passa a True, se salvo ritorna a False.
Il suo stato attuale andrà a decidere se scatenare la MsgBox per la richiesta di salvataggio delle modifiche (SI, NO, ANNULLA), oppure salvare direttamente e registrare come CHIUSURA (perché se bEdit è a False vuol dire che o non è stata effettuata nessuna modifica oppure è stato già salvato tramite menu a tendine/icona).
Allego file con implementazione degli eventi: Open, Workbook_AfterSave, Workbook_SheetChange
@scossa, @oscar....date un vostro parere al riguardo
Allegati:
You must be logged in to view attached files.Hmmm, non mi pare funzioni correttamente: lo apro e lo richiudo subito; lo riapro e non risultano registrate l'apertura e chiusura precedenti.
Edit: ritiro quanto detto: non so come ma c'era Application.EnableEvents a False.
Ricontrollo.
Edit2: confermo che c'è un problema con Application.EnableEvents (probabilmente non lo riabiliti prima della chiusura).
Hmmm, non mi pare funzioni correttamente: lo apro e lo richiudo subito; lo riapro e non risultano registrate l'apertura e chiusura precedenti.
Edit: ritiro quanto detto: non so come ma c'era Application.EnableEvents a False.
Ricontrollo.
Edit2: confermo che c'è un problema con Application.EnableEvents (probabilmente non lo riabiliti prima della chiusura).
Si in effetti hai ragione , perchè con l'Edit anche se scrivi qualcosa e salvi poi esci , non ti apre più la finestra di dialogo e non salva nulla
Secondo mè si potrebbe disattivare il comando salva dal menu a tendina , in modo che anche se salvi , l'Editing rimane attivo , in questo modo all'uscita ti apre la finestra di dialogo salva
Infatti c'è qualcosa da cambiare nel mio codice, che non riesco a fare
N.B.: propedeutica al funzionamento di quanto segue è la creazione di 3 name:
- LastSave in cui si memorizza il "Last save time" vedi (*);
- rAction in cui si memorizza l'"ultimo range valorizzato del registro" vedi (*);
- Action in cui si memorizza l'"azione" vedi (*);
All'apertura del file controllo il testo in colonna C dell'ultima riga del registro:
- se non contiene "ACCESSO" registro l'accesso in una nuova riga;
- se contiene "ACCESSO" registro una nuova riga con "CHIUSURA" mettendo la data dell'ultimo salvataggio del file e registro una nuova riga di "ACCESSO";
Alla chiusura del file:
- se il file NON è stato modificato aggiungo una riga al registro con "CHIUSURA" e salvo;
- se il file è stato modificato e salvato aggiungo una riga al registro con "CHIUSURA CON MODIFICHE" e salvo;
- se il file è stato modificato ma non salvato e chiudo:
- se all'avviso di salvare il file si risponde "Sì" allora aggiungo una riga al registro con "CHIUSURA CON MODIFICHE" e salvo;
- se all'avviso di salvare il file si risponde "No" allora il file si chiude e l'ultima riga non verrà salvata (resterà quindi la riga di "ACCESSO" che verrà chiusa all'apertura del file);
(*) creazione del nome "LastSave": in finestra immediata dare questo comando
ThisWorkbook.Names.Add "LastSave", RefersTo:= Thisworkboook.BuiltinDocumentProperties(12)(*) creazione del nome "rAction": in finestra immediata dare questo comando
ThisWorkbook.Names.Add "rAction", RefersTo:=Foglio5.Range("An:Cn")dove n è l'ultima riga valorizzata del foglio Accessi;(*) creazione del nome "Action": in finestra immediata dare questo comando
ThisWorkbook.Names.Add "Action", RefersTo:="CHIUSURA");Questo il codice da mettere nel modulo di ThisWorkBook (Questa_cartella_di_lavoro):
Private Sub Workbook_Open() If [Action] = "CHIUSURA" And [rAction].Cells(1, 3) = "ACCESSO" Then Me.Names("LastSave").RefersTo = Me.BuiltinDocumentProperties(12) UpdateInfoSheet True End If Me.Names("Action").RefersTo = "ACCESSO" '----------------------------------------------------------------------------- 'ACCESSI Application.ScreenUpdating = False Me.Names("LastSave").RefersTo = Now UpdateInfoSheet True Me.Names("Action").RefersTo = "CHIUSURA" Me.Save Application.ScreenUpdating = True End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim sAzione As String 'ACCESSI If Me.Saved Then sAzione = "CHIUSURA" UpdateInfoSheet sAzione Me.Save Else sAzione = "CHIUSURA CON MODIFICA" UpdateInfoSheet sAzione End If End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If [Action] = "ACCESSO" Then Me.Names("Action").RefersTo = "CHIUSURA" ElseIf [Action] = "CHIUSURA CON MODIFICA" And Not Me.Saved Then UpdateInfoSheet True End If End Sub Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name <> "accessi" Then Me.Names("Action").RefersTo = "CHIUSURA CON MODIFICA" End Sub Private Sub UpdateInfoSheet(Optional bSave As Boolean) '(sAction As String) Const iCOLUMN__ACTION As Integer = 3 Const iCOLUMN__NAME As Integer = 1 Const iCOLUMN__DATE As Integer = 2 Const sACCESSI_SHEET As String = "ACCESSI" Const sPASSWORD As String = "987654" Dim iNewRowNo As Long Dim vAct As Variant With Sheets(sACCESSI_SHEET) Application.EnableEvents = False iNewRowNo = .Cells(Rows.Count, iCOLUMN__NAME).End(xlUp).Row + 1 .Unprotect Password:=sPASSWORD If [Action] <> "CHIUSURA CON MODIFICA" Then iNewRowNo = .Cells(Rows.Count, iCOLUMN__NAME).End(xlUp).Row + 1 If bSave Then .Cells(iNewRowNo, iCOLUMN__NAME) = Application.UserName .Cells(iNewRowNo, iCOLUMN__DATE) = CDate([LastSave]) .Cells(iNewRowNo, iCOLUMN__ACTION) = [Action] Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) Else ReDim vAct(1 To 3) vAct(1) = Application.UserName vAct(2) = Now vAct(3) = [Action] Me.Names("rAccess").RefersTo = vAct End If Else If bSave Then vAct = [rAccess] .Cells(iNewRowNo, iCOLUMN__NAME) = vAct(1) .Cells(iNewRowNo, iCOLUMN__DATE) = vAct(2) .Cells(iNewRowNo, iCOLUMN__ACTION) = vAct(3) vAct(3) = "CHIUSURA CON MODIFICA" Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) Else ReDim vAct(1 To 3) vAct(1) = Application.UserName vAct(2) = Now vAct(3) = [Action] Me.Names("rAccess").RefersTo = vAct End If End If .Protect Password:=sPASSWORD, userinterfaceonly:=True Application.EnableEvents = True End With End SubAllegato file modificato.
N.B.: dovrebbe funzionare correttamente, ma meglio verificare accuratamente.
Ciao scossa
mi dà errore qui nel nuovo file
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim sAzione As String
'ACCESSI
If Me.Saved Then
sAzione = "CHIUSURA"
UpdateInfoSheet sAzionenon so se è colpa della versione di excel 2007
mi dà errore qui nel nuovo file
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim sAzione As String
...
UpdateInfoSheet sAzioneCiao,
purtroppo nel preparare il messaggio ho "contaminato" il codice con una versione precedente; in quella postata sAzione non è più utilizzato ed il parametro opzionale da passare a UpdateInfoSheet è un boolean che serve per scrivere direttamente la riga sul foglio accessi (True) altrimenti la memorizza in un array (False, default).
Purtoppo ora non posso sistemarlo, vedrò più tardi.
Purtoppo ora non posso sistemarlo, vedrò più tardi.
Ho rivisto il codice, ora dovrebbe funzionare correttamente:
Private Sub Workbook_Open() If [Action] = "CHIUSURA" And [rAction].Cells(1, 3) = "ACCESSO" Then Me.Names("LastSave").RefersTo = Me.BuiltinDocumentProperties(12) UpdateInfoSheet True End If Me.Names("Action").RefersTo = "ACCESSO" '----------------------------------------------------------------------------- 'ACCESSI Application.ScreenUpdating = False Me.Names("LastSave").RefersTo = Now UpdateInfoSheet True Me.Names("Action").RefersTo = "CHIUSURA" Me.Save Application.ScreenUpdating = True End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) If [Action] = "CHIUSURA" Then UpdateInfoSheet True Me.Save ElseIf [Action] = "CHIUSURA CON MODIFICA" Then UpdateInfoSheet End If End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If [Action] = "ACCESSO" Then Me.Names("Action").RefersTo = "CHIUSURA" ElseIf [Action] = "CHIUSURA CON MODIFICA" And Not Me.Saved Then UpdateInfoSheet True End If End Sub Private Sub UpdateInfoSheet(Optional bSave As Boolean) '(sAction As String) Const iCOLUMN__ACTION As Integer = 3 Const iCOLUMN__NAME As Integer = 1 Const iCOLUMN__DATE As Integer = 2 Const sACCESSI_SHEET As String = "ACCESSI" Const sPASSWORD As String = "987654" Dim iNewRowNo As Long Dim vAct As Variant With Sheets(sACCESSI_SHEET) Application.EnableEvents = False iNewRowNo = .Cells(Rows.Count, iCOLUMN__NAME).End(xlUp).Row + 1 .Unprotect Password:=sPASSWORD If [Action] <> "CHIUSURA CON MODIFICA" Then iNewRowNo = .Cells(Rows.Count, iCOLUMN__NAME).End(xlUp).Row + 1 If bSave Then .Cells(iNewRowNo, iCOLUMN__NAME) = Application.UserName .Cells(iNewRowNo, iCOLUMN__DATE) = CDate([lastSave]) .Cells(iNewRowNo, iCOLUMN__ACTION) = [Action] Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) Else ReDim vAct(1 To 3) vAct(1) = Application.UserName vAct(2) = Now vAct(3) = [Action] Me.Names("rAccess").RefersTo = vAct End If Else If bSave Then vAct = [rAccess] .Cells(iNewRowNo, iCOLUMN__NAME) = vAct(1) .Cells(iNewRowNo, iCOLUMN__DATE) = vAct(2) .Cells(iNewRowNo, iCOLUMN__ACTION) = vAct(3) Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) vAct(3) = "CHIUSURA CON MODIFICA" Else ReDim vAct(1 To 3) vAct(1) = Application.UserName vAct(2) = Now vAct(3) = [Action] Me.Names("rAccess").RefersTo = vAct End If End If .Protect Password:=sPASSWORD, userinterfaceonly:=True Application.EnableEvents = True End With End Sub Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name <> "accessi" Then Me.Names("Action").RefersTo = "CHIUSURA CON MODIFICA" End SubAllegato file modificato.
N.B.: mi scuso per il disguido, dovrebbe funzionare correttamente ma una verificare seria da parte tua è d'obbligo.
Allegati:
You must be logged in to view attached files.Grande Scossa
Unica cosa che vedo ; se fosse possibile
Quando fai una modica e salvi dal Menu , ti registra CHIUSURA CON MODIFICA , poi quando chiudi lo registra di nuovo , a mio parere all'uscita se ha già registrato non dovrebbe più registrarlo
Grazie scossa, ottimo lavoro.
Vedo che facendo una modifica nei fogli e poi cliccando nel pulsante icona salva si inserisce nel foglio accessi
CHIUSURA CON MODIFICA in questo punto è possibile inserire invece FOGLIO MODIFICATO o è troppo per modificare la macro?
Comunque grazie
Quando fai una modica e salvi dal Menu , ti registra CHIUSURA CON MODIFICA , poi quando chiudi lo registra di nuovo , a mio parere all'uscita se ha già registrato non dovrebbe più registrarlo
CHIUSURA CON MODIFICA in questo punto è possibile inserire invece FOGLIO MODIFICATO o è troppo per modificare la macro?
Ho modificato il codice per risolvere entrambi i problemi, almeno spero
Quindi se si fanno modifiche ai fogli quando si salva viene registrato "nomedelfoglio MODIFICATO" su una sola riga che riporta l'ultimo foglio modificato. Volendo si può modificare facilmente il codice per tenere traccia su righe distinte tutte le volte che si modifica un foglio e poi si salva (sempre però l'ultimo foglio modificato prima del salvataggio), ma lo sconsiglio perché secondo me creerebbe troppe righe.
Allego il file aggiornato.
Allegati:
You must be logged in to view attached files.Ciao scossa, ho fatto delle prove e mi sembra sempre meglio.
Per questa parte, si può fare?
Quindi se si fanno modifiche ai fogli quando si salva viene registrato "nomedelfoglio MODIFICATO" su una sola riga che riporta l'ultimo foglio modificato. Volendo si può modificare facilmente il codice per tenere traccia su righe distinte tutte le volte che si modifica un foglio e poi si salva (sempre però l'ultimo foglio modificato prima del salvataggio), ma lo sconsiglio perché secondo me creerebbe troppe righe.
Ciao,
nella sub UpdateInfoSheet() semplifica questo blocco di codice:
If [Action] Like "* MODIFICATO" And .Cells(iNewRowNo - 1, 3) Like "* MODIFICATO" Then iNewRowNo = iNewRowNo - 1 Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) Else iNewRowNo = .Cells(Rows.Count, iCOLUMN__NAME).End(xlUp).Row + 1 End If If bSave Then If .Cells(iNewRowNo - 1, 3) Like "* MODIFICATO" Then Me.Names("Action").RefersTo = "CHIUSURA CON MODIFICA" End If .Cells(iNewRowNo, iCOLUMN__NAME) = Application.UserName .Cells(iNewRowNo, iCOLUMN__DATE) = CDate([lastSave]) .Cells(iNewRowNo, iCOLUMN__ACTION) = [Action] Me.Names("Action").RefersTo = "CHIUSURA" Elsecosì:
If [Action] Like "* MODIFICATO" And .Cells(iNewRowNo - 1, 3) Like "* MODIFICATO" Then Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) Else iNewRowNo = .Cells(Rows.Count, iCOLUMN__NAME).End(xlUp).Row + 1 End If If bSave Then .Cells(iNewRowNo, iCOLUMN__NAME) = Application.UserName .Cells(iNewRowNo, iCOLUMN__DATE) = CDate([lastSave]) .Cells(iNewRowNo, iCOLUMN__ACTION) = [Action] Me.Names("Action").RefersTo = "CHIUSURA" ElseL'ho testato velocemente ma dovrebbe funzionare a dovere.
Sempre meglio scossa.
Per fare risultare il nome del foglio singolo devo cliccare nel pulsante icona salva per ogni foglio, e qui va bene.
Ma se per ogni foglio se faccio modfiche e non clicco nel pulsante salva risulta poi solo l'ultimo nome del foglio.
Per risultare in questo caso, se non clicco salva, sarebbe meglio che risultasse un nome unico tipo "FOGLI MODIFICATI"
Sempre sia possibile.
Comunque hai fatto un bel lavoro.
Complimenti e ancora grazieCiao,
questo tutto il codice in sostituzione del precedente (nel modulo ThisWorkbook):
Private Sub Workbook_Open() If [rAction].Cells(1, 3) = "ACCESSO" Or [rAction].Cells(1, 3) = "FOGLI MODIFICATI" Then Me.Names("LastSave").RefersTo = Me.BuiltinDocumentProperties(12) UpdateInfoSheet True End If Me.Names("Action").RefersTo = "ACCESSO" '----------------------------------------------------------------------------- 'ACCESSI Application.ScreenUpdating = False Me.Names("LastSave").RefersTo = Now UpdateInfoSheet True Me.Names("Action").RefersTo = "CHIUSURA" Me.Save Application.ScreenUpdating = True End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) If [Action] = "CHIUSURA" Then UpdateInfoSheet True Me.Save ElseIf [Action] Like "* MODIFICA*" Then UpdateInfoSheet End If End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Me.Names("LastSave").RefersTo = Me.BuiltinDocumentProperties(12) If [Action] = "ACCESSO" Then Me.Names("Action").RefersTo = "CHIUSURA" ElseIf [Action] = "FOGLI MODIFICATI" And Not Me.Saved Then UpdateInfoSheet True Me.Names("Action").RefersTo = "CHIUSURA" ElseIf [Action] = "CHIUSURA CON MODIFICA" And Not Me.Saved Then UpdateInfoSheet True End If End Sub Private Sub UpdateInfoSheet(Optional bSave As Boolean) '(sAction As String) Const iCOLUMN__ACTION As Integer = 3 Const iCOLUMN__NAME As Integer = 1 Const iCOLUMN__DATE As Integer = 2 Const sACCESSI_SHEET As String = "ACCESSI" Const sPASSWORD As String = "987654" Dim iNewRowNo As Long Dim vAct As Variant With Sheets(sACCESSI_SHEET) Application.EnableEvents = False iNewRowNo = .Cells(Rows.Count, iCOLUMN__NAME).End(xlUp).Row + 1 .Unprotect Password:=sPASSWORD If [Action] <> "CHIUSURA CON MODIFICA" Then If [Action] = "FOGLI MODIFICATI" And .Cells(iNewRowNo - 1, 3) = "FOGLI MODIFICATI" Then Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) Else iNewRowNo = .Cells(Rows.Count, iCOLUMN__NAME).End(xlUp).Row + 1 End If If bSave Then .Cells(iNewRowNo, iCOLUMN__NAME) = Application.UserName .Cells(iNewRowNo, iCOLUMN__DATE) = CDate([lastSave]) .Cells(iNewRowNo, iCOLUMN__ACTION) = [Action] Me.Names("Action").RefersTo = "CHIUSURA" Else ReDim vAct(1 To 3) vAct(1) = Application.UserName vAct(2) = Now vAct(3) = [Action] Me.Names("rAccess").RefersTo = vAct End If Else If bSave Then vAct = [rAccess] .Cells(iNewRowNo, iCOLUMN__NAME) = vAct(1) .Cells(iNewRowNo, iCOLUMN__DATE) = vAct(2) .Cells(iNewRowNo, iCOLUMN__ACTION) = vAct(3) Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) vAct(3) = "CHIUSURA CON MODIFICA" Else ReDim vAct(1 To 3) vAct(1) = Application.UserName vAct(2) = Now vAct(3) = [Action] Me.Names("rAccess").RefersTo = vAct End If End If Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) .Protect Password:=sPASSWORD, UserInterfaceOnly:=True Application.EnableEvents = True End With End Sub Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name <> "accessi" Then Me.Names("Action").RefersTo = "FOGLI MODIFICATI" End SubGrazie scossa, è meglio.
Una piccola modifica.
Prima dell'ultima modifica, immagine 19_04, che hai fatto risultava per ogni foglio modificato il nome del foglio,
ora come nelle righe rosa, dell'immagine allegata 20_04, risulta "FOGLI MODIFICATI". E' possibile correggere?
Grazie ancoraAllegati:
You must be logged in to view attached files.Ciao,
ho provato ad inseire tutte le macro in un nuovo, non il tuo, file ma non mi funziona dà errore qui
Private Sub Workbook_Open()
If [rAction].Cells(1, 3) = "ACCESSO" Or [rAction].Cells(1, 3) = "FOGLI MODIFICATI" Then
e poi alla chiusura qui
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If [Action] = "CHIUSURA" Then
c'è qualcosa di nascosto da modificare?
Ah ho capito l'errore non ho letto nel post#46067 bisogna creare i nomi in gestiscinomi
bisogna creare i nomi in gestiscinomi

Quando vedi le parentesi quadre significa che sei di fronte a un Range e se invece di un riferimento di cella (ad esempio [A1]) vedi un nome, sei di fronte a un range con nome: [Action] equivale a Range("Action") con la differenza aggiuntiva che l'eventuale contenuto viene ricalcolato. Motivo per il quale scossa stesso mi rimprovero' qualche anno fa e da allora non ho piu' utilizzato questa notazione
Ho corretto il nuovo mio file con le istruzioni di scossa del post#46067 ed ora funziona
Grazie scossa
Ciao,
ho modificato il codice in modo che se dopo aver modificato (anche più volte) un solo foglio registra "nomefoglio MODIFICATO", se invece si sono modificati più fogli registra "FOGLI MODIFICATI".
N.B: ho lasciato la gestione della scritta "CHIUSURA CON MODIFICA" ma non si verificherà più, del resto è inutile in quanto è palese dedurre se tra ACCESSO e CHIUSURA vi siano state delle modifiche.
P.S.: non garantisco la disponibilità ad ulteriori modifiche.
Private Sub Workbook_Open() If [raction].Cells(1, 3) = "ACCESSO" Or [raction].Cells(1, 3) Like "* MODIFICAT?" Then Me.Names("LastSave").RefersTo = Me.BuiltinDocumentProperties(12) UpdateInfoSheet True End If Me.Names("Action").RefersTo = "ACCESSO" '----------------------------------------------------------------------------- 'ACCESSI Application.ScreenUpdating = False Me.Names("LastSave").RefersTo = Now UpdateInfoSheet True Me.Names("Action").RefersTo = "CHIUSURA" Me.Save Application.ScreenUpdating = True End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) If [Action] = "CHIUSURA" Then UpdateInfoSheet True Me.Save ElseIf [Action] Like "* MODIFICA*" Then UpdateInfoSheet ElseIf [Action] = "CHIUSURA CON MODIFICA" And Not Me.Saved Then UpdateInfoSheet True End If End Sub Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Me.Names("LastSave").RefersTo = Me.BuiltinDocumentProperties(12) If [Action] = "ACCESSO" Then Me.Names("Action").RefersTo = "CHIUSURA" ElseIf [Action] Like "* MODIFICAT?" And Not Me.Saved Then UpdateInfoSheet True Me.Names("Action").RefersTo = "CHIUSURA" End If End Sub Private Sub UpdateInfoSheet(Optional bSave As Boolean) '(sAction As String) Const iCOLUMN__ACTION As Integer = 3 Const iCOLUMN__NAME As Integer = 1 Const iCOLUMN__DATE As Integer = 2 Const sACCESSI_SHEET As String = "ACCESSI" Const sPASSWORD As String = "987654" Dim iNewRowNo As Long Dim vAct As Variant With Sheets(sACCESSI_SHEET) Application.EnableEvents = False iNewRowNo = .Cells(Rows.Count, iCOLUMN__NAME).End(xlUp).Row + 1 .Unprotect Password:=sPASSWORD If [Action] <> "CHIUSURA CON MODIFICA" Then If [Action] Like "* MODIFICAT?" And .Cells(iNewRowNo - 1, 3) Like "* MODIFICAT?" Then Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) Else iNewRowNo = .Cells(Rows.Count, iCOLUMN__NAME).End(xlUp).Row + 1 End If If bSave Then .Cells(iNewRowNo, iCOLUMN__NAME) = Application.UserName .Cells(iNewRowNo, iCOLUMN__DATE) = CDate([lastSave]) .Cells(iNewRowNo, iCOLUMN__ACTION) = [Action] Me.Names("Action").RefersTo = "CHIUSURA" Else ReDim vAct(1 To 3) vAct(1) = Application.UserName vAct(2) = Now vAct(3) = [Action] Me.Names("rAccess").RefersTo = vAct End If Else If bSave Then vAct = [rAccess] .Cells(iNewRowNo, iCOLUMN__NAME) = vAct(1) .Cells(iNewRowNo, iCOLUMN__DATE) = vAct(2) .Cells(iNewRowNo, iCOLUMN__ACTION) = vAct(3) Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) vAct(3) = "CHIUSURA CON MODIFICA" Else ReDim vAct(1 To 3) vAct(1) = Application.UserName vAct(2) = Now vAct(3) = [Action] Me.Names("rAccess").RefersTo = vAct End If End If Me.Names("rAction").RefersTo = .Range("A" & iNewRowNo & ":C" & iNewRowNo) .Protect Password:=sPASSWORD, userinterfaceonly:=True Application.EnableEvents = True End With End Sub Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name <> "accessi" Then Me.Names("Action").RefersTo = IIf([Action] = "CHIUSURA" Or [Action] = Sh.Name & " MODIFICATO", Sh.Name & " MODIFICATO", "FOGLI MODIFICATI") End If End Subnon garantisco la disponibilità ad ulteriori modifiche
Gli hai dato talmente tanti spunti per apprendere e comprendere, che adesso sicuramente frank_ciccio sara' invogliato a fare da solo le modifiche che gli servono
-
AutoreArticoli
