- Utilizarea obiectului FileSystemObject (FSO) în Excel VBA
- Crearea unui FileSystemObject
- Utilizarea metodelor „Exists”
- Utilizarea metodelor „Get” (Obține)
- GetAbsolutePathname
- GetBaseName
- GetDriveName
- GetExtensionName
- GetFile
- GetFolder
- GetParentFolderName
- Utilizarea metodelor ‘Create’
- CreateFolder
- CreateTextFile
- Utilizarea metodelor „Copy” (Copiere)
- CopyFile
- CopyFolder
- Utilizarea metodelor „Move”
- MoveFile
- MoveFolder
- Utilizarea metodelor ‘Delete’
- DeleteFile
- DeleteFolder
- Alte metode din FSO
- OpenAsTextStream.
- BuildPath
- OpenTextFile
- Proprietăți ale FSO
- Drives
- Name
- Path
- Size
- Type
Utilizarea obiectului FileSystemObject (FSO) în Excel VBA
Obiectul FileSystem (FSO) vă oferă acces la o gamă întreagă de funcții de accesare a sistemului de fișiere al computerului dumneavoastră. Utilizând acest obiect, puteți accesa cu ușurință fișiere, foldere și unități și, de asemenea, puteți citi și scrie în fișiere.
Multe dintre funcțiile FSO ar putea fi scrise de dumneavoastră în VBA tradițional, dar ar necesita mai multă codificare și ar fi mai dificil de întreținut și de înțeles pentru un dezvoltator nou venit. FSO este o API (Application Programming Interface) încercată și testată și este mai fiabilă decât propriul dvs. cod. Este ușor de utilizat și este gata și disponibil.
OFS funcționează conform standardelor internaționale și setărilor pe care le aveți pe computerul dumneavoastră. Dacă vă distribuiți aplicația Excel la nivel global, atunci utilizarea FSO va avea grijă de orice diferențe de setări între țări, ceea ce propriul dvs. cod ar avea probleme să facă.
FSO vă va permite să faceți aproape tot ceea ce ați putea face în codul VBA în Windows File Explorer. Acesta vă oferă acces complet la sistemul de fișiere Windows.
Crearea unui FileSystemObject
FileSytemObject nu face parte din Excel VBA. Puteți utiliza FSO prin crearea unui obiect (late binding) în VBA:
Sub CreateFSO()Set MyFSO = CreateObject("Scripting.FileSystemObject")End Sub
Alternativ, puteți adăuga o referință în VBA pentru biblioteca FSO. Acest lucru se numește early binding și este mai rapid decât late binding, deoarece obiectul nu trebuie să fie creat la rularea codului dumneavoastră.
Pentru a adăuga o referință, trebuie să apăsați Alt-F11 pentru a intra în Visual Basic Editor (VBE) și apoi să folosiți „Tools|References” din meniul VBE. Aceasta va afișa o fereastră pop-up pentru a selecta referința relevantă (a se vedea mai jos).
Descoperiți lista de referințe disponibile până când puteți vedea ‘Microsoft Scripting Runtime’. Bifați caseta și faceți clic pe OK, iar biblioteca face acum parte din aplicația dumneavoastră.
Localizarea fișierului de bibliotecă DLL este C:\Windows\SysWOWW64\scrrun.dll
Dacă distribuiți aplicația dvs. către alți colegi sau locații, este esențial ca aceștia să aibă acest fișier în locația corectă pe calculatorul lor, altfel codul dvs. va da eroare.
Merită să puneți o capcană de erori pe evenimentul ‘WorkbookOpen’ folosind comanda Dir pentru a verifica dacă fișierul există. Dacă acesta lipsește, atunci dați un mesaj de avertizare și închideți fișierul Excel.
După ce referința a fost adăugată, puteți folosi următorul cod pentru a crea FSO:
Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Toate exemplele din acest articol vor folosi această metodologie pentru a crea FSO.
FSO-ul are multe metode și proprietăți disponibile. Acestea sunt împărțite aici în secțiuni în funcție de ceea ce pot face.
Utilizarea metodelor „Exists”
Puteți utiliza o metodă FSO pentru a verifica dacă o unitate, un folder sau un fișier există. Aceste metode sunt ușor de utilizat și necesită doar un singur parametru.
Sub CheckExistance()Dim MyFSO As New FileSystemObjectMsgBox MyFSO.DriveExists("C:")MsgBox MyFSO.FolderExists("C:\temp\")MsgBox MyFSO.FileExists("C:\temp\testfile.txt")End Sub
Aceste declarații vor returna toate ‘True’ presupunând că computerul dumneavoastră are o unitate C:, un folder pe aceasta numit ‘Temp’ și un fișier în folderul Temp numit ‘testfile.txt’
Circuitele de text din parametri nu fac distincție între majuscule și minuscule. Nu puteți utiliza caractere wildcards în niciuna dintre aceste metode.
De asemenea, nu puteți utiliza URL-uri (Uniform Resource Locators) pentru a descrie locația unui dosar sau fișier. FSO funcționează pur și simplu pe sistemul de operare Windows și pe sistemul de fișiere de pe acesta. Pentru o locație a unui server extern, trebuie să mapezi mai întâi o unitate de disc și apoi să folosești calea de acces în sine.
Utilizarea metodelor „Get” (Obține)
OFS are numeroase metode pentru a obține informații despre fișier și cale, fie împărțind calea și fișierul, fie obținând informații despre fișier sau dosar, cum ar fi data creării sau data modificării.
GetAbsolutePathname
Aceasta va furniza o cale completă de la rădăcina unității specificate.
Sintaxa este:
GetAbsolutePathName (pathspec)
Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:..."MsgBox MyFSO.GetAbsolutePathName(Pth)End Sub
Aceasta va returna un șir de caractere ‘C:\Users\Richard\Documents’. Acest lucru se datorează faptului că traseul a fost specificat ca fiind C: urmat de trei puncte. Fiecare punct semnifică un nivel următor în structura dosarelor.
GetBaseName
Aceasta returnează numele unui fișier sau dosar specificat.
Sintaxa este:
GetBaseName (path)
Sub BaseName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetBaseName(Pth)End Sub
Acest cod va returna ‘testfile’. Metoda returnează ultima secțiune din numele căii de acces. Dacă este un fișier, atunci nu returnează sufixul fișierului.
Dacă calea nu poate fi găsită, atunci va fi returnat un șir gol.
GetDrive
Aceasta vă permite să utilizați codul pentru a accesa informații despre unitate, pe baza literei de unitate specificate.
Sintaxa este:
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
Această metodă returnează un obiect unitate pe baza unității specificate. Puteți utiliza acest obiect pentru a accesa informații despre unitatea de disc, cum ar fi spațiul liber disponibil.
GetDriveName
Această metodă va separa numele unității de un șir de traseu / nume de fișier.
Sintaxa este:
GetDriveName (path)
Sub DriveName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)End Sub
Aceasta va returna ‘C:’
GetExtensionName
Aceasta va returna sufixul fișierului din calea specificată.
Sintaxa este:
GetExtensionName (path)
Sub ExtensionName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)End Sub
Aceasta va returna ‘txt’.
Dacă nu este specificat niciun fișier, atunci va fi returnat un șir gol.
GetFile
Această metodă returnează un obiect fișier, care conține diverse informații despre fișierul în sine.
Sintaxa este:
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
Aceasta va returna data și ora la care a fost creat fișierul specificat. Dacă nu este specificat niciun fișier sau dacă fișierul nu există, se va primi o eroare de tip ‘file not found’.
Sub FileName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)End Sub
Aceasta va returna ‘testfile.txt’.
GetFolder
Aceasta creează un obiect folder pentru folderul de bază din calea specificată. Calea trebuie să conțină numai nume de dosare. Nu trebuie să fie incluse nume de fișiere, altfel va apărea o eroare.
Sintaxa este:
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
Obiectul folder are în el diverse informații care pot fi accesate. În acest caz, se returnează data la care a fost creat folderul.
Puteți utiliza, de asemenea, această metodă pentru a prelua toate numele fișierelor dintr-un anumit folder:
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
Acest cod va itera prin folderul ‘Temp’ și va afișa fiecare nume de fișier găsit.
GetParentFolderName
Această metodă va returna numele folderului de la următorul nivel în sus în ierarhia folderelor.
Sintaxa este:
GetParentFolderName (path)
Sub FolderName()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\users\richard"MsgBox MyFSO.GetParentFolderName(Pth)End Sub
Aceasta va returna „Users”, deoarece acesta este „părintele” pentru folderul „richard”.
Utilizarea metodelor ‘Create’
Cu ajutorul FSO puteți crea un nou folder și o nouă cale și puteți crea un fișier text.
CreateFolder
Puteți specifica un nou nume de cale pentru folderul care urmează să fie creat. Un pericol al acestui lucru este că, dacă dosarul există deja, atunci va apărea o eroare. Puteți utiliza metoda „FolderExists” pentru a vă asigura că acest lucru nu se va întâmpla.
Sintaxa este:
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
Acest cod va crea un nou dosar numit „MyFolder” sub calea existentă „C:\temp”.
CreateTextFile
Această metodă vă permite să creați un fișier text simplu și să scrieți direct în el.
Sintaxa este:
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
Acest cod creează un fișier text numit ‘Myfile.txt’ în folderul ‘Temp’ al unității ‘C:’ și apoi scrie două rânduri de text în el.
Rețineți că un caracter de avans de linie este concatenat în șirul care se scrie.
Dacă calea pe care scrieți nu există, atunci va apărea o eroare. Puteți utiliza metoda „FolderExists” pentru a verifica acest lucru înainte de a crea fișierul.
Există un parametru opțional pentru a suprascrie fișierul existent, dacă este necesar – acesta poate fi True sau False. Valoarea implicită este True (Adevărat).
Utilizarea metodelor „Copy” (Copiere)
Puteți utiliza aceste metode pentru a copia un fișier sau un dosar într-o altă locație.
CopyFile
Această metodă va copia un fișier dintr-o locație de dosar în alta. Rețineți că copia va eșua dacă locația de destinație are setat atributul read-only.
Sintaxa este:
CopyFile sursă, destinație,
Sub CopyFile()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueEnd Sub
Acest cod va face o copie a tuturor fișierelor text (txt) de la ‘C:\temp’ în ‘C:\temp\dosarul meu\’, suprascriind fișierul unde este necesar. Setarea implicită pentru Overwrite (Suprascriere) este True (Adevărat).
Puteți folosi un asterisc (*) ca wildcard pentru numele fișierelor, dar nu puteți folosi un wildcard cu semn de întrebare (?) pentru a reprezenta caractere unice.
CopyFolder
Puteți utiliza această metodă pentru a copia un întreg folder dintr-o locație în alta.
Sintaxa este:
CopyFolder sursă, destinație,
Sub CopyFolder()Dim MyFSO As New FileSystemObjectMyFSO.CopyFolder "C:\temp\*", "C:\users\richard\"End Sub
Acest cod copiază toate folderele și fișierele de sub ‘C:\temp’ în ‘C:\users\richard’. Noul folder creat va fi ‘C:\users\richard\myfolder’ deoarece ‘C:\temp’ avea un folder în el numit ‘myfolder’.
Există patru rezultate posibile atunci când se utilizează această metodă:
- Dacă destinația nu există, atunci se copiază folderul sursă și conținutul acestuia.
- Dacă destinația există deja, atunci apare o eroare.
- Dacă destinația este un dosar, atunci se copiază dosarul sursă și conținutul acestuia. Se va produce o eroare dacă Overwrite este setat la False și există deja o copie a unui fișier în destinație.
- Dacă destinația este setată la read only, se va produce o eroare dacă Overwrite este setat la false.
Această metodă se oprește la prima eroare pe care o întâlnește. Nu există nici o revenire a acțiunilor care au reușit înainte de apariția erorii.
Utilizarea metodelor „Move”
Aceste metode pot fi folosite pentru a muta fișiere sau foldere în alte locații. Acest lucru este același lucru cu tăierea dintr-o locație și lipirea în altă locație. Rețineți că, dacă fișierul care urmează să fie mutat este deschis, atunci metoda Move va eșua cu o eroare.
MoveFile
Această metodă este utilizată pentru a muta un anumit fișier într-o altă locație. Caracterele joker sunt permise în ultima componentă de cale a sursei.
Sintaxa este:
MoveFile sursa, destinația
Sub MoveAFile()Dim MyFSO As New FileSystemObjectMyFSO.MoveFile "C:\temp\*", "C:\temp\myfolder"End Sub
Acest cod mută toate fișierele găsite la ‘C:\temp’ în ‘C:\temp\folderul meu’.
Directoarele sursă și destinație trebuie să existe, deoarece dosarul destinație nu se creează automat.
Această metodă se oprește la prima eroare pe care o întâlnește. Nu există nici o revenire asupra acțiunilor care au reușit înainte de apariția erorii.
MoveFolder
Această metodă mută un anumit folder dintr-o locație în alta.
Sintaxa este:
MoveFolder (sursă, destinație)
Sub MoveAFolder()Dim MyFSO As New FileSystemObjectMyFSO.MoveFolder "C:\temp\myfolder", "C:\temp\mydestination"End Sub
Acest cod mută folderul „folderul meu” și conținutul acestuia în folderul „destinația mea”. ‘myfolder’ este efectiv șters și ‘mydestination’ este creat, împreună cu conținutul din ‘myfolder’.
Dacă dosarul de destinație există deja, atunci apare o eroare.
Utilizarea metodelor ‘Delete’
Aceste metode sunt folosite pentru a șterge fișiere sau dosare. Ele trebuie folosite cu grijă, deoarece nu există metode de revenire sau de anulare în cazul în care ceva nu merge bine.
DeleteFile
Aceasta șterge fișiere individuale sau un grup de fișiere folosind caractere joker.
Sintaxa este:
DeleteFile filespec,
Sub DeleteFiles()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C:\temp\*"End Sub
Acest cod va șterge toate fișierele din folderul ‘C:\temp’
Parametrul Force este opțional și este setat la True sau False. Dacă este setat la True, atunci vor fi șterse fișierele numai pentru citire. Valoarea implicită este False.
DeleteFolder
Această metodă șterge un folder specificat și conținutul său.
Sintaxa este:
DeleteFolder folderspec,
Sub DeleteFolders()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFolder "C:\temp\MyDestination"End Sub
Acest cod va șterge folderul ‘MyDestination’ și toate fișierele din acel folder. Dosarul ‘temp’ va rămâne.
Parametrul Force este opțional și este setat la True sau False. Dacă este setat la True, atunci vor fi șterse folderele de numai citire. Valoarea implicită este False.
Se pot utiliza caractere bizare în ultima componentă a căii. Dacă dosarul nu este găsit, atunci va apărea o eroare.
Această metodă se oprește la prima eroare pe care o întâlnește. Nu există nici o revenire asupra acțiunilor care au reușit înainte de apariția erorii.
Alte metode din FSO
OpenAsTextStream.
Această metodă deschide un fișier specificat ca un obiect Text Stream și permite citirea sau scrierea acestuia. Avantajul acestei metode este că poate deschide orice tip de fișier și poate extrage textul disponibil.
Sintaxa este:
OpenAsTextStream (])
Parametrul „iomode” permite numai citire (1), citire/scriere (2) și adăugare (8). Parametrul de citire/scriere suprascrie fișierul.
Parametrul ‘format’ este setat la -2 pentru valoarea implicită a sistemului, -1 pentru a deschide fișierul ca Unicode și 0 pentru a deschide fișierul ca 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
Acest cod obține un fișier text existent și îl creează ca obiect folosind metoda ‘GetFile’. Apoi deschide fluxul de text ca citire / scriere (2) și scrie o linie de text. Fișierul este apoi închis și redeschis ca read (1) și se citește o linie din el, care este apoi afișată ca o căsuță de mesaje.
Rețineți că linia citită trebuie plasată într-o variabilă înainte de a putea fi afișată într-o căsuță de mesaje.
BuildPath
Această metodă va adăuga un nume de dosar sau de fișier la sfârșitul unei căi de dosar existente. Aceasta creează doar un șir de text și nu creează efectiv noul dosar.
Sintaxa este:
BuildPath (path, name)
Sub BuildPth()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npEnd Sub
Aceasta va afișa ‘C:\\temp\ANewFolder’. Cu toate acestea, dacă doriți să utilizați efectiv acest folder, trebuie să folosiți metoda ‘CreateFolder’.
OpenTextFile
Această metodă permite deschiderea și citirea sau scrierea fișierelor în funcție de parametrii stabiliți. Funcționează în mod similar cu metoda OpenAsTextStream.
Sintaxa este:
OpenTextFile (nume fișier, ]])
Parametrul ‘iomode’ permite ForReading, ForWriting și ForAppending. Parametrul ForWriting suprascrie fișierul.
Parametrul ‘create’ este o valoare booleană. True înseamnă că va fi creat un nou fișier dacă numele de fișier specificat nu există. False înseamnă că nu va fi creat niciun fișier dacă numele de fișier nu este găsit. Valoarea implicită este False.
Parametrul ‘format’ poate fi setat la TristateFalse, TristateMixed, TristateTrue și TristateUseDefault în funcție de faptul dacă fișierul este ASCII sau Unicode.
Sub OpenTxtFile()Dim MyFSO As New FileSystemObjectSet ts = MyFSO.OpenTextFile("C:\temp\myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.CloseEnd Sub
Acest cod va citi o linie din fișierul text ‘myfile.txt’.
Un avantaj pe care metoda OpenTextFile îl are față de metoda OpenAsTextStreamMethod este că dispune de meniuri derulante pentru parametri, care sunt mai semnificative decât încercarea de a reține valorile numerice corespunzătoare pentru diferitele opțiuni de parametri.
Proprietăți ale FSO
Drives
Această proprietate conține o colecție de unități disponibile pe computerul dumneavoastră.
Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveSet Dr = MyFSO.DrivesFor Each d In Dr MsgBox d.DriveLetterNext dEnd Sub
Acest cod va returna fiecare literă de unitate disponibilă pe computerul dumneavoastră.
Name
Aceasta returnează numele unui fișier sau folder specificat.
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
Acest cod va oferi numele fișierului și informații despre acesta folosind proprietatea Drive.
Path
Proprietatea Path va separa calea din specificația unui fișier.
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
Acest exemplu funcționează în același mod ca și exemplul Name, cu excepția faptului că acum oferă calea de acces pentru fișier.
Size
Proprietatea Size va oferi dimensiunea unui dosar sau a unui fișier.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeEnd Sub
Acest cod de mai sus va returna dimensiunea folderului ‘C:\temp\’.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeEnd Sub
Acest cod de mai sus va returna dimensiunea fișierului ‘myfile.txt’.
Type
Proprietatea type va returna textul pentru tipul de fișier sau folder.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeEnd Sub
Acest cod de mai sus va returna textul ‘File folder’.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeEnd Sub
Acest cod de mai sus va returna textul ‘Text document’.
Rețineți utilizarea lui ‘GetFolder’ și ‘GetFile’ în fiecare exemplu.
.