Korištenje VBA FileSystemObject (FSO) u Excelu - jednostavan pregled i primjeri

Kad koristimo VBA u Excelu, većina je to automatiziranje naših zadataka.

To također znači da većinu vremena radimo s ćelijama i rasponima, radnim listovima, radnim knjigama i drugim objektima koji su dio Excel aplikacije.

No VBA je mnogo moćniji i također se može koristiti za rad sa stvarima izvan Excela.

U ovom ću vam vodiču pokazati kako koristiti VBA FileSystemObject (FSO) za rad s datotekama i mapama na vašem sustavu ili mrežnim pogonima.

Što je VBA FileSystemObject (FSO)?

FileSystemObject (FSO) omogućuje vam pristup datotečnom sustavu vašeg računala. Pomoću nje možete pristupiti datotekama/mapama/direktorijima u svom računalnom sustavu i mijenjati ih.

Na primjer, u nastavku su neke stvari koje možete učiniti pomoću FileSystemObject u Excelu VBA:

  • Provjerite postoji li datoteka ili mapa.
  • Stvaranje ili preimenovanje mapa/datoteka.
  • Dobijte popis svih naziva datoteka (ili naziva podmapa) u mapi.
  • Kopirajte datoteke iz jedne mape u drugu.

Nadam se da ste shvatili ideju.

Kasnije ću u ovom vodiču pokriti sve ove gore navedene primjere (plus još njih).

Iako se neke od gore navedenih stvari mogu učiniti i pomoću tradicionalnih VBA funkcija (poput funkcije DIR) i metoda, to bi dovelo do dužih i složenijih kodova. FileSystemObject olakšava rad s datotekama i mapama, a da kod ostane čist i kratak.

Napomena: FSO se može koristiti samo u Excelu 2000 i novijim verzijama.

Kojim svim objektima možete pristupiti putem FileSystemObject?

Kao što sam gore spomenuo, datotekama i mapama možete pristupiti i mijenjati ih pomoću FileSystemObject u VBA.

Dolje je tablica koja prikazuje najvažnije objekte kojima možete pristupiti i izmijeniti ih pomoću FSO -a:

Objekt Opis
Voziti Objekt pogona omogućuje vam dobivanje informacija o pogonu, primjerice postoji li ili ne, naziv putanje, vrsta pogona (uklonjiva ili fiksna), veličina itd.
Mapa Objekt mape omogućuje vam stvaranje ili izmjenu mapa u vašem sustavu. Na primjer, pomoću ovog objekta možete stvarati, brisati, preimenovati, kopirati mape.
Datoteka File Object omogućuje rad s datotekama u vašem sustavu. Na primjer, pomoću ovog objekta možete stvarati, otvarati, kopirati, premještati i brisati datoteke.
Tekstualni tok Objekt TextStream omogućuje vam stvaranje ili čitanje tekstualnih datoteka.

Svaki od gore navedenih objekata ima metode koje možete koristiti za rad s njima.

Na primjer, ako želite izbrisati mapu, upotrijebit ćete metodu DeleteFolder objekta Folder. Slično, ako želite kopirati datoteku, upotrijebit ćete metodu CopyFile objekta File.

Ne brinite ako vam se ovo čini preteškim ili ga je teško razumjeti. Mnogo ćete bolje razumjeti kada prođete kroz primjere koje sam opisao u ovom vodiču.

Samo kao referencu, obradio sam sve metode FileSystemObject (za svaki objekt) na kraju ovog vodiča.

Omogućavanje FileSystemObject u Excelu VBA

FileSystemObject nije zadano dostupan u Excel VBA.

Budući da imamo posla s datotekama i mapama koje su izvan Excel aplikacije, prvo moramo stvoriti referencu na knjižnicu koja sadrži te objekte (pogone, datoteke, mape).

Sada postoje dva načina na koja možete početi koristiti FileSystemObject u Excelu VBA:

  1. Postavljanje reference na Microsoft Scripting Runtime Library (Scrrun.dll)
  2. Stvaranje objekta za pozivanje na knjižnicu iz samog koda

Iako obje ove metode djeluju (a ja ću vam kasnije pokazati kako to učiniti), preporučujem korištenje prve metode.

Napomena: Kada omogućite FileSystemObject, možete pristupiti svim objektima u njemu. To uključuje FileSystemObject, Disk, Datoteke, Mape itd. U ovom ću se vodiču usredotočiti uglavnom na FileSystemObject.

Postavljanje reference na Microsoft Scripting Runtime Library

Kada kreirate referencu na Scripting Runtime Library, dopuštate programu Excel VBA pristup svim svojstvima i metodama datoteka i mapa. Nakon što to učinite, možete se pozvati na objekt datoteke/mape/pogoni iz programa Excel VBA (baš kao što možete uputiti ćelije, radne listove ili radne knjige).

U nastavku su navedeni koraci za stvaranje reference na Microsoft Scripting Runtime Library:

  1. U uređivaču VB kliknite Alati.
  2. Kliknite na Reference.
  3. U dijaloškom okviru Reference koji se otvori pomaknite se kroz dostupne reference i provjerite opciju ‘Microsoft Scripting Runtime’.
  4. Pritisnite U redu.

Gore navedeni koraci sada bi vam omogućili upućivanje na FSO objekte iz programa Excel VBA.

Stvaranje instance koda FileSystemObject u kodu

Nakon što postavite referencu na biblioteku Scripting FileSystemObject, morate stvoriti instancu FSO objekta u svom kodu.

Nakon što je ovo stvoreno, možete ga koristiti u VBA.

Ispod je kôd koji će postaviti varijablu objekta MyFSO kao objekt FileSystemObject:

Pod StvaranjeFSO () Dim MyFSO kao FileSystemObject Set MyFSO = Novi FileSystemObject Kraj Sub

U ovom sam kodu najprije deklarirao varijablu MyFSO kao objekt tipa FileSystemObject. To je moguće samo zato što sam stvorio referencu na Microsoft Scripting Runtime Library. Ako referenca nije stvorena, ovo će vam dati pogrešku (jer Excel ne bi prepoznao što FileSystemObject znači).

U drugom retku događaju se dvije stvari:

  1. Ključna riječ NEW stvara instancu FileSystemObject. To znači da sada mogu koristiti sve metode FileSystemObject za rad s datotekama i mapama. Ako ne izradite ovu instancu, nećete moći pristupiti metodama FSO -a.
  2. Ključna riječ SET postavlja objekt MyFSO na ovu novu instancu FileSystemObject. To mi omogućuje korištenje ovog objekta za pristup datotekama i mapama. Na primjer, ako moram stvoriti mapu, mogu koristiti metodu MyFSO.CreateFolder.

Ako želite, također možete kombinirati gornje dvije izjave u jednu kao što je prikazano u nastavku:

Pod StvaranjeFSO () Zatamni MyFSO kao novi Završni podmeni FileSystemObject

Velika prednost korištenja ove metode (a to je postavljanje reference na Microsoft Scripting Runtime Library) jest to što ćete, kada koristite FSO objekte u svom kodu, moći koristiti značajku IntelliSense koja prikazuje metode i svojstva povezana s objekt (kao što je prikazano u nastavku).

To nije moguće kada kreirate referencu unutar koda (dalje u tekstu).

Stvaranje objekta iz koda

Drugi način za stvaranje referenci na FSO je da to učinite iz koda. U ovoj metodi ne morate stvarati nikakve reference (kao što je učinjeno u prethodnoj metodi).

Kada pišete kôd, možete stvoriti objekt unutar koda i uputiti se na Scripting.FileSystemObject.

Donji kod stvara objekt objekta FSO, a zatim ga čini tipom FileSystemObject.

Sub FSODemo () Dim FSO As Set Object FSO = CreateObject ("Scripting.FileSystemObject") Kraj Sub

Iako se ovo može činiti prikladnijim, veliki nedostatak korištenja ove metode je što ne prikazuje IntelliSense kada radite s objektima u FSO -u. Za mene je ovo veliki negativni utjecaj i uvijek preporučujem korištenje prethodne metode omogućavanja FSO -a (a to je postavljanjem reference na "Microsoft Scripting Runtime")

Primjeri VBA FileSystemObject

Hajdemo sada zaroniti i pogledati neke praktične primjere korištenja FileSystemObject u Excelu.

Primjer 1: Provjerite postoji li datoteka ili mapa

Sljedeći će kôd provjeriti postoji li mapa s nazivom "Test" (na navedenom mjestu).

Ako mapa postoji, uvjet IF je True i prikazuje poruku - "Mapa postoji" u okviru za poruku. A ako ne postoji, prikazuje se poruka - Mapa ne postoji '.

Sub CheckFolderExist () Zatamni MyFSO kao FileSystemObject Postavi MyFSO = Novi FileSystemObject Ako MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Zatim MsgBox "Mapa postoji" Inače MsgBox "Mapa ne postoji" Završi ako završi Pod

Slično, možete provjeriti postoji li datoteka ili ne.

Kod u nastavku provjerava postoji li datoteka s imenom Test.xlsx u navedenoj mapi ili ne.

Sub CheckFileExist () Dim MyFSO kao FileSystemObject Set MyFSO = Novi FileSystemObject Ako MyFSO.FileExists ("C: \ Users \ sumit \ Desktop \ Test \ Test.xlsx") Zatim MsgBox "Datoteka postoji" Inače MsgBox "Datoteka ne postoji" "End If End Sub

Primjer 2: Napravite novu mapu na navedenom mjestu

Kod u nastavku stvorio bi mapu s imenom 'Test' na pogonu C mog sustava (morat ćete odrediti put na vašem sustavu na kojem želite stvoriti mapu).

Pod CreateFolder () Dim MyFSO kao FileSystemObject Set MyFSO = Novi FileSystemObject MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test") Kraj Sub

Iako ovaj kod radi dobro, pokazao bi pogrešku u slučaju da mapa već postoji.

Kod u nastavku provjerava postoji li mapa i stvara mapu ako ne postoji. U slučaju da mapa već postoji, prikazuje se poruka. Da bih provjerio postoji li mapa, upotrijebio sam FolderExists metoda FSO -a.

Sub CreateFolder () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Zatim MsgBox "Mapa već postoji" Inače MyFSO.CreateFolder ("C: \ Users \" sumit \ Desktop \ Test ") End If End Sub

Primjer 3: Nabavite popis svih datoteka u mapi

Kod u nastavku prikazao bi imena svih datoteka u navedenoj mapi.

Pod GetFileNames () Dim MyFSO kao FileSystemObject Dim MyFile kao File Dim MyFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") Za svaku MyFile u MyFolder.Fi. Debug.Print MyFile.Name Next MyFile End Sub

Ovaj je kod malo složeniji od onih koje smo već vidjeli.

Kao što sam gore spomenuo u ovom vodiču, kada se pozivate na "Microsoft Scripting Runtime Library", možete koristiti FileSystemObject kao i sve ostale objekte (poput datoteka i mapa).

U gornjem kodu koristim tri objekta - FileSystemObject, File i Folder. To mi omogućuje pregled svih datoteka u navedenoj mapi. Zatim koristim ime svojstva da dobijem popis svih naziva datoteka.

Imajte na umu da koristim Debug.Print za dobivanje imena svih datoteka. Ta će imena biti navedena u neposrednom prozoru u VB Editoru.

Primjer 4: Nabavite popis svih podmapa u mapi

Kôd u nastavku dat će imena svih podmapa u navedenoj mapi. Logika je potpuno ista kao što je opisano u gornjem primjeru. Umjesto datoteka, u ovom smo kodu koristili podmape.

Pod GetSubFolderNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Dim MySubFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop MySub \ Test \ Desktop \ Test \" U MyFolder.SubFolders Debug.Print MySubFolder.Name Sljedeće MySubFolder End Sub

Primjer 5: Kopirajte datoteku s jednog mjesta na drugo

Kod u nastavku kopirat će datoteku iz mape "Izvor" i kopirati je u mapu "Odredište".

Sub CopyFile () Dim MyFSO kao FileSystemObject Dim SourceFile As String Dim DestinationFolder As String Set MyFSO = New Scripting.FileSystemObject SourceFile = "C: \ Users \ sumit \ Desktop \ Source \ SampleFile.xlsx" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "MyFSO.CopyFile Izvor: = SourceFile, Destination: = DestinationFolder &" \ SampleFileCopy.xlsx "End Sub

U gornjem kodu koristio sam dvije varijable - SourceFile i DestinationFolder.

Izvorna datoteka sadrži adresu datoteke koju želim kopirati, a varijabla DestinationFolder sadrži adresu u mapu u koju želim kopirati datoteku.

Imajte na umu da prilikom kopiranja datoteke nije dovoljno dati naziv odredišne ​​mape. Također morate navesti naziv datoteke. Možete koristiti isti naziv datoteke ili ga možete promijeniti. U gornjem primjeru kopirao sam datoteku i dao joj ime SampleFileCopy.xlsx

Primjer 6: Kopirajte sve datoteke iz jedne mape u drugu

Kod u nastavku će kopirati sve datoteke iz izvorne mape u odredišnu.

Sub CopyAllFiles () Dim MyFSO Kao FileSystemObject Dim MyFile kao File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) Za svaki MyFile u MyFolder.Files MyFSO.CopyFile Izvor: = MyFSO.GetFile (MyFile), _ Odredište = & Odredište "& MyFile.Name, Overwritefiles: = False Next MyFile End Sub

Gornji kôd će kopirati sve datoteke iz izvorne mape u odredišnu mapu.

Imajte na umu da sam u metodi MyFSO.CopyFile naveo svojstvo ‘Overwritefiles’ kao False (ovo je prema zadanim postavkama True). To osigurava da se datoteka, ako već imate u mapi, ne kopira (i vidjet ćete pogrešku). Ako uklonite "Overwritefiles" ili postavite ovo na True, u slučaju da se u odredišnoj mapi nalaze datoteke s istim imenom, one će se prebrisati.

Profesionalni savjet: Prilikom kopiranja datoteka uvijek postoji mogućnost prepisivanja datoteka. U ovom je slučaju dobra ideja dodati vremensku oznaku zajedno s imenom. To će osigurati da su imena uvijek različita i da lako možete pratiti koje su datoteke kopirane u koje vrijeme.

Ako želite kopirati datoteke samo određenog proširenja, to možete učiniti pomoću naredbe IF Then kako biste provjerili je li proširenje xlsx ili ne.

Sub CopyExcelFilesOnly () Dim MyFSO Kao FileSystemObject Dim MyFile kao File Dim SourceFolder Kao String Dim DestinationFolder As String Dim MyFolder Kao mapa Dim MySubFolder kao mapa SourceFolder = "C: \ Users \ sumit \ Desktop \ Source \ DestinationFolder =" C: sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) Za svaki MyFile u MyFolder.Files Ako je MyFSO.GetExtensionName (MyFile) =" xlsx "Zatim MyFSO.CopyFile Izvor: (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = False End If Next MyFile End Sub

Metode FileSystemObject (FSO)

Evo metoda koje možete koristiti za svaki objekt. Ovo je samo za referencu i ne brine se previše oko toga. Upotreba nekih od njih prikazana je u gore navedenim primjerima.

FSO metode Za Objekt Opis
DriveExists Voziti Provjerava postoji li pogon ili ne
GetDrive Voziti Vraća instancu pogonskog objekta na temelju navedene staze
GetDriveName Voziti Ponavlja naziv pogona
BuildPath Datoteka/mapa Generirajte put iz postojećeg puta i imena
CopyFile Datoteka/mapa Kopira datoteku
GetAbsolutePathName Datoteka/mapa Vratite kanonski prikaz puta
GetBaseName Datoteka/mapa Vrati osnovni naziv s puta. Na primjer, "D: \ TestFolder \ TestFile.xlsm" vratit će TextFile.xlsm
GetTempName Datoteka/mapa Generirajte naziv koji se može koristiti za imenovanje privremene datoteke
CopyFolder Mapa Kopira mapu s jednog mjesta na drugo
CreateFolder Mapa Stvara novu mapu
Izbriši mapu Mapa Briše navedenu mapu
MapaPostoji Mapa Provjerava postoji li mapa ili ne
GetFolder Mapa Vraća instancu objekta mape na temelju navedene staze
GetParentFolderName Mapa Ponovno izvodi naziv nadređene mape na temelju navedene staze
GetSpecialFolder Mapa Saznajte lokaciju različitih mapa sustava.
Premjesti mapu Mapa Premješta mapu s jednog mjesta na drugo
Izbrisati dateoteku Datoteka Briše datoteku
Dokument postoji Datoteka Provjerava postoji li datoteka ili ne
GetExtensionName Datoteka Vraća ekstenziju datoteke
GetFile Datoteka Vraća instancu datotečnog objekta na temelju navedene staze
GetFileName Datoteka Vraća naziv datoteke
GetFileVersion Datoteka Vraća verziju datoteke
Premjesti datoteku Datoteka Premješta datoteku
CreateTextFile Datoteka Stvara tekstualnu datoteku
GetStandardStream Datoteka Dohvatite standardni ulaz, izlaz ili tok pogrešaka
OpenTextFile Datoteka Otvorite datoteku kao TextStream
wave wave wave wave wave