Utilizarea FileSystemObject în Excel VBA

Utilizarea FileSystemObject (FSO) în Excel VBA

FileSystemObject (FSO) vă oferă acces la o gamă întreagă de funcții pentru accesarea sistemului de fișiere al computerului. Folosind acest obiect, puteți accesa cu ușurință fișiere, foldere și unități, precum și să citiți și să scrieți în fișiere.

Multe dintre funcțiile FSO ar putea fi scrise de dvs. în VBA tradițional, dar ar necesita mai multă codificare și ar fi mai dificil pentru un dezvoltator primit de întreținut și înțeles. FSO este un API (Interfață de programare a aplicațiilor) încercat și testat și este mai fiabil decât propriul cod. Este ușor de utilizat, gata și disponibilă.

FSO funcționează conform standardelor și setărilor internaționale pe care le aveți pe computer. Dacă distribuiți aplicația Excel la nivel global, atunci utilizând FSO se va ocupa de orice diferențe de setări între țări, ceea ce propriul cod ar avea probleme.

FSO vă va permite să faceți aproape tot ce puteți face în codul VBA în Windows File Explorer. Vă oferă acces complet la sistemul de fișiere Windows.

Crearea unui FileSystemObject

FileSytemObject nu face parte din Excel VBA. Puteți utiliza FSO creând un obiect (legare târzie) în VBA:

123 Sub CreateFSO ()Setați MyFSO = CreateObject ("Scripting.FileSystemObject")Sfârșitul Sub

Alternativ, puteți adăuga o referință în VBA pentru biblioteca FSO. Aceasta se numește legare timpurie și este mai rapidă decât legarea târzie, deoarece obiectul nu trebuie creat atunci când codul dvs. este rulat.

Pentru a adăuga o referință, trebuie să apăsați Alt-F11 pentru a intra în Visual Basic Editor (VBE) și apoi utilizați „Tools | References” din meniul VBE. Aceasta va afișa o fereastră pop-up pentru a selecta referința relevantă (vezi mai jos).

Derulați în jos 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 dvs.

Locația fișierului bibliotecă DLL este C: \ Windows \ SysWOW64 \ 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ă de pe computerul lor, în caz contrar codul dvs. va greși.

Merită să puneți o capcană de eroare la evenimentul „WorkbookOpen” folosind comanda Dir pentru a verifica dacă fișierul există. Dacă lipsește, dați un mesaj de avertizare și închideți fișierul Excel.

Odată adăugată referința, puteți utiliza următorul cod pentru a crea FSO:

123 Sub TestFSO ()Dim MyFSO ca nou FileSystemObjectSfârșitul Sub

Toate exemplele din acest articol vor folosi această metodologie pentru a crea FSO.

FSO 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 „Exista”

Puteți utiliza o metodă FSO pentru a verifica dacă există o unitate, un folder sau un fișier. Aceste metode sunt ușor de utilizat și necesită doar un parametru.

123456 Sub CheckExistance ()Dim MyFSO ca nou FileSystemObjectMsgBox MyFSO.DriveExists ("C:")MsgBox MyFSO.FolderExists ("C: \ temp \")MsgBox MyFSO.FileExists ("C: \ temp \ testfile.txt")Sfârșitul Sub

Toate aceste declarații vor reveni „Adevărat” presupunând că computerul dvs. are o unitate C: un folder numit „Temp” și un fișier din folderul Temp numit „testfile.txt”

Șirurile de text din parametri nu sunt sensibile la majuscule și minuscule. Nu puteți utiliza metacaractere în niciuna dintre aceste metode.

De asemenea, nu puteți utiliza adresele URL (Uniform Resource Locators) pentru a descrie locația unui folder sau a unui fișier. FSO funcționează pur și simplu pe sistemul de operare Windows și sistemul de fișiere de pe acesta. Pentru o locație de server extern, trebuie mai întâi de toate să mapați o unitate cu aceasta și apoi să utilizați însuși calea unității.

Folosind metodele „Obțineți”

FSO 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 folder, cum ar fi data creată sau data modificării.

GetAbsolutePathname

Aceasta va oferi o cale completă de la rădăcina unității specificate.

Sintaxa este:

GetAbsolutePathName (pathspec)

12345 Sub AbsolutePath ()Dim MyFSO ca nou FileSystemObject, Pth ca șirPth = "c: …"MsgBox MyFSO.GetAbsolutePathName (Pth)Sfârșitul Sub

Aceasta va returna un șir „C: \ Users \ Richard \ Documents”. Acest lucru se datorează faptului că calea a fost specificată ca C: urmată de trei puncte. Fiecare punct semnifică un nivel următor în cadrul structurii folderelor.

GetBaseName

Aceasta returnează numele unui fișier sau folder specificat.

Sintaxa este:

GetBaseName(cale)

12345 SubNume bază ()Dim MyFSO ca nou FileSystemObject, Pth ca șirPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetBaseName (Pth)Sfârșitul Sub

Acest cod va returna „testfile”. Metoda returnează ultima secțiune din numele căii. 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țiile despre unitate, pe baza literei de unitate specificate.

Sintaxa este:

GetDrive (drivespec)

123456 Sub DriveInfo ()Dim MyFSO ca nou FileSystemObject, Pth ca șir, Dr ca unitatePth = "C:"Setați Dr = MyFSO.GetDrive (Pth)MsgBox Dr.FreeSpaceSfârșitul Sub

Această metodă returnează un obiect de unitate bazat pe unitatea specificată. Puteți utiliza acest obiect pentru a accesa informații despre unitate, cum ar fi spațiul liber disponibil.

V-ați săturat să căutați exemple de cod VBA? Încercați AutoMacro!

GetDriveName

Această metodă va separa numele unității de un șir de cale / nume de fișier.

Sintaxa este:

GetDriveName (cale)

12345 Sub DriveName ()Dim MyFSO ca nou FileSystemObject, Pth ca șirPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetDriveName (Pth)Sfârșitul Sub

Aceasta va afișa „C:”

GetExtensionName

Aceasta va returna sufixul fișierului în calea specificată.

Sintaxa este:

GetExtensionName (cale)

12345 Sub ExtensionName ()Dim MyFSO ca nou FileSystemObject, Pth ca șirPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetExtensionName (Pth)Sfârșitul Sub

Aceasta va returna „txt”.

Dacă nu este specificat niciun fișier, atunci va fi returnat un șir gol.

Ia fisierul

Această metodă returnează un obiect fișier, care conține diverse informații despre fișierul în sine.

Sintaxa este:

Ia fisierul (filespec)

123456 Fișier subinfo ()Dim MyFSO ca nou FileSystemObject, Pth ca șir, Fn ca fișierPth = "C: \ temp \ testfile.txt"Setați Fn = MyFSO.GetFile (Pth)MsgBox Fn.DateCreatedSfârșitul Sub

Aceasta va returna data și ora la care a fost creat fișierul specificat. Dacă nu este specificat niciun fișier sau fișierul nu există, veți primi o eroare „fișierul nu a fost găsit”.

12345 SubNume fișier ()Dim MyFSO ca nou FileSystemObject, Pth ca șirPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetFileName (Pth)Sfârșitul Sub

Aceasta va returna „testfile.txt”.

GetFolder

Aceasta creează un obiect folder pentru folderul de bază în calea specificată. Calea trebuie să conțină numai nume de dosare. Nu trebuie incluse nume de fișiere, altfel va apărea o eroare.

Sintaxa este:

GetFolder (folderspec)

123456 Sub FolderInfo ()Dim MyFSO ca nou FileSystemObject, Pth ca șir, ca folderPth = "C: \ temp"Set Fo = MyFSO.GetFolder (Pth)MsgBox Fo.DateCreatedSfârșitul Sub

Obiectul folder conține diverse informații care pot fi accesate. În acest caz, returnează data la care a fost creat folderul.

De asemenea, puteți utiliza această metodă pentru a prelua toate numele fișierelor dintr-un folder dat:

12345678 SubNume fișiere ()Dim MyFSO ca nou FileSystemObject, Pth ca șir, Fo ca folder, Fn ca fișierPth = "C: \ temp"Set Fo = MyFSO.GetFolder (Pth)Pentru fiecare Fn din Fo.FilesMsgBox Fn.NameUrmătorul FnSfârșitul 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 la următorul nivel în ierarhia folderelor.

Sintaxa este:

GetParentFolderName (cale)

12345 Sub FolderName ()Dim MyFSO ca nou FileSystemObject, Pth ca șir, ca folderPth = "C: \ users \ richard"MsgBox MyFSO.GetParentFolderName (Pth)Sfârșitul Sub

Aceasta va returna „Utilizatori”, deoarece acesta este „părintele” pentru dosarul „richard”.

Programare VBA | Generatorul de coduri funcționează pentru dvs.!

Folosind metodele „Creați”

Cu FSO puteți crea un folder și o nouă cale și puteți crea un fișier text.

Creeaza dosar

Puteți specifica un nou nume de cale de folder care urmează să fie creat. Un pericol este că dacă folderul 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:

Creeaza dosar(numele fisierului)

1234567 Sub CreateNewFolder ()Dim MyFSO ca nou FileSystemObject, Pth ca șirPth = "C: \ temp \ MyFolder"Dacă MyFSO.FolderExists (Pth) = False atunciMyFSO.CreateFolder (Pth)End IfSfârșitul Sub

Acest cod va crea un nou folder 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 acesta.

Sintaxa este:

CreateTextFile (nume de fișier, [ suprascrie, [ unicode ]])

1234567 Sub CreateTextFile ()Dim MyFSO ca nou FileSystemObject, Pth ca șirPth = "C: \ temp \ Myfile.txt"Setați Fn = MyFSO.CreateTextFile (Pth, True)Fn.Write "Adaugă propriul meu text aici" & vbLf & "Acesta este al doilea rând"Fn.ÎnchideSfârșitul Sub

Acest cod creează un fișier text numit „Myfile.txt” în folderul „Temp” al unității „C:” și apoi îi scrie două linii de text.

Rețineți că un caracter de alimentare de linie este concatenat în șirul care se scrie.

Dacă calea către 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 adevărat sau fals. Valoarea implicită este True.

Folosind metodele „Copiere”

Puteți utiliza aceste metode pentru a copia un fișier sau un folder într-o altă locație.

Programare VBA | Generatorul de coduri funcționează pentru dvs.!

Copiaza fisier

Această metodă va copia un fișier dintr-o locație de folder în alta. Rețineți că copia va eșua dacă locația de destinație are setat atributul numai în citire.

Sintaxa este:

Copiaza fisier sursă, destinaţie, [ suprascrie ]

1234 Subcopiere ()Dim MyFSO ca nou FileSystemObjectMyFSO.CopyFile "C: \ temp \ *. Txt", "C: \ temp \ myfolder \", TrueSfârșitul Sub

Acest cod va face o copie a tuturor fișierelor text (txt) de la „C: \ temp” în „C: \ temp \ myfolder \”, suprascriind fișierul acolo unde este necesar. Setarea implicită pentru Suprascriere este Adevărată.

Puteți utiliza un caracter asterisc (*) pentru numele de fișier, dar nu puteți utiliza un semn de întrebare (?) Pentru a reprezenta caractere individuale.

CopyFolder

Puteți utiliza această metodă pentru a copia un întreg folder dintr-o locație în alta.

Sintaxa este:

CopyFolder sursă, destinaţie, [ suprascrie ]

1234 Subfolder ()Dim MyFSO ca nou FileSystemObjectMyFSO.CopyFolder "C: \ temp \ *", "C: \ users \ richard \"Sfârșitul 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 folderul sursă și conținutul sunt copiate.
  • Dacă destinația există deja, atunci apare o eroare.
  • Dacă destinația este un folder, atunci folderul sursă și conținutul acestuia vor fi copiate. O eroare va apărea dacă Suprascrierea este setată la Fals și există deja o copie a unui fișier în destinație.
  • Dacă destinația este setată doar pentru citire, va apărea o eroare dacă suprascrierea este setată la fals.

Această metodă se oprește la prima eroare pe care o întâlnește. Nu există retrocedări ale acțiunilor care au reușit înainte de apariția erorii.

Folosind metodele „Mutare”

Aceste metode pot fi folosite pentru a muta fișiere sau foldere în alte locații. Acest lucru este la fel ca tăierea dintr-o locație și lipirea într-o altă locație. Rețineți că, dacă fișierul care trebuie 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. Jokerurile sunt permise în ultima componentă a căii sursei.

Sintaxa este:

MoveFile sursă, destinaţie

1234 Sub MoveAFile ()Dim MyFSO ca nou FileSystemObjectMyFSO.MoveFile "C: \ temp \ *", "C: \ temp \ myfolder"Sfârșitul Sub

Acest cod mută toate fișierele găsite la „C: \ temp” în „C: \ temp \ myfolder”.

Dosarele sursă și destinație trebuie să existe, deoarece folderul destinație nu se creează automat.

Această metodă se oprește la prima eroare pe care o întâlnește. Nu există retrocedări ale acțiunilor care au reușit înainte de apariția erorii.

Programare VBA | Generatorul de coduri funcționează pentru dvs.!

MoveFolder

Această metodă mută un anumit folder dintr-o locație în alta.

Sintaxa este:

MoveFolder (sursă, destinaţie)

1234 Sub MoveAFolder ()Dim MyFSO ca nou FileSystemObjectMyFSO.MoveFolder "C: \ temp \ myfolder", "C: \ temp \ mydestination"Sfârșitul Sub

Acest cod mută folderul „dosarul meu” și conținutul în dosarul „destinația mea”. „Myfolder” este șters efectiv și se creează „mydestination”, împreună cu conținutul din „myfolder”.

Dacă folderul de destinație există deja, apare o eroare.

Folosind metodele „Ștergeți”

Aceste metode sunt utilizate pentru a șterge fișiere sau foldere. Acestea trebuie utilizate cu grijă, deoarece nu există metode de revenire sau anulare dacă ceva nu merge bine.

Sterge fisierul

Aceasta șterge fișiere individuale sau un grup de fișiere folosind metacaractere.

Sintaxa este:

Sterge fisierul filespec, [ forta ]

1234 Sub DeleteFiles ()Dim MyFSO ca nou FileSystemObjectMyFSO.DeleteFile "C: \ temp \ *"Sfârșitul 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 fișierele numai în citire vor fi șterse. Valoarea implicită este False.

DeleteFolder

Această metodă șterge un folder specificat și conținutul acestuia.

Sintaxa este:

DeleteFolder folderspec, [ forta ]

1234 Sub DeleteFolders ()Dim MyFSO ca nou FileSystemObjectMyFSO.DeleteFolder "C: \ temp \ MyDestination"Sfârșitul 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 folderele de numai citire vor fi șterse. Valoarea implicită este False.

Comercierii pot fi folosiți în ultima componentă a căii. Dacă folderul 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ă retrocedări ale acțiunilor care au reușit înainte de apariția erorii.

Programare VBA | Generatorul de coduri funcționează pentru dvs.!

Alte metode în FSO

OpenAsTextStream.

Această metodă deschide un fișier specificat ca obiect Text Stream și permite citirea sau scrierea acestuia. Avantajul acestei metode este că poate deschide orice tip de fișier și extrage textul disponibil.

Sintaxa este:

OpenAsTextStream ([ iomode, [ format ]])

Parametrul „iomode” permite numai citirea (1), citirea / scrierea (2) și adăugarea (8). Parametrul de citire / scriere suprascrie fișierul.

Parametrul „format” este setat la -2 pentru implicit, -1 pentru a deschide fișierul ca Unicode și 0 pentru a deschide fișierul ca ASCII (American Standard Code for Information Interchange).

1234567891011 Sub TextStream ()Dim MyFSO ca nou FileSystemObjectSetați f = MyFSO.GetFile ("C: \ temp \ myfile.txt")Setați ts = f.OpenAsTextStream (2)ts. Scrie „Noul meu text”ts. ÎnchideSetați ts = f.OpenAsTextStream (1)s = ts.ReadLineMsgBox sts. ÎnchideSfârșitul 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 un rând de text. Fișierul este apoi închis și redeschis ca citit (1) și o linie este citită din acesta, care este apoi afișată ca o casetă de mesaj.

Rețineți că linia de citire trebuie plasată într-o variabilă înainte de a putea fi afișată într-o casetă de mesaje.

BuildPath

Această metodă va adăuga un folder sau un nume de fișier la sfârșitul unei căi de folder existente. Aceasta creează doar un șir de text și nu creează de fapt noul folder.

Sintaxa este:

BuildPath (cale, Nume)

12345 Sub BuildPth ()Dim MyFSO ca nou FileSystemObjectnp = MyFSO.BuildPath ("C: \ temp", "ANewFolder")MsgBox npSfârșitul Sub

Se va afișa „C: \ temp \ ANewFolder”. Cu toate acestea, dacă doriți să utilizați efectiv acest folder, trebuie să utilizați metoda „CreateFolder”.

OpenTextFile

Această metodă permite fișierelor să fie deschise și citite sau scrise în funcție de parametrii setați. Funcționează într-un mod similar cu metoda OpenAsTextStream.

Sintaxa este:

OpenTextFile (nume de fișier, [ iomode, [ crea, [ format ]]])

Parametrul „iomode” permite ForReading, ForWriting și ForAppending. Parametrul ForWriting suprascrie fișierul.

Parametrul „creați” este o valoare booleană. Adevărat înseamnă că va fi creat un fișier nou dacă numele de fișier specificat nu există. Fals înseamnă că nu va fi creat niciun fișier dacă nu se găsește numele fișierului. 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.

1234567 Sub OpenTxtFile ()Dim MyFSO ca nou FileSystemObjectSetați ts = MyFSO.OpenTextFile ("C: \ temp \ myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts. ÎnchideSfârșitul Sub

Acest cod va citi o linie din fișierul text „fișierul meu.txt”.

Un avantaj pe care îl are metoda OpenTextFile față de OpenAsTextStreamMethod este că are drop-down-uri pentru parametri, care sunt mai semnificative decât încercarea de a aminti valorile numerice adecvate pentru diferitele opțiuni ale parametrilor.

Programare VBA | Generatorul de coduri funcționează pentru dvs.!

Proprietățile FSO

Unități

Această proprietate deține o colecție de unități disponibile pe computerul dvs.

1234567 Sub Drv ()Dim MyFSO ca nou FileSystemObject, d ca unitateSetați Dr = MyFSO.DrivesPentru fiecare d În Dr.MsgBox d.DriveLetterUrmătorul dSfârșitul Sub

Acest cod va returna fiecare literă de unitate disponibilă pe computerul dvs.

Nume

Aceasta returnează numele unui fișier sau folder specificat.

123456789 Sub NameExample ()Dim MyFSO ca nou FileSystemObjectSetați f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Name & "on Drive" & UCase (f.Drive) & vbCrLfi = i & "Creat:" & f.DateCreated & vbCrLfi = i & "Ultimul acces:" & f.DateLastAccessed & vbCrLfi = i & "Ultima modificare:" & f.DateLastModifiedMsgBox iSfârșitul Sub

Acest cod va da numele fișierului și informații despre acesta folosind proprietatea Drive.

cale

Proprietatea Path va separa calea de o specificație de fișier.

123456789 Sub PathExample ()Dim MyFSO ca nou FileSystemObjectSetați f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Path & f.Name & "on Drive" & UCase (f.Drive) & vbCrLfi = i & "Creat:" & f.DateCreated & vbCrLfi = i & "Ultimul acces:" & f.DateLastAccessed & vbCrLfi = i & "Ultima modificare:" & f.DateLastModifiedMsgBox iSfârșitul Sub

Acest exemplu funcționează la fel ca exemplul Name, cu excepția faptului că oferă acum calea pentru fișier.

Programare VBA | Generatorul de coduri funcționează pentru dvs.!

mărimea

Proprietatea Size va da dimensiunea unui folder sau a unui fișier.

12345 Sub FSize ()Dim MyFSO ca nou FileSystemObjectSetați f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.DimensiuneSfârșitul Sub

Acest cod de mai sus va returna dimensiunea dosarului „C: \ temp \”.

12345 Sub FSize ()Dim MyFSO ca nou FileSystemObjectSetați f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f. MărimeSfârșitul Sub

Acest cod de mai sus va returna dimensiunea fișierului „fișierul meu.txt”.

Tip

Proprietatea type va returna textul pentru tipul de fișier sau folder.

12345 Sub FType ()Dim MyFSO ca nou FileSystemObjectSetați f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.TypeSfârșitul Sub

Acest cod de mai sus va returna textul „Dosar fișier”.

12345 Sub FType ()Dim MyFSO ca nou FileSystemObjectSetați f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f.TypeSfârșitul Sub

Acest cod de mai sus va returna textul „Document text”.

Rețineți utilizarea „GetFolder” și „GetFile” în fiecare exemplu.

Vei ajuta la dezvoltarea site-ului, partajarea pagina cu prietenii

wave wave wave wave wave