In questa pagina proviamo a presentare alcune rourines per una piccola gestione dei Files e Cartelle.
In questa pagina cercherò di spiegare, se mi riesce, alcune piccole utility sulla gestione dei files ed alla fine vediamo come sfruttarle in una routine che potrebbe servire a molti.
Function ControllaCartella(DirName As String) As Boolean
On Error Resume Next
ControllaCartella = GetAttr(DirName) And vbDirectory
End Function
Per testare questa funzione questa che segue potrebbe essere una probabile routine;
Sub ControllaSeCartellaEsiste()
Dim Percorso As String
Percorso = "c:\Clip-art"
MsgBox ControllaCartella(Percorso)
End Sub
Simile alla precedente è questa che segue che verifica se esiste un file
Function ControllaFile(FileName As String) As Boolean
On Error Resume Next
ControllaFile = GetAttr(FileName) And vbArchive
End Function
Questa che segue potrebbe essere una routine di prova per la funzione
Sub ControllaSeFileEsiste()
Dim NomeFile As String
NomeFile = "D:\Clip-art\Aminali\Uccelli\corvo.wmf"
MsgBox ControllaFile(NomeFile)
End Sub
Diverso è l'approccio che si ha con queste due routines che, seppur svolgono lo stesso lavoro delle due funzioni appena mostrate, se ne distaccano leggermente.
Sub ControllaSeCartellaEsiste1()
Dim sPath As String
sPath = "C:\Clip-art\"
If Len(Dir$(sPath, vbDirectory)) Then
MsgBox "La cartella esiste."
Else
MsgBox "La cartella non esiste."
End If
End Sub
Sub ControllaSeFileEsiste1()
Dim sFileName As String
sFileName = "C:\Clip-art\Aminali\Uccelli\corvo.wmf"
If Len(Dir$(sFileName)) Then
MsgBox "Il file esiste."
Else
MsgBox "Il file non esiste."
End If
End Sub
Le prime due Funzioni leggono la Cartella o il File con:
ControllaCartella = GetAttr(DirName) And vbDirectory
ControllaFile = GetAttr(FileName) And vbArchive
Con questo sistema se la cartella o il file vengono trovati, le variabili ControllaCartella e ControllaFile, di tipo Booleano, restituiscono il valore True, se non vengono trovati viene sollevato un errore che blocca l'esecuzione del programma.
Per evitare questo blocco facciamo affidamento al controllo di errori
On Error Resume Next
Grazie a questo controllo l'esecuzione del programma non viene bloccato e le variabili ControllaCartella e ControllaFile, continuano a restituire False. Grazie a questa discriminazione sarà poi possibile prendere le opportune decisioni.
Diverso, ma con lo stesso risultato, è il discorso sulle altre due procedure. che usano:
If Len(Dir$(sPath, vbDirectory)) Then...
If Len(Dir$(sFileName)) Then...
La routine non solleva errori se non trova la Cartella o il file perchè la funzione Dir accetta una stringa che rappresenta il nome della cartella o del file che si intende cercare e se non trovati restituisce una stringa di lunghezza 0 (zero).
E' possibile leggere o scrivere alcune proprietà del file su cui si sta lavorando. Queste proprietà sono visibili nella finestra Proprietà del file che ci viene mostrata dal menù File / Proprietà.
In VBA queste proprietà sono reperibili nella Proprietà BuiltinDocumentProperties di ActiveWorkbook.
Per leggere queste proprietà è possibile usare questa forma:
Sub LeggiProprietaDocumento()
Dim P
With ActiveWorkbook.BuiltinDocumentProperties
MsgBox "Autore: " & .Item("Author").Value
MsgBox "Oggetto: " & .Item("Subject").Value
MsgBox "Titolo: " & .Item("Title").Value
MsgBox "Commenti: " & .Item("Comments").Value
MsgBox "Compagnia: " & .Item("Company").Value
' Le righe che seguono generano un errore se il
' documento non è mai stato salvato o stampato.
On Error Resume Next
MsgBox "Ultimo salvataggio: " & .Item("Last Save Time").Value
If Err Then
MsgBox "Documento ancora non salvato"
End If
MsgBox "Ultima stampa: " & .Item("Ultima stampa").Value
If Err Then
MsgBox "Il documento non è mai stato stampato"
End If
On Error GoTo 0
End With
End Sub
Alcune di queste proprietà (nell'esempio le proprietà Last Save Time se il documento non è stato ancora salvato e Ultima stampa se non è stato mai stampato) potrebbero causare un errore. Per questo è bene difendeersi col classico gestore di errori rappresentato da On Error Resume Next
Per leggere in sequenza tutte le proprietà del documento è possibile usare questo ciclo:
For Each P In ActiveWorkbook.BuiltinDocumentProperties
On Error Resume Next
MsgBox P.Name & " - " & P.Value
If Err Then
MsgBox "errore per " & P.Name
End If
On Error GoTo 0
Next
Per scrivere una delle proprietà è sufficiente usare questa forma:
Sub ScriviProprietaDocumento()
ActiveWorkbook.BuiltinDocumentProperties("Comments").Value = "mio primo commento"
' oppure
With ActiveWorkbook.BuiltinDocumentProperties
.Item("Comments").Value = "un commento qualsiasi"
.Item("Title").Value = "Nome del file.xls"
End With
End Sub
Normalmente possiamo decidere di salvare la cartella di lavoro con queste istruzioni:
Sub Salvami()
ActiveWorkbook.Save
Application.Quit
End Sub
Con queste istruzioni salviamo la cartella di lavoro nella stessa posizione da cui l'abbiamo aperta.
Ma potremmo desiderare di salvare un lavoro di Excel in una particolare cartella del disco fisso. Se questa cartella non esiste vogliamo crearla e quindi salvarci il mio file.
Per fare questa cosa è necessario compiere alcuni passi preliminari:
Vediamo ora come procedere.
Ricicliamo la funzione che controlla se la cartella che cerchiamo esiste
Function ControllaCartella(DirName As String) As Boolean
On Error Resume Next
ControllaCartella = GetAttr(DirName) And vbDirectory
End Function
Creaiamo ora la funzione che crea la cartella o l'intero percorso se questi non esistono
Function CreaCartellaSeNonEsiste(Cartella As String)
Dim A, I, Cartelle
Dim Cerca As String, Conta
' nella variabile Cartella è memorizzata la cartella o il percorso che intendiamo usare
' andiamo a controllare l'esistenza della cartella nella funzione ControllaCartella
A = ControllaCartella(Cartella)
' se la variabile A risulta essere True tutto il seguente
' blocco If ... End If non verrà eseguito e si torna alla routine chiamante
If A = False Then
' la stringa Cartella viene suddivisa in tante sottostringhe usando
' il carattere "\" come separatore memorizzandole in un Array rappresentato da Cartelle
Cartelle = Split(Cartella, "\")
I = LBound(Cartelle) + 1
' questo ciclo continuerà fintando la variabile A sarà False
Do While A = False
Cerca = ""
' cominciamo col cercare tutte le cartelle a partire dalla più vicina alla radice
For Conta = LBound(Cartelle) To I
Cerca = Cerca & Cartelle(Conta) & "\"
Next
I = I + 1
' man mano che ricostruisco l'intero percorso vado a controllare
' se il medesimo esiste
A = ControllaCartella(Cerca)
' se non esiste aggiungo una nuova cartella sul disco fisso
If A = False Then
MkDir Cerca
ChDir Cerca
End If
' questo ulteriore controllo serve per sapere se siamo arrivati
' alla costruzione dell'intero percorso
A = ControllaCartella(Cartella)
Loop
End If
End Function
In questa Funzione c'è un blocco meritevole di ulteriore commento.
For Conta = LBound(Cartelle) To I
Cerca = Cerca & Cartelle(Conta) & "\"
Next
I = I + 1
Inizialmente, prima di entrare nel ciclo Do While ... Loop la variabile I sarà posta uguale ad una unità in più dell'indice inferiore della matrice che contiene tutte le cartelle ce debbono essere presenti nel percorso (D:\Nuova cartella\contatti\ditte_territorio\mia_cartella):
Il blocco sopra menzioneto crea queste stringhe che saranno processate dalla funzione ControllaCartella
Ma passiamo ora alla routine che è deputata a chiamare quest'ultima Funzione e ad effettuare il salvataggio della cartella.
Sub SalvaCartella()
Dim Nome As String, NuovoFile, Percorso As String
Dim QuestoPercorso As String
Nome = ThisWorkbook.Name
Percorso = "D:\Nuova cartella\contatti\ditte_territorio\mia_cartella"
' chiamiamo la funzione che controlla se il percorso indicato esiste
' e che lo costruisce in caso negativo
CreaCartellaSeNonEsiste (Percorso)
NuovoFile = "Nome che vuoi"
Application.DisplayAlerts = False
' finalmente, questo è il salvataggio del file
ActiveWorkbook.SaveAs filename:=Percorso & "\" & NuovoFile & ".xls"
Application.DisplayAlerts = True
End Sub
Con questo pare che posso concludere.