Utilizzo di VBA FileSystemObject (FSO) in Excel - Panoramica ed esempi facili

Quando utilizziamo VBA in Excel, la maggior parte è per automatizzare le nostre attività.

Ciò significa anche che la maggior parte delle volte lavoriamo con celle e intervalli, fogli di lavoro, cartelle di lavoro e altri oggetti che fanno parte dell'applicazione Excel.

Ma VBA è molto più potente e può anche essere usato per lavorare con cose al di fuori di Excel.

In questo tutorial, ti mostrerò come utilizzare VBA FileSystemObject (FSO) per lavorare con file e cartelle sul tuo sistema o unità di rete.

Che cos'è VBA FileSystemObject (FSO)?

FileSystemObject (FSO) ti consente di accedere al file system del tuo computer. Usandolo, puoi accedere e modificare i file/cartelle/directory nel tuo sistema informatico.

Ad esempio, di seguito sono riportate alcune delle cose che puoi fare utilizzando FileSystemObject in Excel VBA:

  • Controlla se esiste un file o una cartella.
  • Crea o rinomina cartelle/file.
  • Ottieni un elenco di tutti i nomi di file (o nomi di sottocartelle) in una cartella.
  • Copia i file da una cartella all'altra.

Spero che tu renda l'idea.

Tratterò tutti questi esempi sopra (più altri) più avanti in questo tutorial.

Sebbene alcune delle cose sopra menzionate possano essere eseguite anche utilizzando le tradizionali funzioni VBA (come la funzione DIR) e metodi, ciò porterebbe a codici più lunghi e complicati. FileSystemObject semplifica il lavoro con file e cartelle mantenendo il codice pulito e breve.

Nota: FSO può essere utilizzato solo in Excel 2000 e versioni successive.

A quali oggetti puoi accedere tramite FileSystemObject?

Come accennato in precedenza, è possibile accedere e modificare file e cartelle utilizzando FileSystemObject in VBA.

Di seguito è riportata una tabella che mostra gli oggetti più importanti a cui è possibile accedere e modificare utilizzando FSO:

Oggetto Descrizione
Guidare Drive Object consente di ottenere informazioni sull'unità, ad esempio se esiste o meno, il nome del percorso, il tipo di unità (rimovibile o fissa), le dimensioni, ecc.
Cartella L'oggetto Cartella consente di creare o modificare cartelle nel sistema. Ad esempio, puoi creare, eliminare, rinominare, copiare cartelle utilizzando questo oggetto.
File File Object ti consente di lavorare con i file nel tuo sistema. Ad esempio, puoi creare, aprire, copiare, spostare ed eliminare file utilizzando questo oggetto.
TextStream L'oggetto TextStream consente di creare o leggere file di testo.

Ciascuno degli oggetti sopra ha metodi che puoi usare per lavorare con questi.

Per fare un esempio, se si desidera eliminare una cartella, si utilizzerà il metodo DeleteFolder dell'oggetto Folder. Allo stesso modo, se si desidera copiare un file, si utilizzerà il metodo CopyFile dell'oggetto File.

Non preoccuparti se questo sembra opprimente o difficile da capire. Avrai una comprensione molto migliore quando esaminerai gli esempi che ho trattato in questo tutorial.

Solo a scopo di riferimento, ho trattato tutti i metodi FileSystemObject (per ciascun oggetto) alla fine di questo tutorial.

Abilitazione di FileSystemObject in Excel VBA

FileSystemObject non è disponibile per impostazione predefinita nel VBA di Excel.

Poiché abbiamo a che fare con file e cartelle esterni all'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:

  1. Impostazione del riferimento alla libreria Microsoft Scripting Runtime (Scrrun.dll)
  2. Creazione di un oggetto per fare riferimento alla libreria dal codice stesso

Sebbene entrambi questi metodi funzionino (e ti mostrerò come farlo in seguito), ti consiglio di utilizzare il primo metodo.

Nota: quando abiliti FileSystemObject, puoi accedere a tutti gli oggetti in esso contenuti. Ciò include FileSystemObject, Drive, Files, Folders, ecc. In questo tutorial mi concentrerò principalmente su FileSystemObject.

Impostazione del riferimento alla libreria Microsoft Scripting Runtime

Quando crei un riferimento alla libreria di runtime di script, consenti a Excel VBA l'accesso a tutte le proprietà e i metodi di file e cartelle. Fatto ciò, puoi fare riferimento all'oggetto file/cartelle/unità dall'interno del VBA di Excel (proprio come puoi fare riferimento a celle, fogli di lavoro o cartelle di lavoro).

Di seguito sono riportati i passaggi per creare un riferimento a Microsoft Scripting Runtime Library:

  1. Nell'editor VB, fare clic su Strumenti.
  2. Fare clic su Riferimenti.
  3. Nella finestra di dialogo Riferimenti che si apre, scorrere i riferimenti disponibili e selezionare l'opzione "Microsoft Scripting Runtime".
  4. Fare clic su OK.

I passaggi precedenti ti permetterebbero ora di fare riferimento agli oggetti FSO da Excel VBA.

Creazione di un'istanza di FileSystemObject nel codice

Dopo aver impostato il riferimento alla libreria Scripting FileSystemObject, è necessario creare un'istanza dell'oggetto FSO nel codice.

Una volta creato, puoi usarlo in VBA.

Di seguito è riportato il codice che imposterà la variabile oggetto MyFSO come oggetto FileSystemObject:

Sub CreatingFSO() Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject End Sub

In questo codice, per prima cosa ho dichiarato la variabile MyFSO come oggetto di tipo FileSystemObject. Questo è possibile solo perché ho creato un riferimento alla libreria Microsoft Scripting Runtime. Se il riferimento non viene creato, questo ti darà un errore (poiché Excel non riconoscerebbe cosa significa FileSystemObject).

Nella seconda riga accadono due cose:

  1. La parola chiave NEW crea un'istanza di FileSystemObject. Ciò significa che ora posso utilizzare tutti i metodi di FileSystemObject per lavorare con file e cartelle. Se non crei questa istanza, non potrai accedere ai metodi di FSO.
  2. La parola chiave SET imposta l'oggetto MyFSO su questa nuova istanza di FileSystemObject. Ciò mi consente di utilizzare questo oggetto per accedere a file e cartelle. Ad esempio, se ho bisogno di creare una cartella, posso utilizzare il metodo MyFSO.CreateFolder.

Se lo desideri, puoi anche combinare le due affermazioni precedenti in una come mostrato di seguito:

Sub CreatingFSO() Dim MyFSO As New FileSystemObject End Sub

Un grande vantaggio dell'utilizzo di questo metodo (ovvero impostare il riferimento alla libreria Microsoft Scripting Runtime) è che quando si utilizzano gli oggetti FSO nel codice, sarà possibile utilizzare la funzionalità IntelliSense che mostra i metodi e le proprietà associati a un oggetto (come mostrato di seguito).

Ciò non è possibile quando si crea il riferimento all'interno del codice (trattato di seguito).

Creazione di un oggetto dal codice

Un altro modo per creare un riferimento a FSO è farlo dal codice. In questo metodo, non è necessario creare alcun riferimento (come nel metodo precedente).

Quando si scrive il codice, è possibile creare un oggetto all'interno del codice e fare riferimento a Scripting.FileSystemObject.

Il codice seguente crea un oggetto FSO e quindi lo rende un tipo FileSystemObject.

Sub FSODemo() Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") End Sub

Sebbene ciò possa sembrare più conveniente, un grosso svantaggio dell'utilizzo di questo metodo è che non mostrerebbe un IntelliSense quando si lavora con oggetti in FSO. Per me, questo è un enorme aspetto negativo e consiglio sempre di utilizzare il metodo precedente per abilitare FSO (ovvero impostando il riferimento a "Microsoft Scripting Runtime")

Esempi di FileSystemObject VBA

Ora tuffiamoci e diamo un'occhiata ad alcuni esempi pratici di utilizzo di FileSystemObject in Excel.

Esempio 1: verifica se esiste un file o una cartella

Il codice seguente verificherà se la cartella con il nome "Test" esiste o meno (nella posizione specificata).

Se la cartella esiste, la condizione IF è True e mostra un messaggio - "La cartella esiste" in una finestra di messaggio. E se non esiste, mostra un messaggio - La cartella non esiste'.

Sub CheckFolderExist() Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "La cartella esiste" Else MsgBox "La cartella non esiste" End If End Sub

Allo stesso modo, puoi anche controllare se un file esiste o meno.

Il codice seguente controlla se nella cartella specificata è presente o meno un file con il nome Test.xlsx.

Sub CheckFileExist() Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FileExists("C:\Users\sumit\Desktop\Test\Test.xlsx") Then MsgBox "Il file esiste" Else MsgBox "Il file non esiste " End If End 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 in cui desideri creare la cartella).

Sub CreateFolder() Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject MyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test") End Sub

Sebbene questo codice funzioni correttamente, mostrerebbe un errore nel caso in cui la cartella esista già.

Il codice seguente controlla se la cartella esiste già e crea una cartella in caso contrario. Nel caso in cui la cartella esista già, mostra un messaggio. Per verificare se la cartella esiste, ho usato il Metodo FolderExists dell'UST.

Sub CreateFolder() Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "La cartella esiste già" Else MyFSO.CreateFolder ("C:\Users\ sumit\Desktop\Test") End If End Sub

Esempio 3: ottenere un elenco di tutti i file in una cartella

Il codice seguente mostrerebbe i nomi di tutti i file nella cartella specificata.

Sub GetFileNames() Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test") Per ogni MyFile in MyFolder.Files Debug.Print MyFile.Name Next MyFile End Sub

Questo codice è un po' più complesso di quelli che abbiamo già visto.

Come accennato in precedenza in questo tutorial, quando fai riferimento alla "Microsoft Scripting Runtime Library", puoi utilizzare FileSystemObject e tutti gli altri oggetti (come File e cartelle).

Nel codice sopra, utilizzo tre oggetti: FileSystemObject, File e Folder. Questo mi permette di esaminare ogni file nella cartella specificata. Quindi uso la proprietà name per ottenere l'elenco di tutti i nomi di file.

Nota che sto usando Debug.Print per ottenere i nomi di tutti i file. Questi nomi verranno 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. Al posto dei file, in questo codice, abbiamo usato delle sottocartelle.

Sub GetSubFolderNames() Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Dim MySubFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test") per ogni MySubFolder In MyFolder.SubFolders Debug.Print MySubFolder.Name Next MySubFolder End Sub

Esempio 5: copiare un file da un luogo all'altro

Il codice seguente copierà il file dalla cartella "Origine" e lo copierà nella cartella "Destinazione".

Sub CopyFile() Dim MyFSO As FileSystemObject Dim SourceFile As String Dim DestinationFolder As String Imposta MyFSO = New Scripting.FileSystemObject SourceFile = "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 stai copiando un file. È inoltre necessario specificare il nome del file. Puoi usare lo stesso nome di file o puoi anche cambiarlo. Nell'esempio sopra, ho copiato il file e l'ho chiamato SampleFileCopy.xlsx

Esempio 6: copia tutti i file da una cartella all'altra

Il codice seguente copierà tutti i file dalla cartella Source alla cartella di destinazione.

Sub CopyAllFiles() Dim MyFSO As FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFSO As Folder Dim MySubFolder As Folder SourceFolder = "C:\Users\sumit\Desktop\Source" DestinationFolder = "C:\Users\ sumit\Desktop\Destination" Imposta MyFSO = New Scripting.FileSystemObject Imposta MyFolder = MyFSO.GetFolder(SourceFolder) per ogni MyFile in MyFolder.Files MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\ " & MyFile.Name, Overwritefiles:=False Next MyFile End Sub

Il codice sopra copierà tutti i file dalla cartella di origine alla cartella di destinazione.

Nota che nel metodo MyFSO.CopyFile, ho specificato che la proprietà "Overwritefiles" è False (questo è True per impostazione predefinita). Questo assicura che nel caso tu abbia già il file nella cartella, non venga copiato (e vedrai un errore). Se rimuovi "Sovrascrivi file" o lo imposti su True, nel caso in cui nella cartella di destinazione ci siano file con lo stesso nome, questi verranno sovrascritti.

Suggerimento professionale: Quando si copiano file, c'è sempre la possibilità di sovrascrivere i file. Una buona idea, in questo caso, è aggiungere il timestamp insieme al nome. Ciò assicurerà che i nomi siano sempre diversi e che tu possa facilmente tenere traccia di quali file sono stati copiati e a che ora.

Se si desidera copiare solo i file di una determinata estensione, è possibile farlo utilizzando un'istruzione IF Then per verificare se l'estensione è xlsx o meno.

Sub CopyExcelFilesOnly() Dim MyFSO As FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C:\Users\sumit\Desktop\Source" DestinationFolder = "C:\Users\ sumit\Desktop\Destination" Imposta MyFSO = New Scripting.FileSystemObject Imposta MyFolder = MyFSO.GetFolder(SourceFolder) per ogni MyFSO in MyFolder.Files If MyFSO.GetExtensionName(MyFile) = "xlsx" Then MyFSO.CopyFile Source:=MyFSO.GetFile (MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=False End If Next MyFile End Sub

Metodi FileSystemObject (FSO)

Ecco i metodi che puoi usare per ogni oggetto. Questo è solo a scopo di riferimento e non se ne preoccupa troppo. L'utilizzo di alcuni di questi è stato mostrato negli esempi trattati sopra.

Metodi UST Per oggetto Descrizione
DriveEsiste Guidare Controlla se l'unità esiste o meno
GetDrive Guidare Restituisce un'istanza dell'oggetto unità in base al percorso specificato
OttieniNomeDrive Guidare Riesegue il nome dell'unità
BuildPath Cartella di file Genera un percorso da un percorso esistente e un nome
Copia il file Cartella di file Copia un file
OttieniNomePercorsoAssoluto Cartella di file Restituire la rappresentazione canonica del percorso
OttieniNomeBase Cartella di file Restituisce il nome della base da un percorso. Ad esempio, "D:\TestFolder\TestFile.xlsm" restituirà TextFile.xlsm
Ottieni NomeTemp Cartella di file Genera un nome che può essere usato per nominare un file temporaneo
Copia cartella Cartella Copia una cartella da una posizione all'altra
Creare una cartella Cartella Crea una nuova cartella
Elimina cartella Cartella Elimina la cartella specificata
Cartella Esiste Cartella Controlla se la cartella esiste o meno
OttieniCartella Cartella Restituisce un'istanza dell'oggetto cartella in base al percorso specificato
OttieniNomeCartellaGenitore Cartella Ritrova il nome della cartella padre in base al percorso specificato
OttieniCartellaSpeciale Cartella Ottieni la posizione di varie cartelle di sistema.
Sposta cartella Cartella Sposta una cartella da una posizione all'altra
Cancella il file File Elimina un file
Il file esiste File Controlla se un file esiste o meno
OttieniNomeEstensione File Restituisce l'estensione del file
Prendi il file File Restituisce l'istanza di un oggetto file in base al percorso specificato
OttieniNomeFile File Restituisce il nome del file
OttieniVersioneFile File Restituisce la versione del file
SpostaFile File Sposta un file
CreaFileTesto File Crea un file di testo
OttieniStandardStream File Recupera l'input standard, l'output o il flusso di errori
Apri file di testo File Apri un file come TextStream
wave wave wave wave wave