Gestione files

Ultima modifica: 28-05-2016

 

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.

 

Controllare se una cartella o un intero percorso esiste

  1. Creo una funzione destinata a leggere sul disco il percorso da me scelto
  2. se il percorso esiste mi restituisce un valore di tipo boolean: True
  3. in caso contrario mi restituisce lo stesso valore di tipo boolean: False

Function ControllaCartella(DirName As String) As Boolean
On Error Resume Next
ControllaCartella = GetAttr(DirName) And vbDirectory
On error GoTo 0
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

 

Controllare se un file esiste

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
On error GoTo 0
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

 

Due alternative alle funzioni appena mostrate:

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

 

Alcune note sui due metodi di leggere la cartella o il file

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

 

Lettura e scrittura delle proprietà del file

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

 

Cercare una cartella e, se non c'è, crearla

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:
  1. controllare se la cartella esiste
  2. se esiste è sufficiente eseguire direttamente il salvataggio del file
  3. se non esiste occorre controllare che esista qualche cartella di livello superiore e partire da questa per aggiungere via via le cartelle di livello inferiore fino ad arrivare ad aggiungere la cartella desiderata
  4. fatto questo è possibile salvare il file nella posizione desiderata

Vediamo ora come procedere.

  1. Abbiamo già la funzione che controlla se la cartella esiste
  2. Creiamo perciò una nuova funzione che, aiutata dalla funziome ControllaCartella, e la chiamiamo CreaCartellaSeNonEsiste
  3. Creiamo la routine che esegua il salvataggio della cartella nel percorso desiderato

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
On error GoTo 0
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):

  1. D:
  2. Nuova cartella
  3. contatti
  4. ditte_territorio
  5. 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.