Quando usiamo VBA in Excel, la maggior parte è per automatizzare i nostri compiti.
Questo significa anche che la maggior parte del tempo, lavoriamo con celle e intervalli, fogli di lavoro, cartelle e altri oggetti che fanno parte dell’applicazione Excel.
Ma VBA è molto più potente e può essere usato anche per lavorare con oggetti al di fuori di Excel.
In questo tutorial, ti mostrerò come usare VBA FileSystemObject (FSO) per lavorare con file e cartelle sul tuo sistema o unità di rete.
Questo tutorial copre:
Cos’è VBA FileSystemObject (FSO)?
FileSystemObject (FSO) ti permette di accedere al file system del tuo computer. Usandolo, puoi accedere e modificare i file/cartelle/directory nel tuo sistema informatico.
Per esempio, qui sotto ci sono alcune delle cose che puoi fare usando FileSystemObject in Excel VBA:
- Controlla se un file o una cartella esiste.
- Crea o rinomina cartelle/file.
- Ottieni una lista di tutti i nomi dei file (o nomi di sottocartelle) in una cartella.
- Copia i file da una cartella all’altra.
Spero che abbiate capito l’idea.
Coprirò tutti questi esempi (più altri) più avanti in questo tutorial.
Sebbene alcune delle cose menzionate sopra possano essere fatte anche usando funzioni VBA tradizionali (come la funzione DIR) e metodi, ciò porterebbe a codici più lunghi e complicati. FileSystemObject rende facile lavorare con file e cartelle mantenendo il codice pulito e breve.
Note: FSO can only be used in Excel 2000 and later versions.
A quali oggetti si può accedere tramite FileSystemObject?
Come ho detto sopra, puoi accedere e modificare file e cartelle usando il FileSystemObject in VBA.
Di seguito c’è una tabella che mostra gli oggetti più importanti a cui puoi accedere e modificare usando FSO:
Object | Description |
Drive | Drive Object ti permette di ottenere informazioni sull’unità come se esiste o meno, il suo nome di percorso, il tipo di unità (rimovibile o fissa), le sue dimensioni, ecc. |
Folder | L’oggettoFolder ti permette di creare o modificare le cartelle nel tuo sistema. Per esempio, puoi creare, cancellare, rinominare, copiare cartelle usando questo oggetto. |
File | L’oggetto File ti permette di lavorare con i file nel tuo sistema. Per esempio, puoi creare, aprire, copiare, spostare e cancellare file usando questo oggetto. |
TextStream | L’oggetto TextStream ti permette di creare o leggere file di testo. |
Ognuno degli oggetti di cui sopra ha dei metodi che puoi usare per lavorare con questi.
Per farti un esempio, se vuoi cancellare una cartella, userai il metodo DeleteFolder dell’oggetto Folder. Allo stesso modo, se volete copiare un file, userete il metodo CopyFile dell’oggetto File.
Non preoccupatevi se tutto questo vi sembra travolgente o difficile da capire. Avrai una comprensione molto migliore quando passerai attraverso gli esempi che ho trattato in questo tutorial.
Solo a scopo di riferimento, ho coperto tutti i metodi di FileSystemObject (per ogni oggetto) alla fine di questo tutorial.
Abilitare FileSystemObject in Excel VBA
FileSystemObject non è disponibile di default in Excel VBA.
Siccome abbiamo a che fare con file e cartelle che sono fuori dall’applicazione Excel, dobbiamo prima creare un riferimento alla libreria che contiene questi oggetti (unità, file, cartelle).
Ora ci sono due modi per iniziare a usare FileSystemObject in Excel VBA:
- Impostare il riferimento alla Microsoft Scripting Runtime Library (Scrrun.dll)
- Creare un oggetto per fare riferimento alla libreria dal codice stesso
Mentre entrambi questi metodi funzionano (e ti mostrerò come farlo dopo), ti consiglio di usare il primo metodo.
Impostazione del riferimento alla Microsoft Scripting Runtime Library
Quando crei un riferimento alla Scripting Runtime Library, permetti a Excel VBA di accedere a tutte le proprietà e i metodi di file e cartelle. Una volta fatto questo, puoi fare riferimento all’oggetto file/cartelle/guide dall’interno di Excel VBA (proprio come puoi fare riferimento alle celle, ai fogli di lavoro o alle cartelle di lavoro).
Di seguito i passi per creare un riferimento alla Microsoft Scripting Runtime Library:
- Nell’editor VB, clicca su Strumenti.
- Clicca su References.
- Nella finestra di dialogo References che si apre, scorri i riferimenti disponibili e seleziona l’opzione ‘Microsoft Scripting Runtime’.
- Clicca OK.
I passi precedenti ti permettono ora di fare riferimento agli oggetti FSO da Excel VBA.
Creare un’istanza di FileSystemObject nel codice
Una volta impostato il riferimento alla libreria Scripting FileSystemObject, devi creare un’istanza dell’oggetto FSO nel tuo codice.
Una volta creata, potete usarla in VBA.
Di seguito il codice che imposterà la variabile oggetto MyFSO come un oggetto FileSystemObject:
Sub CreatingFSO()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectEnd Sub
In questo codice, prima ho dichiarato la variabile MyFSO come un oggetto di tipo FileSystemObject. Questo è possibile solo perché ho creato un riferimento alla Microsoft Scripting Runtime Library. Se il riferimento non viene creato, questo vi darà un errore (poiché Excel non riconoscerebbe il significato di FileSystemObject).
Nella seconda linea, accadono due cose:
- La parola chiave NEW crea un’istanza di FileSystemObject. Questo significa che ora posso usare tutti i metodi di FileSystemObject per lavorare con file e cartelle. Se non create questa istanza, non sarete in grado di accedere ai metodi di FSO.
- La parola chiave SET imposta l’oggetto MyFSO su questa nuova istanza di FileSystemObject. Questo mi permette di usare questo oggetto per accedere a file e cartelle. Per esempio, se ho bisogno di creare una cartella, posso usare il metodo MyFSO.CreateFolder.
Se vuoi, puoi anche combinare le due dichiarazioni di cui sopra in una sola come mostrato di seguito:
Sub CreatingFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Un grande vantaggio di usare questo metodo (che è quello di impostare il riferimento alla Microsoft Scripting Runtime Library) è che quando usi gli oggetti FSO nel tuo codice, potrai usare la funzione IntelliSense che mostra i metodi e le proprietà associate a un oggetto (come mostrato di seguito).
Questo non è possibile quando si crea il riferimento dall’interno del codice (trattato dopo).
Creare un oggetto dal codice
Un altro modo per creare un riferimento a FSO è farlo dal codice. In questo metodo, non avete bisogno di creare alcun riferimento (come fatto nel metodo precedente).
Quando state scrivendo il codice, potete creare un oggetto dall’interno del codice e fare riferimento allo Scripting.FileSystemObject.
Il codice seguente crea un oggetto FSO e poi lo rende di tipo FileSystemObject.
Sub FSODemo()Dim FSO As ObjectSet FSO = CreateObject("Scripting.FileSystemObject")End Sub
Anche se questo può sembrare più conveniente, un grande svantaggio dell’uso di questo metodo è che non mostrerebbe un IntelliSense quando si lavora con oggetti in FSO. Per me, questo è un enorme svantaggio e consiglio sempre di usare il metodo precedente per abilitare FSO (che è impostando il riferimento al ‘Microsoft Scripting Runtime’)
Esempi di VBA FileSystemObject
Ora immergiamoci e diamo un’occhiata ad alcuni esempi pratici di utilizzo di FileSystemObject in Excel.
Esempio 1: Controllare se un file o una cartella esiste
Il seguente codice controllerà se la cartella con il nome ‘Test’ esiste o meno (nella posizione specificata).
Se la cartella esiste, la condizione IF è vera e mostra un messaggio – ‘La cartella esiste’ in una casella di messaggio. E se non esiste, mostra un messaggio – The Folder Does Not Exist’.
Sub CheckFolderExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Exists"Else MsgBox "The Folder Does Not Exist"End IfEnd Sub
Similmente, potete anche controllare se un file esiste o no.
Il codice seguente controlla se c’è un file con il nome Test.xlsx nella cartella specificata o no.
Sub CheckFileExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FileExists("C:\Users\sumit\Desktop\Test\Test.xlsx") Then MsgBox "The File Exists"Else MsgBox "The File Does Not Exist"End IfEnd Sub
Esempio 2: Creare una nuova cartella nella posizione specificata
Il codice seguente creerebbe una cartella con il nome ‘Test’ nell’unità C del mio sistema (dovrai specificare il percorso sul tuo sistema dove vuoi creare la cartella).
Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectMyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End Sub
Mentre questo codice funziona bene, mostrerebbe un errore nel caso in cui la cartella esista già.
Il codice seguente controlla se la cartella esiste già e crea una cartella se non esiste. Nel caso in cui la cartella esista già, mostra un messaggio. Per controllare se la cartella esiste, ho usato il metodo FolderExists dell’UST.
Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Already Exist"Else MyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End IfEnd Sub
Esempio 3: Ottenere una lista di tutti i file in una cartella
Il codice seguente mostra i nomi di tutti i file nella cartella specificata.
Sub GetFileNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MyFile In MyFolder.Files Debug.Print MyFile.NameNext MyFileEnd Sub
Questo codice è un po’ più complesso di quelli che abbiamo già visto.
Come ho detto sopra in questo tutorial, quando si fa riferimento alla ‘Microsoft Scripting Runtime Library’, è possibile utilizzare FileSystemObject così come tutti gli altri oggetti (come File e Cartelle).
Nel codice sopra, uso tre oggetti – FileSystemObject, File e Cartella. Questo mi permette di passare attraverso ogni file nella cartella specificata. Uso poi la proprietà name per ottenere la lista di tutti i nomi dei file.
Nota che sto usando Debug.Print per ottenere i nomi di tutti i file. Questi nomi saranno elencati nella finestra immediata nell’editor VB.
Esempio 4: Ottenere l’elenco di tutte le sottocartelle in una cartella
Il codice seguente darà i nomi di tutte le sottocartelle nella cartella specificata. La logica è esattamente la stessa dell’esempio precedente. Invece di file, in questo codice, abbiamo usato sottocartelle.
Sub GetSubFolderNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderDim MySubFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MySubFolder In MyFolder.SubFolders Debug.Print MySubFolder.NameNext MySubFolderEnd Sub
Esempio 5: Copiare un file da un posto ad un altro
Il codice sotto copierà il file dalla cartella ‘Source’ e lo copierà nella cartella ‘Destination’.
Sub CopyFile()Dim MyFSO As FileSystemObjectDim SourceFile As StringDim DestinationFolder As StringSet MyFSO = New Scripting.FileSystemObjectSourceFile = "C:\Users\sumit\Desktop\Source\SampleFile.xlsx"DestinationFolder = "C:\Users\sumit\Desktop\Destination"MyFSO.CopyFile Source:=SourceFile, Destination:=DestinationFolder & "\SampleFileCopy.xlsx"End Sub
Nel codice sopra, ho usato due variabili – SourceFile e DestinationFolder.
Source File contiene l’indirizzo del file che voglio copiare e la variabile DestinationFolder contiene l’indirizzo della cartella in cui voglio che il file venga copiato.
Nota che non è sufficiente dare il nome della cartella di destinazione quando copi un file. Devi anche specificare il nome del file. Puoi usare lo stesso nome del file o puoi anche cambiarlo. Nell’esempio precedente, ho copiato il file e l’ho chiamato SampleFileCopy.xlsx
Esempio 6: Copiare tutti i file da una cartella all’altra
Il codice seguente copierà tutti i file dalla cartella di origine alla cartella di destinazione.
Sub CopyAllFiles()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=FalseNext MyFileEnd Sub
Il codice qui sopra copierà tutti i file dalla cartella Source alla cartella Destination.
Nota che nel metodo MyFSO.CopyFile, ho specificato che la proprietà ‘Overwritefiles’ è False (questa è True per default). Questo fa sì che nel caso in cui il file sia già presente nella cartella, non venga copiato (e si vedrà un errore). Se rimuovi ‘Overwritefiles’ o lo imposti a True, nel caso in cui ci siano file nella cartella di destinazione con lo stesso nome, questi verrebbero sovrascritti.
Se vuoi copiare solo i file di una certa estensione, puoi farlo usando un’istruzione IF Then per controllare se l’estensione è xlsx o no.
Sub CopyExcelFilesOnly()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files If MyFSO.GetExtensionName(MyFile) = "xlsx" Then MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=False End IfNext MyFileEnd Sub
Metodi FileSystemObject (FSO)
Qui ci sono i metodi che puoi usare per ogni oggetto. Questo è solo a scopo di riferimento e non si preoccupa troppo. L’uso di alcuni di questi è stato mostrato negli esempi trattati sopra.
Metodi FSO | Per oggetto | Descrizione |
DriveExists | Drive | Controlla se il drive esiste o no |
GetDrive | Drive | Ritorna un’istanza dell’oggetto drive in base al percorso specificato |
GetDriveName | Drive | Richiede il nome del drive |
BuildPath | File/Folder | Genera un percorso da un percorso esistente e un nome |
CopyFile | File/Folder | Copia un file |
GetAbsolutePathName | File/Folder | Ritorna la rappresentazione canonica del percorso |
GetBaseName | File/Folder | Ritorna il nome base di un percorso. Per esempio, “D:\TestFolder\TestFile.xlsm” restituirà TextFile.xlsm |
GetTempName | File/Folder | Genera un nome che può essere usato per nominare un file temporaneo |
CopyFolder | Folder | Copia una cartella da una posizione a altro |
CreateFolder | Folder | Crea una nuova cartella |
DeleteFolder | Folder | Elimina la cartella specificata |
FolderExists | Folder | Controlla se la cartella esiste o no |
GetFolder | Folder | Ritorna un’istanza dell’oggetto cartella basata sul percorso specificato |
GetParentFolderName | Folder | Ritorna il nome della cartella padre in base al percorso specificato |
GetSpecialFolder | Folder | Ottiene la posizione di varie cartelle di sistema. |
MoveFolder | Folder | Muove una cartella da una posizione all’altra |
DeleteFile | File | Elimina un file |
FileExists | File | Controlla se un file esiste o no |
GetExtensionName | File | Ritorna l’estensione del file |
GetFile | File | Ritorna l’istanza di un file basato sul percorso specificato |
GetFileName | File | Ritorna il nome del file |
GetFileVersion | File | Ritorna la versione del file |
MoveFile | File | Muove un file |
CreateTextFile | File | Crea un file di testo |
GetStandardStream | File | Ricerca lo standard input, output o flusso di errore |
OpenTextFile | File | Apri un file come TextStream |
Ti potrebbero piacere anche i seguenti tutorial di Excel:
- Ottenere un elenco di nomi di file da cartelle & Sottocartelle (usando Power Query).
- Ottenere l’elenco dei nomi dei file da una cartella in Excel (con e senza VBA).
- Capire i tipi di dati di Excel VBA (variabili e costanti).
- Creare una funzione definita dall’utente (UDF) in Excel VBA.