Când folosim VBA în Excel, în cea mai mare parte a timpului o facem pentru a ne automatiza sarcinile.
Aceasta înseamnă, de asemenea, că în cea mai mare parte a timpului lucrăm cu celule și intervale, foi de lucru, cărți de lucru și alte obiecte care fac parte din aplicația Excel.
Dar VBA este mult mai puternic și poate fi folosit, de asemenea, pentru a lucra cu lucruri din afara Excel.
În acest tutorial, vă voi arăta cum să folosiți VBA FileSystemObject (FSO) pentru a lucra cu fișiere și foldere de pe sistemul dumneavoastră sau de pe unitățile de rețea.
Acest tutorial acoperă:
Ce este VBA FileSystemObject (FSO)?
FileSystemObject (FSO) vă permite să accesați sistemul de fișiere al computerului dumneavoastră. Utilizându-l, puteți accesa și modifica fișierele/folderele/directoarele din sistemul computerului dumneavoastră.
De exemplu, mai jos sunt câteva dintre lucrurile pe care le puteți face utilizând FileSystemObject în Excel VBA:
- Verificați dacă un fișier sau un dosar există.
- Creați sau redenumiți folderele/folderele.
- Obțineți o listă cu toate numele de fișiere (sau numele subfolderelor) dintr-un dosar.
- Copiați fișiere dintr-un dosar în altul.
Sper că ați înțeles ideea.
Voi acoperi toate aceste exemple de mai sus (plus altele) mai târziu în acest tutorial.
Chiar dacă unele dintre lucrurile menționate mai sus pot fi realizate și cu ajutorul funcțiilor și metodelor VBA tradiționale (cum ar fi funcția DIR) și a metodelor, acest lucru ar duce la coduri mai lungi și mai complicate. FileSystemObject ușurează lucrul cu fișierele și folderele, menținând în același timp codul curat și scurt.
Note: FSO can only be used in Excel 2000 and later versions.
Ce toate obiectele puteți accesa prin FileSystemObject?
După cum am menționat mai sus, puteți accesa și modifica fișiere și foldere folosind FileSystemObject în VBA.
Mai jos este un tabel care prezintă cele mai importante obiecte pe care le puteți accesa și modifica folosind FSO:
Object | Description |
Drive | Obiectul Drive vă permite să obțineți informații despre unitate, cum ar fi dacă există sau nu, numele căii de acces, tipul de unitate (detașabilă sau fixă), dimensiunea acesteia, etc. |
Folder | Obiectul Folder vă permite să creați sau să modificați folderele din sistemul dumneavoastră. De exemplu, puteți crea, șterge, redenumi, copia foldere folosind acest obiect. |
File | Obiectul File vă permite să lucrați cu fișiere în sistemul dumneavoastră. De exemplu, puteți crea, deschide, copia, muta și șterge fișiere utilizând acest obiect. |
TextStream | Obiectul TextStream vă permite să creați sau să citiți fișiere text. |
Care dintre obiectele de mai sus are metode pe care le puteți utiliza pentru a lucra cu acestea.
Pentru a vă da un exemplu, dacă doriți să ștergeți un folder, veți utiliza metoda DeleteFolder a obiectului Folder. În mod similar, dacă doriți să copiați un fișier, veți utiliza metoda CopyFile a obiectului File.
Nu vă faceți griji dacă acest lucru pare copleșitor sau greu de înțeles. Veți înțelege mult mai bine atunci când veți parcurge exemplele pe care le-am acoperit în acest tutorial.
Doar în scop de referință, am acoperit toate metodele FileSystemObject (pentru fiecare obiect) la sfârșitul acestui tutorial.
Activarea FileSystemObject în Excel VBA
FileSystemObject nu este disponibil în mod implicit în Excel VBA.
Din moment ce avem de-a face cu fișiere și foldere care se află în afara aplicației Excel, trebuie să creăm mai întâi o referință la biblioteca care deține aceste obiecte (unități, fișiere, foldere).
Acum există două moduri în care puteți începe să folosiți FileSystemObject în Excel VBA:
- Stabilirea referinței la Microsoft Scripting Runtime Library (Scrrun.dll)
- Crearea unui obiect pentru a face referire la bibliotecă din codul însuși
În timp ce ambele metode funcționează (și vă voi arăta cum să faceți acest lucru în continuare), vă recomand să folosiți prima metodă.
Setarea referinței la Microsoft Scripting Runtime Library
Când creați o referință la Scripting Runtime Library, permiteți Excel VBA accesul la toate proprietățile și metodele fișierelor și dosarelor. Odată ce ați făcut acest lucru, puteți face referire la obiectul fișiere/dosare/drive-uri din cadrul Excel VBA (la fel cum puteți face referire la celule, foi de calcul sau registre de lucru).
Acestia sunt pașii pentru a crea o referință la Microsoft Scripting Runtime Library:
- În editorul VB, faceți clic pe Tools.
- Click pe References.
- În caseta de dialog References care se deschide, parcurgeți referințele disponibile și bifați opțiunea ‘Microsoft Scripting Runtime’.
- Click pe OK.
Pașii de mai sus v-ar permite acum să faceți referire la obiectele FSO din Excel VBA.
Crearea unei instanțe de FileSystemObject în cod
După ce ați setat referința la biblioteca Scripting FileSystemObject, trebuie să creați o instanță a obiectului FSO în codul dumneavoastră.
După ce aceasta este creată, o puteți utiliza în VBA.
După ce este creat, puteți utiliza în VBA codul care va seta variabila obiect MyFSO ca obiect FileSystemObject:
Sub CreatingFSO()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectEnd Sub
În acest cod, mai întâi am declarat variabila MyFSO ca fiind un obiect de tip FileSystemObject. Acest lucru este posibil numai pentru că am creat o referință la Microsoft Scripting Runtime Library. Dacă referința nu este creată, acest lucru vă va da o eroare (deoarece Excel nu ar recunoaște ce înseamnă FileSystemObject).
În a doua linie, se întâmplă două lucruri:
- Cuvântul cheie NEW creează o instanță a obiectului FileSystemObject. Acest lucru înseamnă că acum pot folosi toate metodele lui FileSystemObject pentru a lucra cu fișiere și foldere. Dacă nu creați această instanță, nu veți putea accesa metodele FSO.
- Cuvântul cheie SET setează obiectul MyFSO la această nouă instanță a FileSystemObject. Acest lucru îmi permite să folosesc acest obiect pentru a accesa fișiere și foldere. De exemplu, dacă am nevoie să creez un dosar, pot utiliza metoda MyFSO.CreateFolder.
Dacă doriți, puteți, de asemenea, să combinați cele două declarații de mai sus într-una singură, așa cum se arată mai jos:
Sub CreatingFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Un mare beneficiu al utilizării acestei metode (care constă în setarea referinței la Microsoft Scripting Runtime Library) este că, atunci când utilizați obiectele FSO în codul dumneavoastră, veți putea utiliza caracteristica IntelliSense care arată metodele și proprietățile asociate cu un obiect (așa cum se arată mai jos).
Acest lucru nu este posibil atunci când creați referința din interiorul codului (abordat în continuare).
Crearea unui obiect din cod
O altă modalitate de a crea o referință la FSO este să o faceți din cod. În această metodă, nu este nevoie să creați nicio referință (așa cum se face în metoda anterioară).
Când scrieți codul, puteți crea un obiect din interiorul codului și să faceți referire la Scripting.FileSystemObject.
Codul de mai jos creează un obiect FSO și apoi face ca acesta să fie de tip FileSystemObject.
Sub FSODemo()Dim FSO As ObjectSet FSO = CreateObject("Scripting.FileSystemObject")End Sub
În timp ce acest lucru poate părea mai convenabil, un mare dezavantaj al utilizării acestei metode este că nu ar arăta un IntelliSense atunci când lucrați cu obiecte în FSO. Pentru mine, acesta este un mare minus și recomand întotdeauna utilizarea metodei anterioare de activare a FSO (care constă în setarea referinței la ‘Microsoft Scripting Runtime’)
Exemple VBA FileSystemObject
Acum să ne scufundăm și să ne uităm la câteva exemple practice de utilizare a FileSystemObject în Excel.
Exemplul 1: Verificați dacă există un fișier sau un dosar
Codul următor va verifica dacă dosarul cu numele ‘Test’ există sau nu (în locația specificată).
Dacă dosarul există, condiția IF este adevărată și se afișează un mesaj – ‘The Folder Exists’ (Dosarul există) într-o casetă de mesaje. Iar dacă nu există, se afișează un mesaj – ‘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
În mod similar, puteți verifica și dacă un fișier există sau nu.
Codul de mai jos verifică dacă există sau nu un fișier cu numele Test.xlsx în folderul specificat.
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
Exemplul 2: Crearea unui dosar nou în locația specificată
Codul de mai jos va crea un dosar cu numele „Test” în unitatea C a sistemului meu (va trebui să specificați calea de pe sistemul dumneavoastră unde doriți să creați dosarul).
Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectMyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End Sub
În timp ce acest cod funcționează bine, ar afișa o eroare în cazul în care folderul există deja.
Codul de mai jos verifică dacă folderul există deja și creează un folder dacă nu există. În cazul în care dosarul există deja, acesta afișează un mesaj. Pentru a verifica dacă dosarul există, am folosit metoda FolderExists a FSO.
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
Exemplul 3: Obținerea unei liste a tuturor fișierelor dintr-un dosar
Codul de mai jos ar arăta numele tuturor fișierelor din dosarul specificat.
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
Acest cod este un pic mai complex decât cele pe care le-am văzut deja.
Așa cum am menționat mai sus în acest tutorial, atunci când faceți referire la ‘Microsoft Scripting Runtime Library’, puteți folosi FileSystemObject, precum și toate celelalte obiecte (cum ar fi Files și Folders).
În codul de mai sus, folosesc trei obiecte – FileSystemObject, File și Folder. Acest lucru îmi permite să trec prin fiecare fișier din dosarul specificat. Apoi folosesc proprietatea name pentru a obține lista cu toate numele fișierelor.
Rețineți că folosesc Debug.Print pentru a obține numele tuturor fișierelor. Aceste nume vor fi listate în fereastra imediată din editorul VB.
Exemplul 4: Obținerea listei tuturor subfolderelor dintr-un dosar
Codul de mai jos va oferi numele tuturor subfolderelor din dosarul specificat. Logica este exact aceeași cu cea abordată în exemplul de mai sus. În loc de fișiere, în acest cod, am folosit subfoldere.
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
Exemplul 5: Copierea unui fișier dintr-un loc în altul
Codul de mai jos va copia fișierul din folderul „Sursă” și îl va copia în folderul „Destinație”.
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
În codul de mai sus, am folosit două variabile – SourceFile și DestinationFolder.
File sursă conține adresa fișierului pe care vreau să-l copiez, iar variabila DestinationFolder conține adresa folderului în care vreau ca fișierul să fie copiat.
Rețineți că nu este suficient să dați numele folderului de destinație atunci când copiați un fișier. Trebuie să specificați și numele fișierului. Puteți utiliza același nume de fișier sau îl puteți modifica. În exemplul de mai sus, am copiat fișierul și l-am numit SampleFileCopy.xlsx
Exemplul 6: Copierea tuturor fișierelor dintr-un dosar în altul
Codul de mai jos va copia toate fișierele din dosarul sursă în dosarul de destinație.
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
Codul de mai sus va copia toate fișierele din folderul Sursă în folderul Destinație.
Rețineți că, în metoda MyFSO.CopyFile, am specificat că proprietatea „Overwritefiles” este False (aceasta este True în mod implicit). Acest lucru se asigură că, în cazul în care aveți deja fișierul în dosar, acesta nu este copiat (și veți vedea o eroare). Dacă eliminați ‘Overwritefiles’ sau setați acest lucru la True, în cazul în care există fișiere în dosarul de destinație cu același nume, acestea vor fi suprascrise.
Dacă doriți să copiați numai fișierele cu o anumită extensie, puteți face acest lucru utilizând o instrucțiune IF Then pentru a verifica dacă extensia este xlsx sau nu.
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
Metode FileSystemObject (FSO)
Iată metodele pe care le puteți utiliza pentru fiecare obiect. Acest lucru este doar în scop de referință și nu vă îngrijorează prea mult. Utilizarea unora dintre acestea a fost prezentată în exemplele abordate mai sus.
Metode FSO | Pentru obiect | Descriere | |
DriveExists | Drive | Verifică dacă unitatea există sau nu | |
GetDrive | Drive | Întoarce o instanță a obiectului unitate pe baza traseului specificat | |
GetDriveName | Drive | Întoarce numele unității | |
BuildPath | File/Folder | Generează o cale de acces dintr-o cale existentă și un nume | |
CopyFile | File/Folder | Copiază un fișier | |
GetAbsolutePathName | File/Folder | Întoarce reprezentarea canonică a căii de acces | |
GetBaseName | File/Folder | Întoarce numele de bază al unei căi de acces. De exemplu, „D:\TestFolder\TestFile.xlsm” va returna TextFile.xlsm | |
GetTempName | File/Folder | Generează un nume care poate fi folosit pentru a denumi un fișier temporar | |
CopyFolder | Folder | Copiază un folder dintr-o locație în altă locație | |
CreateFolder | Folder | Creează un dosar nou | |
DeleteFolder | Folder | Elimină dosarul specificat | |
FolderExists | Folder | Verifică dacă dosarul există sau nu | |
GetFolder | Folder | Întoarce o instanță a obiectului folder pe baza căii specificate | |
GetParentFolderName | Folder | Întoarce numele folderului părinte pe baza căii specificate | |
GetSpecialFolder | Folder | Obține locația diferitelor foldere de sistem. | |
MoveFolder | Folder | Mută un folder dintr-o locație în alta | |
DeleteFile | File | Șterge un fișier | |
FileExists | File | Verifică dacă un fișier există sau nu | |
GetExtensionName | File | Întoarce extensia fișierului | |
GetFile | File | File | Întoarce instanța unui fișier pe baza căii specificate |
GetFileName | File | Returnează numele fișierului | |
GetFileVersion | File | Returnează versiunea fișierului | |
MoveFile | File | Mută un fișier | |
CreateTextFile | File | Creează un fișier text | |
GetStandardStream | File | Returnează intrarea standard, output sau error stream | |
OpenTextFile | File | Deschideți un fișier ca un TextStream |
Vă pot plăcea și următoarele tutoriale Excel:
- Obținerea unei liste de nume de fișiere din foldere & Subfoldere (utilizând Power Query).
- Obțineți lista de nume de fișiere dintr-un dosar în Excel (cu și fără VBA).
- Înțelegerea tipurilor de date Excel VBA (variabile și constante).
- Crearea unei funcții definite de utilizator (UDF) în Excel VBA.
.