Utilizarea VBA FileSystemObject (FSO) în Excel – prezentare ușoară și exemple

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:

  1. Stabilirea referinței la Microsoft Scripting Runtime Library (Scrrun.dll)
  2. 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ă.

Nota: Când activați FileSystemObject, puteți accesa toate obiectele din el. Aceasta include FileSystemObject, Drive, Files, Folders, Folders, etc. În acest tutorial mă voi concentra în principal pe FileSystemObject.

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:

  1. În editorul VB, faceți clic pe Tools.
  2. Click pe References.
  3. În caseta de dialog References care se deschide, parcurgeți referințele disponibile și bifați opțiunea ‘Microsoft Scripting Runtime’.
  4. 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:

  1. 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.
  2. 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.

Sfat Pro: Atunci când copiați fișiere, există întotdeauna posibilitatea de a suprascrie fișiere. O idee bună, în acest caz, este să adăugați marca de timp împreună cu numele. Acest lucru va asigura că numele sunt întotdeauna diferite și puteți urmări cu ușurință ce fișiere au fost copiate la ce oră.

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.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.