Livello tecnico: Conoscenza di base di Visual Basic for Applications Si applica a: Excel (2003/2007/2010/2013)
Dettagli
NOTA. Gli esempi ed il codice sono forniti *così come sono* e l’autore declina ogni responsabilità per un loro uso scorretto. Utilizzate gli esempi forniti o file di prova per i vostri test. La correzione delle eccezioni (errori) e il controllo del tipo di dati inserito è solo parziale. I file vogliono essere un semplice esempio che illustra come sia possibile automatizzare Excel e sono forniti solo a scopo dimostrativo.
Situazione.
Abbiamo un file di Excel molto delicato e vogliamo essere sicuri che siano sempre salvate copie di backup. Vogliamo inoltre che le copie siano identificate da data e ora del salvataggio. Infine, deve esserci la possibilità di eliminare le copie di backup.
Salviamo.
La semplice semplice macro qui sotto, da copia/incollare in un modulo standard, salva una copia del file in C:\ExcelBackup\ con il nome backup_aaaa_mm_gg_hh_mm_ss.xlsm, una cosa tipo: backup_2013_10_07_11_51_48.xlsm:
Public Sub mBackUp()
Dim sDataOra As String
sDataOra = Format(Now, "yyyy_mm_dd_hh_mm_ss")
ThisWorkbook.SaveCopyAs "C:\ExcelBackup\backup_" & sDataOra & ".xlsm"
End Sub
La formattazione (Format()) della funzione Now (che ricordo ritorna la data e l'ora corrente) è solo un esempio, così come il nome che la precede. Ciascuno può ovviamente adattarla alle proprie esigenze considerando l'ordine che vorrà visualizzare nella cartella di salvataggio dei file di backup. Ad esempio personalmente utilizzo questa:
sDataOra = Format(Now, "yyyymmdd_hhmmss")
che da come risultato:
backup_20131007_115924.xlsm
Altrettanto ovviamente potete modificare nome e percorso della cartella di salvataggio dei file di backup (nell'esempio è C:\ExcelBackup). Qui si presume che la cartella sia già presente. Se volete crearla nel caso non lo sia, un modo è modificare così la precedente macro:
Public Sub mBackUp()
Dim sDataOra As String
On Error Resume Next
MkDir ("C:\ExcelBackup")
sDataOra = Format(Now, "yyyymmdd_hhmmss")
ThisWorkbook.SaveCopyAs "C:\ExcelBackup\backup_" & sDataOra & ".xlsm"
End Sub
Ricordo che non si possono utilizzare alcuni simboli nei nomi dei fil, ad esempio / \ : quindi non sono possibili nomi come backup_2013/10/07_12:09:45
Quando salvare.
Creata la macro che salva, dobbiamo definire *quando salvare*.
Possiamo creare il backup all'avvio del file, quindi inserire questo codice nel modulo di codice di Questa_cartella_di_lavoro (ThisWorkbook per le versioni precedenti la 2010):
Private Sub Workbook_Open()
Call mBackUp
End Sub
Possiamo creare il backup alla chiusura del file, quindi sempre in Questa_cartella_di_lavoro(o ThisWorkbook):
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call mBackUp
End Sub
Possiamo forzare il backup ad ogni salvataggio del file, quindi sempre in Questa_cartella_di_lavoro(o ThisWorkbook):
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call mBackUp
End Sub
Ancora potremmo temporizzare il salvataggio. In questo caso in un modulo standard:
Option Explicit
Public Sub mBackUp()
Dim sDataOra As String
On Error Resume Next
MkDir ("C:\ExcelBackup")
sDataOra = Format(Now, "yyyymmdd_hhmmss")
ThisWorkbook.SaveCopyAs "C:\ExcelBackup\backup_" & sDataOra & ".xlsm"
Call mEsegui
End Sub
Public Sub mEsegui()
Application.OnTime Now + TimeValue("00:00:10"), "mBackup"
End Sub
Nel modulo di codice di Questa_cartella_di_lavoro (o ThisWorkbook):
Private Sub Workbook_Open()
Call mEsegui
End Sub
A titolo di esempio, il salvataggio dei file di backup è impostato a 10 secondi, modificatelo per le vostre esigenze. Per saperne di più sul metodo OnTime,:
o consultate la guida del VB di Excel.
E' possibile utilizzare un timer con avvio e stop. Qui due esempi:
Pulire la cartella di backup.
I file di backup possono accumularsi nella cartella oltre quelle che sono le nostre esigenze. Questa semplice macro (sempre da copia/incollare in un modulo standard) eliminerà *tutti* i file presenti nella cartella C:\ExcelBackup:
Public Sub mCancellaBackup()
Dim lDomanda As Long
Dim lConferma As Long
lDomanda = MsgBox("Eliminare tutti i precedenti backup di Excel?", _
vbYesNo + vbQuestion, _
"Eliminazione backup di Excel")
If lDomanda = vbYes Then
lConferma = MsgBox("Confermi l'eliminazione dei backup di Excel?" & _
vbNewLine & "Non sarà possibile ripristinare i file eliminati.", _
vbYesNo + vbExclamation, _
"Eliminazione backup di Excel")
If lConferma = vbYes Then
On Error Resume Next
Kill "C:\ExcelBackup\*.*"
End If
End If
End Sub
Ripeto: vengono eliminati tutti i file presenti in C:\ExcelBackup e per questo motivo ci sono due richieste di conferma. Utilizzando Kill, i file non vanno nel cestino, sono eliminati e basta.
Figura 1: Le due MsgBox in successione che chiedono conferma per l'eliminazione definitiva dei file di backup.
Conclusioni.
Quanto sopra vuole essere esempio e stimolo per creare un sistema di backup sicuro e gestito da voi per i vostri file più importanti e il tutto run time, cioè mentre state lavorando, consentendovi di avere più versioni di backup in caso di necessità.
Questo non vi esonera però da impostare un sistema di backup per *tutti* i dati importanti del vostro pc, cartella di backup dei file di Excel compresa.
Riferimenti.
Per chi non avesse mai utilizzato il VBA di Excel e volesse provare, un aiuto qui:
Commenti.
Sono graditi i tuoi commenti a questo articolo Wiki e, se lo ritieni interessante, per favore spunta la voce : E' stato utile all'inizio della pagina.
Grazie.
NOTA. Excel non dispone nativamente di procedure assolutamente sicure per impedire la visualizzazione e la modifica del codice vb e/o per la protezione dei fogli. E’ una cosa da tenere sempre presente quando si distribuiscono file con contenuti ritenuti delicati. Ricordate anche che è possibile lanciare il file di Excel senza che vengano eseguite le macro.
Risorse.
Avvio Pulito di Windows (courtesy of Microsoft MVP Franco Leuzzi)
Computer infettato da malware (courtesy of Microsoft MVP Vincenzo Di Russo)