- Utilizzare il FileSystemObject (FSO) in Excel VBA
- Creazione di un FileSystemObject
- Utilizzando i metodi ‘Exists’
- Utilizzando i metodi ‘Get’
- GetAbsolutePathname
- GetBaseName
- GetDriveName
- GetExtensionName
- GetFile
- GetFolder
- GetParentFolderName
- Utilizzando i metodi ‘Create’
- CreateFolder
- CreateTextFile
- Utilizzando i metodi ‘Copy’
- CopyFile
- CopyFolder
- Utilizzando i metodi ‘Move’
- MoveFile
- MoveFolder
- Utilizzando i metodi ‘Delete’
- DeleteFile
- DeleteFolder
- Altri metodi nell’FSO
- OpenAsTextStream.
- BuildPath
- OpenTextFile
- Proprietà dell’FSO
- Drives
- Name
- Path
- Size
- Type
Utilizzare il FileSystemObject (FSO) in Excel VBA
Il FileSystemObject (FSO) ti dà accesso a un’intera gamma di funzioni per accedere al file system del tuo computer. Usando questo oggetto, puoi facilmente accedere a file, cartelle e unità, e anche leggere e scrivere su file.
Molte delle funzioni FSO potrebbero essere scritte da te nel VBA tradizionale, ma richiederebbero più codice, e sarebbero più difficili da mantenere e capire per uno sviluppatore in arrivo. L’FSO è un’API (Application Programming Interface) provata e testata ed è più affidabile del vostro codice. È facile da usare e pronto e disponibile.
L’FSO funziona secondo gli standard internazionali e le impostazioni che hai sul tuo computer. Se state distribuendo la vostra applicazione Excel a livello globale, l’uso dell’FSO si prenderà cura di qualsiasi differenza di impostazioni tra i paesi, cosa che il vostro codice avrebbe problemi a fare.
L’FSO vi permetterà di fare quasi tutto nel codice VBA che potreste fare in Esplora file di Windows. Ti dà accesso completo al file system di Windows.
Creazione di un FileSystemObject
Il FileSytemObject non fa parte di Excel VBA. Puoi usare il FSO creando un oggetto (late binding) in VBA:
Sub CreateFSO()Set MyFSO = CreateObject("Scripting.FileSystemObject")End Sub
In alternativa, puoi aggiungere un riferimento in VBA per la libreria FSO. Questo è chiamato early binding ed è più veloce del late binding, poiché l’oggetto non deve essere creato quando il tuo codice viene eseguito.
Per aggiungere un riferimento, devi premere Alt-F11 per entrare nel Visual Basic Editor (VBE), e poi usare ‘Tools|References’ dal menu VBE. Questo visualizzerà una finestra pop-up per selezionare il riferimento pertinente (vedi sotto).
Scorri l’elenco dei riferimenti disponibili fino a quando non vedi ‘Microsoft Scripting Runtime’. Spunta la casella e clicca su OK, e la libreria è ora parte della tua applicazione.
La posizione del file della libreria DLL è C:\Windows\SysWOW64\scrrun.dll
Se stai distribuendo la tua applicazione ad altri colleghi o luoghi, è essenziale che essi abbiano questo file nella posizione corretta sul loro computer, altrimenti il tuo codice andrà in errore.
Va bene mettere una trappola di errore sull’evento ‘WorkbookOpen’ usando il comando Dir per controllare che il file esista. Se è assente, allora date un messaggio di avvertimento e chiudete il file Excel.
Una volta aggiunto il riferimento, potete usare il seguente codice per creare l’FSO:
Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Tutti gli esempi in questo articolo useranno questa metodologia per creare l’FSO.
L’FSO ha molti metodi e proprietà disponibili. Questi sono qui divisi in sezioni secondo quello che possono fare.
Utilizzando i metodi ‘Exists’
Puoi usare un metodo FSO per controllare se un’unità, una cartella o un file esiste. Questi metodi sono facili da usare e richiedono solo un parametro.
Sub CheckExistance()Dim MyFSO As New FileSystemObjectMsgBox MyFSO.DriveExists("C:")MsgBox MyFSO.FolderExists("C:\temp\")MsgBox MyFSO.FileExists("C:\temp\testfile.txt")End Sub
Queste dichiarazioni restituiranno tutte ‘True’ assumendo che il vostro computer abbia un’unità C:, una cartella su di essa chiamata ‘Temp’ e un file nella cartella Temp chiamato ‘testfile.txt’
Le stringhe di testo nei parametri non sono sensibili alle maiuscole. Non potete usare caratteri jolly in nessuno di questi metodi.
Non potete nemmeno usare URL (Uniform Resource Locators) per descrivere la posizione di una cartella o di un file. L’FSO lavora esclusivamente sul sistema operativo Windows e sul file system ivi presente. Per la posizione di un server esterno, devi prima mappare un’unità, e poi usare il percorso dell’unità stessa.
Utilizzando i metodi ‘Get’
L’FSO ha numerosi metodi per ottenere informazioni sul file e sul percorso, sia dividendo il percorso e il file, sia ottenendo informazioni sul file o sulla cartella come la data di creazione o di modifica.
GetAbsolutePathname
Questo fornirà un percorso completo dalla radice dell’unità specificata.
La sintassi è:
GetAbsolutePathName (pathspec)
Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:..."MsgBox MyFSO.GetAbsolutePathName(Pth)End Sub
Questo restituirà una stringa ‘C:\Users\Richard\Documents’. Questo perché il percorso è stato specificato come C: seguito da tre punti. Ogni punto indica un livello successivo nella struttura della cartella.
GetBaseName
Questo restituisce il nome di un file o di una cartella specificata.
La sintassi è:
GetBaseName (path)
Sub BaseName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetBaseName(Pth)End Sub
Questo codice restituirà ‘testfile’. Il metodo restituisce l’ultima sezione del nome del percorso. Se è un file, allora non restituisce il suffisso del file.
Se il percorso non può essere trovato, allora verrà restituita una stringa vuota.
GetDrive
Questo vi permette di usare il codice per accedere alle informazioni sull’unità, in base alla lettera dell’unità specificata.
La sintassi è:
GetDrive (drivespec)
Sub DriveInfo()Dim MyFSO As New FileSystemObject, Pth As String, Dr As DrivePth = "C:"Set Dr = MyFSO.GetDrive(Pth)MsgBox Dr.FreeSpaceEnd Sub
Questo metodo restituisce un oggetto drive basato sul drive specificato. Puoi usare questo oggetto per accedere alle informazioni sull’unità, come lo spazio libero disponibile.
GetDriveName
Questo metodo separerà il nome dell’unità da una stringa percorso/nome file.
La sintassi è:
GetDriveName (percorso)
Sub DriveName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)End Sub
Questo restituirà ‘C:’
GetExtensionName
Questo restituirà il suffisso del file nel percorso specificato.
La sintassi è:
GetExtensionName (path)
Sub ExtensionName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)End Sub
Questo restituirà ‘txt’.
Se nessun file è specificato, allora sarà restituita una stringa vuota.
GetFile
Questo metodo restituisce un oggetto file, che contiene varie informazioni sul file stesso.
La sintassi è:
GetFile (filespec)
Sub FileInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fn As FilePth = "C:\temp\testfile.txt"Set Fn = MyFSO.GetFile(Pth)MsgBox Fn.DateCreatedEnd Sub
Torna la data e l’ora di creazione del file specificato. Se nessun file è specificato o il file non esiste, si otterrà un errore ‘file not found’.
Sub FileName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)End Sub
Questo restituirà ‘testfile.txt’.
GetFolder
Questo crea un oggetto cartella per la cartella base nel percorso specificato. Il percorso deve contenere solo nomi di cartelle. Nessun nome di file deve essere incluso, altrimenti si verificherà un errore.
La sintassi è:
GetFolder (folderspec)
Sub FolderInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)MsgBox Fo.DateCreatedEnd Sub
L’oggetto cartella ha varie informazioni in esso a cui si può accedere. In questo caso, restituisce la data in cui la cartella è stata creata.
Puoi anche usare questo metodo per recuperare tutti i nomi dei file all’interno di una data cartella:
Sub FileNames()Dim MyFSO As New FileSystemObject, Pth As String, Fo As Folder, Fn As FilePth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)For Each Fn In Fo.Files MsgBox Fn.NameNext FnEnd Sub
Questo codice itererà attraverso la cartella ‘Temp’ e mostrerà ogni nome di file trovato.
GetParentFolderName
Questo metodo restituirà il nome della cartella nel livello successivo nella gerarchia delle cartelle.
La sintassi è:
GetParentFolderName (path)
Sub FolderName()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\users\richard"MsgBox MyFSO.GetParentFolderName(Pth)End Sub
Questo restituirà ‘Users’ poiché questo è il ‘genitore’ della cartella ‘richard’.
Utilizzando i metodi ‘Create’
Con l’UST potete creare una nuova cartella e un nuovo percorso e creare un file di testo.
CreateFolder
Potete specificare un nuovo nome di percorso della cartella da creare. Un pericolo di questo è che se la cartella esiste già, allora si verificherà un errore. Puoi usare il metodo ‘FolderExists’ per assicurarti che questo non accada.
La sintassi è:
CreateFolder (foldername)
Sub CreateNewFolder()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\MyFolder"If MyFSO.FolderExists(Pth) = False Then MyFSO.CreateFolder (Pth)End IfEnd Sub
Questo codice creerà una nuova cartella chiamata ‘MyFolder’ nel percorso esistente ‘C:\temp’.
CreateTextFile
Questo metodo permette di creare un semplice file di testo e di scriverci dentro direttamente.
La sintassi è:
CreateTextFile (filename, ])
Sub CreateTextFile()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\Myfile.txt"Set Fn = MyFSO.CreateTextFile(Pth,True)Fn.Write "Add my own text here" & vbLf & "This is the second line"Fn.CloseEnd Sub
Questo codice crea un file di testo chiamato ‘Myfile.txt’ nella cartella ‘Temp’ del drive ‘C:’ e poi vi scrive due righe di testo.
Nota che un carattere di avanzamento riga viene concatenato nella stringa scritta.
Se il percorso in cui stai scrivendo non esiste, si verificherà un errore. Puoi usare il metodo ‘FolderExists’ per controllarlo prima di creare il file.
C’è un parametro opzionale per sovrascrivere il file esistente se necessario – questo può essere True o False. L’impostazione predefinita è True.
Utilizzando i metodi ‘Copy’
Puoi usare questi metodi per copiare un file o una cartella in un’altra posizione.
CopyFile
Questo metodo copierà un file da una posizione della cartella ad un’altra. Nota che la copia fallirà se la posizione di destinazione ha l’attributo di sola lettura impostato.
La sintassi è:
CopyFile source, destination,
Sub CopyFile()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueEnd Sub
Questo codice farà una copia di tutti i file di testo (txt) in ‘C:\temp’ in ‘C:\temp\myfolder\’, sovrascrivendo il file dove necessario. L’impostazione predefinita per Overwrite è True.
Puoi usare un asterisco (*) come carattere jolly per i nomi dei file, ma non puoi usare un punto interrogativo (?) per rappresentare singoli caratteri.
CopyFolder
Puoi usare questo metodo per copiare un’intera cartella da una posizione all’altra.
La sintassi è:
CopyFolder source, destination,
Sub CopyFolder()Dim MyFSO As New FileSystemObjectMyFSO.CopyFolder "C:\temp\*", "C:\users\richard\"End Sub
Questo codice copia tutte le cartelle e i file sotto ‘C:\temp’ in ‘C:\users\richard’. La nuova cartella creata sarà ‘C:\users\richard\myfolder’ poiché ‘C:\temp’ aveva una cartella al suo interno chiamata ‘myfolder’.
Ci sono quattro possibili risultati quando si usa questo metodo:
- Se la destinazione non esiste, allora viene copiata la cartella sorgente e il contenuto.
- Se la destinazione esiste già, allora si verifica un errore.
- Se la destinazione è una cartella, allora viene copiata la cartella sorgente e il suo contenuto. Si verifica un errore se Overwrite è impostato su False e c’è già una copia di un file nella destinazione.
- Se la destinazione è impostata in sola lettura, si verifica un errore se overwrite è impostato su false.
Questo metodo si ferma al primo errore che incontra. Non vi è alcun rollback di qualsiasi azione che abbia avuto successo prima che si verifichi l’errore.
Utilizzando i metodi ‘Move’
Questi metodi possono essere usati per spostare file o cartelle in altre posizioni. Questo è lo stesso che tagliare da una posizione e incollare in un’altra posizione. Nota che se il file da spostare è aperto, allora il metodo Move fallirà con un errore.
MoveFile
Questo metodo è usato per spostare un file specifico in un’altra posizione. I caratteri jolly sono permessi nell’ultimo componente del percorso della sorgente.
La sintassi è:
MoveFile sorgente, destinazione
Sub MoveAFile()Dim MyFSO As New FileSystemObjectMyFSO.MoveFile "C:\temp\*", "C:\temp\myfolder"End Sub
Questo codice sposta tutti i file trovati in ‘C:\temp’ in ‘C:\temp\myfolder’.
Le cartelle di origine e di destinazione devono esistere, poiché la cartella di destinazione non viene creata automaticamente.
Questo metodo si ferma al primo errore che incontra. Non c’è alcun rollback di qualsiasi azione che abbia avuto successo prima che si verifichi l’errore.
MoveFolder
Questo metodo sposta una cartella specifica da una posizione ad un’altra.
La sintassi è:
MoveFolder (source, destination)
Sub MoveAFolder()Dim MyFSO As New FileSystemObjectMyFSO.MoveFolder "C:\temp\myfolder", "C:\temp\mydestination"End Sub
Questo codice sposta la cartella ‘myfolder’ e i contenuti nella cartella ‘mydestination’. La ‘myfolder’ viene effettivamente cancellata e viene creata ‘mydestination’, insieme al contenuto di ‘myfolder’.
Se la cartella di destinazione esiste già, si verifica un errore.
Utilizzando i metodi ‘Delete’
Questi metodi sono usati per cancellare file o cartelle. Devono essere usati con cautela perché non ci sono metodi di rollback o annullamento se qualcosa va storto.
DeleteFile
Questo elimina singoli file o un gruppo di file usando i caratteri jolly.
La sintassi è:
DeleteFile filespec,
Sub DeleteFiles()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C:\temp\*"End Sub
Questo codice cancellerà tutti i file nella cartella ‘C:\temp’
Il parametro Force è opzionale ed è impostato su True o False. Se è impostato su True, allora i file di sola lettura saranno cancellati. Il default è False.
DeleteFolder
Questo metodo cancella una cartella specificata e il suo contenuto.
La sintassi è:
DeleteFolder folderspec,
Sub DeleteFolders()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFolder "C:\temp\MyDestination"End Sub
Questo codice cancellerà la cartella ‘MyDestination’ e tutti i file all’interno di quella cartella. La cartella ‘temp’ rimarrà.
Il parametro Force è opzionale e viene impostato su True o False. Se è impostato su True, le cartelle di sola lettura saranno cancellate. L’impostazione predefinita è False.
Possono essere usati caratteri jolly nell’ultimo componente del percorso. Se la cartella non viene trovata, si verificherà un errore.
Questo metodo si ferma al primo errore che incontra. Non c’è alcun rollback delle azioni che hanno avuto successo prima che si verifichi l’errore.
Altri metodi nell’FSO
OpenAsTextStream.
Questo metodo apre un file specificato come un oggetto Text Stream e permette di leggerlo o scriverlo. Il vantaggio di questo metodo è che può aprire qualsiasi tipo di file ed estrarre il testo disponibile.
La sintassi è:
OpenAsTextStream (])
Il parametro ‘iomode’ permette la sola lettura (1), lettura/scrittura (2), e l’aggiunta (8). Il parametro read/write sovrascrive il file.
Il parametro ‘format’ è impostato a -2 per il default di sistema, -1 per aprire il file come Unicode, e 0 per aprire il file come ASCII (American Standard Code for Information Interchange).
Sub TextStream()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")Set ts = f.OpenAsTextStream(2)ts.Write "My new text"ts.CloseSet ts = f.OpenAsTextStream(1)s = ts.ReadLineMsgBox sts.CloseEnd Sub
Questo codice ottiene un file di testo esistente e lo crea come oggetto usando il metodo ‘GetFile’. Poi apre il flusso di testo in lettura/scrittura (2) e scrive una riga di testo. Il file viene poi chiuso e riaperto come read (1) e viene letta una riga da esso, che viene poi visualizzata come casella di messaggio.
Nota che la riga letta deve essere messa in una variabile prima che possa essere visualizzata in una casella di messaggio.
BuildPath
Questo metodo aggiungerà un nome di cartella o di file alla fine di un percorso di cartella esistente. Questo crea solo una stringa di testo e non crea effettivamente la nuova cartella.
La sintassi è:
BuildPath (path, name)
Sub BuildPth()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npEnd Sub
Questo mostrerà ‘C:\temp\ANewFolder’. Tuttavia, se vuoi usare effettivamente questa cartella, devi usare il metodo ‘CreateFolder’.
OpenTextFile
Questo metodo permette di aprire file e leggere o scrivere secondo i parametri impostati. Funziona in modo simile al metodo OpenAsTextStream.
La sintassi è:
OpenTextFile (filename, ]])
Il parametro ‘iomode’ permette ForReading, ForWriting e ForAppending. Il parametro ForWriting sovrascrive il file.
Il parametro ‘create’ è un valore booleano. True significa che verrà creato un nuovo file se il nome del file specificato non esiste. False significa che nessun file verrà creato se il nome del file non viene trovato. Il default è False.
Il parametro ‘format’ può essere impostato su TristateFalse, TristateMixed, TristateTrue, e TristateUseDefault a seconda che il file sia ASCII o Unicode.
Sub OpenTxtFile()Dim MyFSO As New FileSystemObjectSet ts = MyFSO.OpenTextFile("C:\temp\myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.CloseEnd Sub
Questo codice leggerà una riga dal file di testo ‘myfile.txt’.
Un vantaggio che il metodo OpenTextFile ha rispetto a OpenAsTextStreamMethod è che ha dei drop down per i parametri, che sono più significativi che cercare di ricordare i valori numerici appropriati per le varie opzioni dei parametri.
Proprietà dell’FSO
Drives
Questa proprietà contiene una collezione di unità disponibili sul vostro computer.
Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveSet Dr = MyFSO.DrivesFor Each d In Dr MsgBox d.DriveLetterNext dEnd Sub
Questo codice restituirà ogni lettera di unità disponibile sul tuo computer.
Name
Questo restituisce il nome di un file o di una cartella specificata.
Sub NameExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub
Questo codice darà il nome del file e le informazioni su di esso usando la proprietà Drive.
Path
La proprietà Path separerà il percorso da una specifica file.
Sub PathExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Path & f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub
Questo esempio funziona allo stesso modo dell’esempio Name, eccetto che ora fornisce il percorso del file.
Size
La proprietà Size darà la dimensione di una cartella o di un file.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeEnd Sub
Questo codice sopra restituirà la dimensione della cartella ‘C:\temp\’.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeEnd Sub
Questo codice sopra restituirà la dimensione del file ‘myfile.txt’.
Type
La proprietà type restituirà il testo per il tipo di file o cartella.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeEnd Sub
Questo codice sopra restituirà il testo ‘File folder’.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeEnd Sub
Questo codice sopra restituirà il testo ‘Text document’.
Nota l’uso di ‘GetFolder’ e ‘GetFile’ in ogni esempio.