Utilizzo di FileSystemObject (FSO) in Excel VBA
Il FileSystemObject (FSO) ti dà accesso a tutta una serie di funzioni per accedere al file system del tuo computer. Utilizzando questo oggetto, puoi accedere facilmente a file, cartelle e unità, nonché leggere e scrivere su file.
Molte delle funzioni FSO potrebbero essere scritte da te in VBA tradizionale, ma richiederebbero più codice e sarebbe più difficile da gestire e comprendere per uno sviluppatore in arrivo. L'UST è un'API (Application Programming Interface) collaudata ed è più affidabile del tuo codice. È facile da usare e pronto e disponibile.
L'UST lavora secondo gli standard e le impostazioni internazionali che hai sul tuo computer. Se stai distribuendo la tua applicazione Excel a livello globale, l'utilizzo di FSO si occuperà di eventuali differenze nelle impostazioni tra i paesi, cosa che il tuo codice avrebbe problemi a fare.
L'UST ti consentirà di fare quasi tutto nel codice VBA che potresti 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 utilizzare FSO creando un oggetto (associazione tardiva) in VBA:
123 | Sub CreateFSO()Imposta MyFSO = CreateObject("Scripting.FileSystemObject")Fine sottotitolo |
In alternativa, puoi aggiungere un riferimento in VBA per la libreria FSO. Questo è chiamato associazione anticipata ed è più veloce dell'associazione tardiva, poiché l'oggetto non deve essere creato quando viene eseguito il codice.
Per aggiungere un riferimento, è necessario premere Alt-F11 per accedere all'editor di Visual Basic (VBE), quindi utilizzare "Strumenti|Riferimenti" dal menu VBE. Verrà visualizzata una finestra pop-up per selezionare il riferimento pertinente (vedi sotto).
Scorri verso il basso l'elenco dei riferimenti disponibili fino a visualizzare "Microsoft Scripting Runtime". Seleziona la casella e fai clic su OK e la libreria fa 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 posizioni, è essenziale che abbiano questo file nella posizione corretta sul loro computer, altrimenti il tuo codice genererà errori.
Vale la pena inserire un trap di errore sull'evento "WorkbookOpen" utilizzando il comando Dir per verificare l'esistenza del file. Se è assente, dai un messaggio di avviso e chiudi il file Excel.
Una volta aggiunto il riferimento, puoi utilizzare il seguente codice per creare l'UST:
123 | SottotestFSO()Dim MyFSO come nuovo oggetto FileSystemFine sottotitolo |
Tutti gli esempi in questo articolo utilizzeranno questa metodologia per creare l'UST.
L'UST dispone di molti metodi e proprietà. Questi sono qui divisi in sezioni in base a ciò che possono fare.
Utilizzo dei metodi "Esiste"
È possibile utilizzare un metodo FSO per verificare se esiste un'unità, una cartella o un file. Questi metodi sono facili da usare e richiedono un solo parametro.
123456 | Sub CheckExistance()Dim MyFSO come nuovo oggetto FileSystemMsgBox MyFSO.DriveExists("C:")MsgBox MyFSO.FolderExists("C:\temp\")MsgBox MyFSO.FileExists("C:\temp\testfile.txt")Fine sottotitolo |
Queste istruzioni restituiranno tutte "True" supponendo che il tuo computer abbia un'unità C:, una cartella chiamata "Temp" e un file nella cartella Temp chiamata "testfile.txt"
Le stringhe di testo nei parametri non fanno distinzione tra maiuscole e minuscole. Non è possibile utilizzare i caratteri jolly in nessuno di questi metodi.
Inoltre, non è possibile utilizzare URL (Uniform Resource Locator) per descrivere una cartella o un percorso di file. L'UST funziona esclusivamente sul sistema operativo Windows e sul relativo file system. Per una posizione del server esterno, è necessario prima mappare un'unità su questo, quindi utilizzare il percorso dell'unità stesso.
Utilizzo dei metodi "Ottieni"
L'UST dispone di numerosi metodi per ottenere informazioni sul file e sul percorso, suddividendo il percorso e il file o ottenendo informazioni su file o cartelle come la data di creazione o la data di modifica.
OttieniPercorsoAssoluto
Ciò fornirà un percorso completo dalla radice dell'unità specificata.
La sintassi è:
OttieniNomePercorsoAssoluto (pathpec)
12345 | Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:… "MsgBox MyFSO.GetAbsolutePathName(Pth)Fine sottotitolo |
Ciò 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 all'interno della struttura delle cartelle.
OttieniNomeBase
Restituisce il nome di un file o di una cartella specificati.
La sintassi è:
OttieniNomeBase(il percorso)
12345 | Nome sottobase()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetBaseName(Pth)Fine sottotitolo |
Questo codice restituirà "testfile". Il metodo restituisce l'ultima sezione nel nome del percorso. Se è un file, non restituisce il suffisso del file.
Se non è possibile trovare il percorso, verrà restituita una stringa vuota.
GetDrive
Ciò consente di utilizzare il codice per accedere alle informazioni sull'unità, in base alla lettera dell'unità specificata.
La sintassi è:
GetDrive (drivepec)
123456 | Sub DriveInfo()Dim MyFSO As New FileSystemObject, Pth As String, Dr As DrivePth = "C:"Imposta Dr = MyFSO.GetDrive(Pth)MsgBox Dr.FreeSpaceFine sottotitolo |
Questo metodo restituisce un oggetto unità in base all'unità specificata. È possibile utilizzare questo oggetto per accedere alle informazioni sull'unità, ad esempio lo spazio disponibile.
Stanco di cercare esempi di codice VBA? Prova AutoMacro!
Ottieni nome unità
Questo metodo separerà il nome dell'unità da una stringa di percorso/nome file.
La sintassi è:
OttieniNomeDrive (il percorso)
12345 | Nome unità secondaria()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)Fine sottotitolo |
Questo restituirà "C:"
OttieniNomeEstensione
Ciò restituirà il suffisso del file nel percorso specificato.
La sintassi è:
OttieniNomeEstensione (il percorso)
12345 | Nome estensione secondaria()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)Fine sottotitolo |
Questo restituirà "txt".
Se non viene specificato alcun file, verrà restituita una stringa vuota.
Prendi il file
Questo metodo restituisce un oggetto file, che contiene varie informazioni sul file stesso.
La sintassi è:
Prendi il file (specifica file)
123456 | Sub FileInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fn As FilePth = "C:\temp\testfile.txt"Imposta Fn = MyFSO.GetFile(Pth)MsgBox Fn.DateCreatedFine sottotitolo |
Ciò restituirà la data e l'ora in cui è stato creato il file specificato. Se non viene specificato alcun file o il file non esiste, verrà visualizzato l'errore "file non trovato".
12345 | Nome file secondario()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)Fine sottotitolo |
Questo restituirà "testfile.txt".
OttieniCartella
Questo crea un oggetto cartella per la cartella di base nel percorso specificato. Il percorso deve contenere solo i nomi delle cartelle. Nessun nome di file deve essere incluso altrimenti si verificherà un errore.
La sintassi è:
OttieniCartella (specificacartella)
123456 | SottocartellaInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\temp"Imposta Fo = MyFSO.GetFolder(Pth)MsgBox Fo.DateCreatedFine sottotitolo |
L'oggetto cartella contiene varie informazioni a cui è possibile accedere. In questo caso, restituisce la data di creazione della cartella.
Puoi anche utilizzare questo metodo per recuperare tutti i nomi di file all'interno di una determinata cartella:
12345678 | Nomi file secondari()Dim MyFSO As New FileSystemObject, Pth As String, Fo As Folder, Fn As FilePth = "C:\temp"Imposta Fo = MyFSO.GetFolder(Pth)Per ogni Fn in Fo.FilesMsgBox Fn.NomeAvanti FnFine sottotitolo |
Questo codice scorrerà la cartella "Temp" e visualizzerà ogni nome di file trovato.
OttieniNomeCartellaGenitore
Questo metodo restituirà il nome della cartella nel livello successivo nella gerarchia delle cartelle.
La sintassi è:
OttieniNomeCartellaGenitore (il percorso)
12345 | Nome sottocartella()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\utenti\richard"MsgBox MyFSO.GetParentFolderName(Pth)Fine sottotitolo |
Ciò restituirà "Utenti" poiché questo è il "genitore" per la cartella "richard".
Programmazione VBA | Il generatore di codice funziona per te!
Utilizzo dei metodi "Crea"
Con l'UST puoi creare una nuova cartella e percorso e creare un file di testo.
Creare una cartella
È possibile specificare un nuovo nome di percorso della cartella da creare. Un pericolo è che se la cartella esiste già, si verificherà un errore. Puoi utilizzare il metodo "FolderExists" per assicurarti che ciò non accada.
La sintassi è:
Creare una cartella(nome della cartella)
1234567 | Sub CreaNuovaCartella()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\MyFolder"Se MyFSO.FolderExists(Pth) = False ThenMyFSO.CreateFolder (Pth)Finisci seFine sottotitolo |
Questo codice creerà una nuova cartella chiamata "MyFolder" nel percorso esistente "C:\temp".
CreaFileTesto
Questo metodo consente di creare un semplice file di testo e di scrivervi direttamente.
La sintassi è:
CreaFileTesto (nome del file, [ sovrascrivi, [ unicode ]])
1234567 | Sub CreateTextFile()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\Myfile.txt"Imposta Fn = MyFSO.CreateTextFile(Pth,True)Fn.Write "Aggiungi il mio testo qui" & vbLf & "Questa è la seconda riga"Fn.ChiudiFine sottotitolo |
Questo codice crea un file di testo chiamato "Myfile.txt" nella cartella "Temp" dell'unità "C:" e quindi scrive due righe di testo su di esso.
Si noti che un carattere di avanzamento riga è concatenato nella stringa che viene scritta.
Se il percorso su cui stai scrivendo non esiste, si verificherà un errore. Puoi utilizzare il metodo "FolderExists" per verificarlo prima di creare il file.
C'è un parametro facoltativo per sovrascrivere il file esistente, se necessario, che può essere True o False. L'impostazione predefinita è Vero.
Utilizzo dei metodi di "copia"
È possibile utilizzare questi metodi per copiare un file o una cartella in un'altra posizione.
Programmazione VBA | Il generatore di codice funziona per te!
Copia il file
Questo metodo copierà un file da una posizione della cartella a un'altra. Si noti che la copia avrà esito negativo se la posizione di destinazione ha l'attributo di sola lettura impostato.
La sintassi è:
Copia il file fonte, destinazione, [ sovrascrivi ]
1234 | Sub CopyFile()Dim MyFSO come nuovo oggetto FileSystemMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueFine sottotitolo |
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 Sovrascrivi è True.
È possibile utilizzare un carattere jolly asterisco (*) per i nomi dei file, ma non è possibile utilizzare un carattere jolly punto interrogativo (?) per rappresentare singoli caratteri.
Copia cartella
È possibile utilizzare questo metodo per copiare un'intera cartella da una posizione a un'altra.
La sintassi è:
Copia cartella fonte, destinazione, [ sovrascrivi ]
1234 | Sub CopyFolder()Dim MyFSO come nuovo oggetto FileSystemMyFSO.CopyFolder "C:\temp\*", "C:\users\richard\"Fine sottotitolo |
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 utilizza questo metodo:
- Se la destinazione non esiste, vengono copiati la cartella e il contenuto di origine.
- Se la destinazione esiste già, si verifica un errore.
- Se la destinazione è una cartella, verranno copiati la cartella di origine e il suo contenuto. Si verificherà un errore se Sovrascrivi è impostato su False ed è già presente una copia di un file nella destinazione.
- Se la destinazione è impostata su sola lettura, si verificherà un errore se la sovrascrittura è impostata su false.
Questo metodo si ferma al primo errore che incontra. Non viene eseguito alcun rollback delle azioni riuscite prima che si verifichi l'errore.
Utilizzo dei metodi "Sposta"
Questi metodi possono essere utilizzati per spostare file o cartelle in altre posizioni. È come tagliare da una posizione e incollare in un'altra posizione. Si noti che se il file da spostare è aperto, il metodo Move avrà esito negativo con un errore.
SpostaFile
Questo metodo viene utilizzato per spostare un file specifico in un'altra posizione. I caratteri jolly sono consentiti nell'ultimo componente del percorso dell'origine.
La sintassi è:
SpostaFile fonte, destinazione
1234 | Sub MoveAFile()Dim MyFSO come nuovo oggetto FileSystemMyFSO.MoveFile "C:\temp\*", "C:\temp\myfolder"Fine sottotitolo |
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 delle azioni che hanno avuto successo prima che si verificasse l'errore.
Programmazione VBA | Il generatore di codice funziona per te!
Sposta cartella
Questo metodo sposta una cartella specifica da una posizione all'altra.
La sintassi è:
Sposta cartella (fonte, destinazione)
1234 | Sotto MoveAFfolder()Dim MyFSO come nuovo oggetto FileSystemMyFSO.MoveFolder "C:\temp\myfolder", "C:\temp\mydestination"Fine sottotitolo |
Questo codice sposta la cartella "myfolder" e il contenuto nella cartella "mydestination". "myfolder" viene effettivamente cancellato e viene creato "mydestination", insieme ai contenuti di "myfolder".
Se la cartella di destinazione esiste già, si verifica un errore.
Utilizzo dei metodi "Elimina"
Questi metodi vengono utilizzati per eliminare file o cartelle. Devono essere usati con cura in quanto non ci sono metodi di rollback o annullamento se qualcosa va storto.
Cancella il file
Questo elimina singoli file o un gruppo di file utilizzando i caratteri jolly.
La sintassi è:
Cancella il file specifica file, [ forza ]
1234 | Sotto EliminaFile()Dim MyFSO come nuovo oggetto FileSystemMyFSO.DeleteFile "C:\temp\*"Fine sottotitolo |
Questo codice cancellerà tutti i file nella cartella "C:\temp"
Il parametro Force è facoltativo ed è impostato su True o False. Se è impostato su True, i file di sola lettura verranno eliminati. L'impostazione predefinita è Falso.
Elimina cartella
Questo metodo elimina una cartella specificata e il suo contenuto.
La sintassi è:
Elimina cartella specificacartella, [ forza ]
1234 | Sotto EliminaCartelle()Dim MyFSO come nuovo oggetto FileSystemMyFSO.DeleteFolder "C:\temp\MyDestination"Fine sottotitolo |
Questo codice eliminerà la cartella "MyDestination" e tutti i file all'interno di quella cartella. La cartella "temp" rimarrà.
Il parametro Force è facoltativo ed è impostato su True o False. Se è impostato su True, le cartelle di sola lettura verranno eliminate. L'impostazione predefinita è Falso.
I caratteri jolly possono essere utilizzati 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 verificasse l'errore.
Programmazione VBA | Il generatore di codice funziona per te!
Altri metodi nell'UST
OpenAsTextStream.
Questo metodo apre un file specificato come oggetto Text Stream e ne consente la lettura o la scrittura. Il vantaggio di questo metodo è che può aprire qualsiasi tipo di file ed estrarre il testo disponibile.
La sintassi è:
OpenAsTextStream ([ iomode, [ formato ]])
Il parametro 'iomode' consente solo lettura (1), lettura/scrittura (2) e aggiunta (8). Il parametro di lettura/scrittura sovrascrive il file.
Il parametro "formato" è impostato su -2 per l'impostazione predefinita del sistema, -1 per aprire il file come Unicode e 0 per aprire il file come ASCII (American Standard Code for Information Interchange).
1234567891011 | Sub TextStream()Dim MyFSO come nuovo oggetto FileSystemImposta f = MyFSO.GetFile("C:\temp\myfile.txt")Imposta ts = f.OpenAsTextStream(2)ts.Scrivi "Il mio nuovo testo"ts.ChiudiImposta ts = f.OpenAsTextStream(1)s = ts.ReadLineMsgBox sits.ChiudiFine sottotitolo |
Questo codice ottiene un file di testo esistente e lo crea come oggetto utilizzando il metodo "GetFile". Quindi apre il flusso di testo come lettura/scrittura (2) e scrive una riga di testo. Il file viene quindi chiuso e riaperto come letto (1) e da esso viene letta una riga, che viene quindi visualizzata come finestra di messaggio.
Si noti che la riga di lettura deve essere inserita in una variabile prima di poter essere visualizzata in una finestra di messaggio.
BuildPath
Questo metodo aggiungerà una cartella o un nome 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 (il percorso, nome)
12345 | Sub BuildPth()Dim MyFSO come nuovo oggetto FileSystemnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npFine sottotitolo |
Verrà visualizzato "C:\temp\ANewFolder". Tuttavia, se si desidera effettivamente utilizzare questa cartella, è necessario utilizzare il metodo "CreateFolder".
Apri file di testo
Questo metodo consente di aprire e leggere o scrivere file in base ai parametri impostati. Funziona in modo simile al metodo OpenAsTextStream.
La sintassi è:
Apri file di testo (nome del file, [ iomode, [ creare, [ formato ]]])
Il parametro "iomode" consente 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 file specificato non esiste. False significa che non verrà creato alcun file se il nome del file non viene trovato. L'impostazione predefinita è Falso.
Il parametro "format" può essere impostato su TristateFalse, TristateMixed, TristateTrue e TristateUseDefault a seconda che il file sia ASCII o Unicode.
1234567 | Sub OpenTxtFile()Dim MyFSO come nuovo oggetto FileSystemSet ts = MyFSO.OpenTextFile("C:\temp\myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sits.ChiudiFine sottotitolo |
Questo codice leggerà una riga dal file di testo "miofile.txt".
Un vantaggio che il metodo OpenTextFile ha rispetto a OpenAsTextStreamMethod è che ha menu a discesa per i parametri, che sono più significativi del tentativo di ricordare i valori numerici appropriati per le varie opzioni dei parametri.
Programmazione VBA | Il generatore di codice funziona per te!
Proprietà dell'UST
unità
Questa proprietà contiene una raccolta di unità disponibili sul tuo computer.
1234567 | Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveImposta Dr = MyFSO.DrivesPer ogni d In DrMsgBox d.DriveLetterAvanti dFine sottotitolo |
Questo codice restituirà ogni lettera di unità disponibile sul tuo computer.
Nome
Restituisce il nome di un file o di una cartella specificati.
123456789 | Nome secondarioEsempio()Dim MyFSO come nuovo oggetto FileSystemImposta f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Nome & " su Drive " & UCase(f.Drive) & vbCrLfi = i & "Creato: " & f.DataCreato & vbCrLfi = i & "Ultimo accesso: " & f.DateLastAccessed & vbCrLfi = i & "Ultima modifica: " & f.DateLastModifiedMsgBox ioFine sottotitolo |
Questo codice fornirà il nome del file e le informazioni su di esso utilizzando la proprietà Drive.
Il percorso
La proprietà Path separerà il percorso da una specifica di file.
123456789 | Sub PathEsempio()Dim MyFSO come nuovo oggetto FileSystemImposta f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Path & f.Name & " su Drive " & UCase(f.Drive) & vbCrLfi = i & "Creato: " & f.DataCreato & vbCrLfi = i & "Ultimo accesso: " & f.DateLastAccessed & vbCrLfi = i & "Ultima modifica: " & f.DateLastModifiedMsgBox ioFine sottotitolo |
Questo esempio funziona allo stesso modo dell'esempio Name, tranne per il fatto che ora fornisce il percorso del file.
Programmazione VBA | Il generatore di codice funziona per te!
Taglia
La proprietà Size fornirà la dimensione di una cartella o di un file.
12345 | Sub Fsize()Dim MyFSO come nuovo oggetto FileSystemImposta f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeFine sottotitolo |
Questo codice sopra restituirà la dimensione della cartella "C:\temp\".
12345 | Sub Fsize()Dim MyFSO come nuovo oggetto FileSystemImposta f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeFine sottotitolo |
Questo codice sopra restituirà la dimensione del file 'myfile.txt'.
Tipo
La proprietà type restituirà il testo per il tipo di file o cartella.
12345 | Sottotipo F()Dim MyFSO come nuovo oggetto FileSystemImposta f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeFine sottotitolo |
Questo codice sopra restituirà il testo "Cartella file".
12345 | Sottotipo F()Dim MyFSO come nuovo oggetto FileSystemImposta f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeFine sottotitolo |
Questo codice sopra restituirà il testo "Documento di testo".
Nota l'uso di "GetFolder" e "GetFile" in ogni esempio.