Excel - Backup del file - VBA

Riepilogo
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)




Questo articolo è stato utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questo articolo?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questo articolo?

Grazie per il tuo feedback.

Grazie Mauro il tuo tutorial è davvero molto chiaro e esaustivo.

Ho infatti creato una procedura di backup che tutte le volte che chiudo una cartella me ne crrea una copia di sicurezza in un'altra posizione, con data e ora riportati nel nome del file.

Mi chiedevo: aprendo il file tante volte al giorno vengono fatte tante copie, come si potrebbe fare per dirgli di farne solo una copia al giorno (o al mese)? cioè controllando se non eiste già una copia con quella data me la fa, se no non me la fa.

Grazie per l'attenzione

Chris

Questo commento è stato utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questo commento?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questo commento?

Grazie per il tuo feedback.

wowww, ci sono riuscito da solo in questo modo:

'attibuisco alla variabile sNomeFile il nome che andrei a dare al file

sNomeFile = Wb1.Path & "\Cartella Backup\Copia File del " & _
    Format(Now, "mm-yyyy") & ".xls" 'un file di backup con mese e anno corrente

'se non esiste ancora un file con quel nome lo creo se no non faccio nulla
If Len(Dir(sNomeFile)) = 0 Then
    ActiveWorkbook.SaveCopyAs (Wb1.Path & "\Cartella Backup\Copia File del " & _
    Format(Now, "mm-yyyy") & ".xls")
End If

'ne creo comunque anche una copia di sicurezza in più aggiornata sempre all'ultima versione

ActiveWorkbook.SaveCopyAs (Wb1.Path & "\Cartella Backup\Copia File-ultima copia salvata.xls")

In questo modo ho a disposizione un file di backup ad ogni inizio mese.....

Non so se sia molto "ortodosso" ma comunque funziona ed è proprio quello che mi serviva

Chris

Questo commento è stato utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questo commento?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questo commento?

Grazie per il tuo feedback.

Grazie Mauro  per il tutorial.

Ho questa situazione e non so come uscirne fuori. Devo lavorare ad un file excel dove ho creato una macro avviata da un pulsante per eseguire una copia di backup in una determinata cartella del pc.

Ora quando rendo il file condivisibile con one drive, automaticamente onedrive crea una copia di quel file e lo mette dentro la sua cartella di lavoro. Quando avvio la copia di backup non mi funziona piu dandomi un errore di run-time 52.

Sai se c'e un modo per creare una copia di backup sul mio pc partendo da questo file in onedrive?

Grazie

Questo commento è stato utile?

Siamo spiacenti che questo non sia stato utile.

Ottimo. Grazie per il tuo feedback.

Quanto sei soddisfatto di questo commento?

Grazie per il feedback, ci aiuta a migliorare il sito.

Quanto sei soddisfatto di questo commento?

Grazie per il tuo feedback.

 
 

Informazioni articolo del forum


Ultimo aggiornamento 21 febbraio 2024 Visualizzazioni 5.767 Si applica a: