Registrare modifiche in un file di LOG

Stato
Chiusa ad ulteriori risposte.

giulianovac

Access/VBA Expert
Expert
9 Giugno 2018
2.387
83
Italy
2013 2019
177
Il progetto allegato mostra come registrare tutte le modifiche fatte in qualsiasi foglio, in un file di testo LOG.txt
Nel caso specifico, vengono registrate le seguenti informazioni:
Visual Basic:
- DATE TIME  data ed ora di modifica
- USER       utente che la eseguito la modifica
- SHEET      il foglio in cui è stata eseguita
- CELL       indirizzo della cella modificata
- OLD        il valore contenuto PRIMA della modifica
- NEW        il valore contenuto DOPO la modifica
Esempio:
Visual Basic:
DATE TIME              USER      SHEET      CELL    OLD       NEW
2019-03-26 19:55:21    andrea    Foglio2    $B$1    [NULL]    2
2019-03-26 19:55:23    andrea    Foglio2    $C$1    [NULL]    3
2019-03-26 19:55:25    andrea    Foglio2    $D$1    [NULL]    4
2019-03-26 19:55:51    pippo     Foglio2    $A$1    1         A
2019-03-26 19:59:31    pluto     Foglio1    $C$2    [NULL]    ABC
Se avete necessità di ulteriori informazioni le trovate nel tutorial:

Il progetto FileLOG.xlsm lo trovate nel successivo AGGIORNAMENTO.
 
Ultima modifica:

giulianovac

Access/VBA Expert
Expert
9 Giugno 2018
2.387
83
Italy
2013 2019
177
AGGIORNAMENTO

Corettamente, ges @ges mi ha fatto notare che se un utente seleziona un RANGE di celle, la routine di composizione della riga da scrivere nel LOG genera un errore perché Target.Value in questo caso non può restituire un valore corretto.

Allora ho pensato di intercettare tutte le celle del range selezionato e registrarne tutti i valori nel LOG.
Ovviamente questo rende il codice un po' più complicato ed ho aggiunto delle funzioni che aiutano sia la leggibilità del codice che quindi diventa più facile da modificare e manutenere.


Naturalmente tutto questo avrebbe comportato il rischio che se l'utente seleziona un range di celle troppo esteso le informazioni nel LOG diventano illeggibili, per cui nel progetto ho limitato numero max di celle, nel senso che se l'utente seleziona meno di 100 celle nel LOG vengono registrati i valori per tutte le celle.

Ad esempio, se l'utente seleziona un range di 4x4 nel LOG e preme CANC si otterrà una riga come questa:
2019-03-27 09:39:53 giulio Foglio1 $A$1:$B$2 |3|1|5|123| (Area=$A$1:$D$3) |[NULL]|[NULL]|[NULL]|[NULL]| (Area=$A$1)

Se invece digita qualcosa in un range (ma chiaramente viene modificata solo la cella corrente) si otterà:
2019-03-27 09:44:33 giulio Foglio1 $A$1 |3|1|5|123| (Area=$A$1:$D$3) 1


Se seleziona un range di 4x4 celle e digita qualcosa SU OGNI CELLA, ovvero premendo INVIO, si otterrà qualcosa di questo genere:
2019-03-27 09:52:28 giulio Foglio1 $A$1 |A|2|B|4| (Area=$A$1:$D$3) 0
2019-03-27 09:52:37 giulio Foglio1 $A$2 |A|2|B|4| (Area=$A$1:$D$3) 0
2019-03-27 09:52:40 giulio Foglio1 $B$1 |A|2|B|4| (Area=$A$1:$D$3) 0
2019-03-27 09:52:41 giulio Foglio1 $B$2 |A|2|B|4| (Area=$A$1:$D$3) 0


Se invece seleziona un numero maggiore a 100, registrarà nel LOG solo il numero delle celle selezionate, registrando comunque l'indirizzo della cella modificata ed il valore inserito.
Nell'esempio seguente, l'utente ha selezionato un Area di 121 celle e (mentre era attiva la selezione) ha premuto 1 nella cella A1, ha premuto INVIO ed infine premuto 2 nella cella A2:

2019-03-27 11:16:20 giorgio Foglio1 $A$1 Area=121 1
2019-03-27 11:16:40 giorgio Foglio1 $A$2 Area=121 2
 

Allegati

ges

Excel/VBA Expert
Amministratore
Expert
21 Giugno 2015
20.989
1.733
Como
2011MAC 2016WIN
439
Vorrei fare un'integrazione all'ottimo contributo di giulianovac @giulianovac cappello_saluta e cioè fare in modo che il file di LOG una volta generato non sia lasciato sul PC che lo ha creato ma venga spedito a una mail specificata.

Questo codice da inserire in un modulo standard
Visual Basic:
Sub Invia_mail()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim sFilePath As String
    Dim strAdd As String
    Dim strBody As String
    Application.ScreenUpdating = False
    sFilePath = ThisWorkbook.Path & "\LOG.txt"
    strAdd = "mia-mail@mail.com"
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)
    strBody = "File di LOG"
    With OutMail
        .To = strAdd
        .CC = ""
        .Attachments.Add sFilePath
        .BCC = ""
        .Subject = "File di LOG"
        .Body = strBody
        .Send
    End With
    Set OutMail = Nothing
    Kill sFilePath
    Set OutApp = Nothing
    Application.ScreenUpdating = True
End Sub
Questo codice da inserire nel modulo di "Questa Cartella di lavoro"
Visual Basic:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Call Invia_mail
End Sub
La prima macro ("Invia_mail") spedisce il file di Log all'indirizzo specificato distruggendo quello presente nel PC.
La seconda macro serve a far avviare la macro "Invia_mail" al momento della chiusura del file.

Questo codice funziona per chi ha Outlook installato.
 
  • Like
Reactions: giulianovac

Powerwin

VBA Expert
Expert
17 Marzo 2016
4.390
83
vicino a Milano
2019
87
Aggiungo il mio piccolo contributo, invio con Thunderbird (da provare, in questo momento non ho Thunderbird sul pc)

Visual Basic:
Private Sub Invia_thunderbird()
       Dim invia, dest, Ogg, testo, dati As String
       Dim sFilePath As String
       sFilePath = ThisWorkbook.Path & "\LOG.txt"   
      
    dest = "mia-mail@mail.com"
    Ogg = "File di LOG"
    testo = Ogg
  
    invia = "C:Program FilesMozilla Thunderbird    hunderbird.exe" 'da cambiare con l'indirizzo del proprio programma
    dati = " -compose " & "attachment=" & sFilePath & "," & "to=" & dest & "," & "subject=" & Ogg & "," & "body=" & testo
  
Shell invia & dati, vbNormalFocus

End Sub
 
  • Like
Reactions: ges and giulianovac

Powerwin

VBA Expert
Expert
17 Marzo 2016
4.390
83
vicino a Milano
2019
87
Riposto il codice che non so per quale motivo ha perso dei pezzi nella codifica Visual Basic

Visual Basic:
Private Sub Invia_thunderbird()
       Dim invia, dest, Ogg, testo, dati As String
       Dim sFilePath As String
       sFilePath = ThisWorkbook.Path & "\LOG.txt"   
      
    dest = "mia-mail@mail.com"
    Ogg = "File di LOG"
    testo = Ogg
 
    invia = "C:Program Files\Mozilla Thunderbird\Thunderbird.exe" 'da cambiare con l'indirizzo del proprio programma
    dati = " -compose " & "attachment=" & sFilePath & "," & "to=" & dest & "," & "subject=" & Ogg & "," & "body=" & testo
 
Shell invia & dati, vbNormalFocus

End Sub
 
  • Like
Reactions: ges and giulianovac
Stato
Chiusa ad ulteriori risposte.

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!