martedì 16 dicembre 2008

Salvare automaticamente i file di Word e di Excel


Navigo, da qualche anno, il sito Contexture di Debra Dalgleish; ci sono esempi ben fatti e spiegazioni chiare su molti argomenti che riguardano l'uso di Excel. Da qualche mese frequento anche il suo blog.
La Dalgleish ha pubblicato, per la APress, anche alcuni libri sulle Tabelle Pivot. Nel post di ieri riporta alcune righe di una macro semplice semplice per fare una copia di un file su cui si sta lavorando. Ciascuno di noi, credo e spero, usa una tecnica di salvataggio delle copie mentre il lavoro è in progresso. Io di solito riempio la cartella in cui faccio sviluppo di file numerati appendendo al nome il suffisso _nnn, dove nnn è un numero progressivo, che assegno a mano. Appena fatto il salvataggio, in un semplice file di testo, di solito LEGGIMI.TXT, riporto il nome del file salvato e qualche rigo esplicativo che mi ricordi le cose aggiunte, variate o tolte rispetto al salvataggio precedente. Naturalmente faccio questo in casi di progetti che mi si trascinino per un po' di tempo, il che accade assai spesso, non per la complessità delle cose che faccio, ma per la frammentazione del mio modo di lavorare.
La macro della Dalgleish, adatta sia per Excel 2003 che per Excel 2007, sfrutta una delle proprietà dell'oggetto ActiveWorkbook, cioè la SaveCopyAs che permette di fare una copia della cartella di lavoro con un nome diverso, semplicemente appendendo al nome del file di Excel un suffisso con anno, mese, giorno, ora, minuto (e secondo). Cioè il nostro file: Movimenti.xls diventa, se salvato adesso, Movimenti_20081215_211020.xls.
Il codice lo si può copiare direttamente dal post, facendo però la massima attenzione a cambiare le virgolette che racchiudono alcune stringhe del testo: sono inverted curled commas e vanno sostituite con il nostro carattere ", quello, cioè, che sulla tastiera italiana è al di sopra del tasto del 2.
Ma la funzionalità della macro mi interessa non tanto per i file di Excel, quanto per quelli di Word.
Purtroppo, però, non esiste una SaveCopyAs per l'oggetto ActiveDocument. Una rapida ricerca mi ha fatto trovare una macro, pubblicata sul sito di VBA Express, che simula, in Word il SaveCopyAs di Excel. Mettendo insieme i due blocchi di codice, si ottiene una macro unica, che riporto di seguito, che consente di fare copie di salvataggio di documenti di Word, con la stessa regola dell'accodamento di data e ora come suffisso del nome del file. Si noti che nel codice è scritto il percorso dedicato alle copie ["C:\COPIE\"], che può essere personalizzato.  
N.B.: sia nella macro di Excel che in quella di Word occorre aver salvato una prima volta il file con un nome assegnato.


Codice per la macro di Word (si noti che è necessaria anche la Function GetSaveAsPath() ). L'ho testato solo su Word 2003.

-----------

Sub SalvaCopia()

Dim strFile As String
Dim strName As String
Dim IExt As Long
Dim strDir As String
Dim strExt As String
Const lCancelled_c As Long = 0

strName = ActiveDocument.Name
'Qui va inserito il percorso della directory delle copie:
strDir = "C:\COPIE\"

If UCase(Right(strName, 4)) = ".DOC" Then
lExt = 4
Else
lExt = 5
End If

strFile = Left(strName, Len(strName) - lExt)
strExt = Right(strName, lExt)

' Da qui, simula il SaveCopyAs di Excel

Dim sSaveAsPath As String
sSaveAsPath = GetSaveAsPath
If VBA.LenB(sSaveAsPath) = lCancelled_c Then Exit Sub
'Salva i cambiamenti nel documento originale
ActiveDocument.Save
'La riga che segue copia il documento attivo
Application.Documents.Add ActiveDocument.FullName
'La riga che segue salva la copia nella DIR predefinita e con il nome 'progressivo'
ActiveDocument.SaveAs strDir & strFile & Format(Now, "_yyyymmdd_HhMmSs") & strExt
'La riga che segue chiude la copia lasciando attivo il documento originale
ActiveDocument.Close
End Sub

Public Function GetSaveAsPath() As String
' Per SaveCopyAs
Dim fd As Office.FileDialog
Set fd = Word.Application.FileDialog(msoFileDialogSaveAs)
fd.InitialFileName = ActiveDocument.Name
If fd.Show Then GetSaveAsPath = fd.SelectedItems(1)
End Function

Nessun commento:

Posta un commento