VBA FileSystemObject (FSO) kasutamine Excelis - lihtne ülevaade ja näited

Kui kasutame Excelis VBA -d, on suurem osa sellest meie ülesannete automatiseerimine.

See tähendab ka seda, et enamasti töötame lahtrite ja vahemike, töölehtede, töövihikute ja muude objektidega, mis on Exceli rakenduse osa.

Kuid VBA on palju võimsam ja seda saab kasutada ka väljaspool Excelit toimuvaga töötamiseks.

Selles õpetuses näitan teile, kuidas kasutada VBA FileSystemObject (FSO) süsteemi või võrguketaste failide ja kaustadega töötamiseks.

Mis on VBA FileSystemObject (FSO)?

FileSystemObject (FSO) võimaldab teil pääseda juurde oma arvuti failisüsteemile. Seda kasutades pääsete juurde ja saate muuta arvutisüsteemi faile/kaustu/katalooge.

Näiteks allpool on mõned asjad, mida saate Excel VBA FileSystemObjecti abil teha:

  • Kontrollige, kas fail või kaust on olemas.
  • Kaustade/failide loomine või ümbernimetamine.
  • Hankige kausta kõigi failinimede (või alamkaustade nimede) loend.
  • Failide kopeerimine ühest kaustast teise.

Loodan, et saate ideest aru.

Ma käsitlen kõiki neid ülaltoodud näiteid (pluss veel) hiljem selles õpetuses.

Kuigi mõnda ülalmainitud asja saab teha ka traditsiooniliste VBA -funktsioonide (näiteks DIR -funktsiooni) ja meetodite abil, toob see kaasa pikemad ja keerukamad koodid. FileSystemObject muudab failide ja kaustadega töötamise lihtsaks, hoides koodi puhtana ja lühikesena.

Märkus. FSO -d saab kasutada ainult Excel 2000 ja uuemates versioonides.

Millistele kõigile objektidele pääsete juurde FileSystemObjecti kaudu?

Nagu ma eespool mainisin, saate failidele ja kaustadele juurde pääseda ja neid muuta, kasutades VBA FileSystemObjecti.

Allpool on tabel, mis näitab kõige olulisemad objektid, millele pääsete juurde ja mida saate FSO abil muuta:

Objekt Kirjeldus
Sõida Drive Object võimaldab teil saada teavet draivi kohta, näiteks kas see on olemas või mitte, selle tee nimi, draivi tüüp (eemaldatav või fikseeritud), selle suurus jne.
Kaust Kaustaobjekt võimaldab teil oma süsteemis kaustu luua või muuta. Näiteks saate selle objekti abil kaustu luua, kustutada, ümber nimetada, kopeerida.
Fail File Object võimaldab teil töötada süsteemis olevate failidega. Näiteks saate selle objekti abil faile luua, avada, kopeerida, teisaldada ja kustutada.
TextStream TextStreami objekt võimaldab teil luua või lugeda tekstifaile.

Igal ülaltoodud objektil on meetodid, mille abil saate nendega töötada.

Näiteks kui soovite kausta kustutada, kasutage objekti Folder meetodit DeleteFolder. Samamoodi, kui soovite faili kopeerida, kasutate objekti File meetodit CopyFile.

Ärge muretsege, kui see tundub üle jõu käiv või raskesti mõistetav. Saate palju paremini aru, kui vaatate läbi näiteid, mida olen selles õpetuses käsitlenud.

Lihtsalt viitamise eesmärgil olen selle õpetuse lõpus käsitlenud kõiki FileSystemObject meetodeid (iga objekti kohta).

FileSystemObjecti lubamine Excel VBA -s

FileSystemObject pole Exceli VBA -s vaikimisi saadaval.

Kuna meil on tegemist failide ja kaustadega, mis asuvad väljaspool Exceli rakendust, peame esmalt looma viite kogule, mis neid objekte (kettad, failid, kaustad) hoiab.

Nüüd saate Excel VBA -s FileSystemObjecti kasutamist alustada kahel viisil:

  1. Viite seadmine Microsofti skriptimise käitusajale (Scrrun.dll)
  2. Raamatukogule viitava objekti loomine koodist endast

Kuigi mõlemad meetodid töötavad (ja näitan teile, kuidas seda järgmisena teha), soovitan kasutada esimest meetodit.

Märkus. Kui lubate FileSystemObject, pääsete juurde kõigile selle objektidele. See hõlmab FileSystemObject, Drive, Files, Folders jne. Keskendun selles õpetuses peamiselt FileSystemObject'ile.

Viite seadmine Microsofti skriptimise käitusajale

Kui loote viite skriptimise käitusajale, lubate Excel VBA -l juurdepääsu kõikidele failide ja kaustade atribuutidele ja meetoditele. Kui see on tehtud, saate viidata failide/kaustade/draivide objektile Exceli VBA -st (täpselt nagu saate viidata lahtritele, töölehtedele või töövihikutele).

Allpool on toodud sammud viite loomiseks Microsofti skriptimise käitusajale.

  1. Klõpsake VB redaktoris nuppu Tööriistad.
  2. Klõpsake valikul Viited.
  3. Avanevas dialoogiboksis Viited kerige saadaolevaid viiteid ja märkige valik „Microsoft Scripting Runtime”.
  4. Klõpsake nuppu OK.

Ülaltoodud sammud võimaldavad teil nüüd viidata Excel VBA FSO objektidele.

FileSystemObject eksemplari loomine koodis

Kui olete viite Scripting FileSystemObject raamatukogule määranud, peate oma koodis looma FSO objekti eksemplari.

Kui see on loodud, saate seda VBA -s kasutada.

Allpool on kood, mis määrab objektimuutuja MyFSO FileSystemObject objektiks:

Sub CreatingFSO () Dim MyFSO kui FileSystemObject Set MyFSO = Uus FileSystemObject End Sub

Selles koodis olen esmalt deklareerinud muutuja MyFSO FileSystemObject tüüpi objektiks. See on võimalik ainult seetõttu, et olen loonud viite Microsofti skriptimise käitusajale. Kui viidet ei looda, annab see teile vea (kuna Excel ei tunne ära, mida FileSystemObject tähendab).

Teises reas juhtub kaks asja:

  1. UUS märksõna loob FileSystemObject eksemplari. See tähendab, et nüüd saan failide ja kaustadega töötamiseks kasutada kõiki FileSystemObjecti meetodeid. Kui te seda eksemplari ei loo, ei pääse te FSO meetoditele juurde.
  2. Märksõna SET määrab objektile MyFSO selle uue FileSystemObject eksemplari. See võimaldab mul seda objekti kasutada failidele ja kaustadele juurdepääsemiseks. Näiteks kui mul on vaja luua kaust, saan kasutada meetodit MyFSO.CreateFolder.

Soovi korral saate ülaltoodud kaks väidet ka üheks ühendada, nagu allpool näidatud.

Sub CreatingFSO () Dim MyFSO kui uus FileSystemObject End Sub

Selle meetodi (milleks on viide Microsoft Scripting Runtime Library -le) kasutamisel on suur eelis see, et kui kasutate oma koodis FSO -objekte, saate kasutada funktsiooni IntelliSense, mis näitab seotud meetodeid ja atribuute objekt (nagu allpool näidatud).

See pole võimalik, kui loote viite koodi seest (käsitletakse järgnevalt).

Objekti loomine koodist

Teine viis viite loomiseks FSO -le on seda teha koodist. Selle meetodi puhul ei pea te viiteid looma (nagu eelmises meetodis).

Koodi kirjutades saate luua koodi seest objekti ja viidata Scripting.FileSystemObject.

Allolev kood loob objekti FSO ja teeb sellest faili tüübi FileSystemObject.

Sub FSODemo () Dim FSO objektikomplektina FSO = CreateObject ("Scripting.FileSystemObject") Lõpu alam

Kuigi see võib tunduda mugavam, on selle meetodi kasutamisel suur negatiivne külg see, et see ei näita FSO objektidega töötamisel IntelliSense'i. Minu jaoks on see tohutu negatiivne ja soovitan alati kasutada eelmist FSO lubamise meetodit (milleks on viide Microsofti skriptimise kestusele)

VBA FileSystemObject näited

Nüüd sukeldume ja vaatame mõningaid praktilisi näiteid FileSystemObjecti kasutamise kohta Excelis.

Näide 1: kontrollige, kas fail või kaust on olemas

Järgmine kood kontrollib, kas kaust nimega „Test” on olemas või mitte (määratud kohas).

Kui kaust on olemas, on IF -tingimus tõene ja kuvatakse sõnumikastis teade „Kaust on olemas”. Ja kui seda pole olemas, näitab see sõnumit - kausta pole olemas ”.

Sub CheckFolderExist () Dim MyFSO kui FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Siis MsgBox "Kaust on olemas" Muu MsgBox "Kaust ei eksisteeri" Lõpp kui lõpp Sub

Samamoodi saate kontrollida ka faili olemasolu või mitte.

Allolev kood kontrollib, kas määratud kaustas on fail nimega Test.xlsx või mitte.

Alam CheckFileExist () Dim MyFSO kui FileSystemObject Määra MyFSO = Uus FileSystemObject Kui MyFSO.FileExists ("C: \ Users \ sumit \ Desktop \ Test \ Test.xlsx") Siis MsgBox "Fail on olemas" Muu MsgBox "Faili pole olemas "Lõpeta, kui lõpeb alam

Näide 2: looge määratud asukohas uus kaust

Allolev kood looks minu süsteemi C -draivi kausta nimega „Test” (peate määrama oma süsteemi tee, kuhu soovite kausta luua).

Sub CreateFolder () Dim MyFSO kui FileSystemObject Set MyFSO = Uus FileSystemObject MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test") Lõpu alam

Kuigi see kood töötab hästi, näitaks see viga, kui kaust on juba olemas.

Allolev kood kontrollib, kas kaust on juba olemas, ja loob kausta, kui seda pole. Kui kaust on juba olemas, kuvatakse sellel teade. Kausta olemasolu kontrollimiseks olen kasutanud FolderExists meetod FSO -st.

Sub CreateFolder () Dim MyFSO kui FileSystemObject Set MyFSO = Uus FileSystemObject Kui MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Siis MsgBox "Kaust on juba olemas" Else MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test ") End If End Sub

Näide 3: hankige kausta kõigi failide loend

Allpool olev kood näitaks kõigi määratud kausta failide nimesid.

Alamfaile GetFileNames () Dim MyFSO kui FileSystemObject Dim MyFile kui faili Dim MyFolder kaustana Määra MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") iga MyFile kataloogis MyFolder. Silumine. Prindi MyFile. Nimi Järgmine MyFile End Sub

See kood on natuke keerulisem kui need, mida oleme juba näinud.

Nagu ma selles õpetuses eespool mainisin, saate Microsofti skriptimise käitusajale viidates kasutada FileSystemObjecti ja kõiki teisi objekte (nt failid ja kaustad).

Ülaltoodud koodis kasutan kolme objekti - FileSystemObject, File ja Folder. See võimaldab mul vaadata kõiki määratud kausta faile. Seejärel kasutan nime atribuuti kõigi failinimede loendi saamiseks.

Pange tähele, et ma kasutan Debug.Print kõigi failide nimede saamiseks. Need nimed loetletakse VB redaktori vahetus aknas.

Näide 4: hankige kausta kõigi alamkaustade loend

Allolev kood annab kõigi määratud kausta alamkaustade nimed. Loogika on täpselt sama, mis ülaltoodud näites. Failide asemel oleme selles koodis kasutanud alamkaustu.

Alam GetSubFolderNames () Dim MyFSO kui FileSystemObject Dim MyFile failina Dim DimFoole kaustana Dim MySubFolder kui kaustade komplekt MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop My Test") MyFolder.SubFolders silumine. Printige MySubFolder. Nimi Järgmine MySubFolder End Sub

Näide 5: faili kopeerimine ühest kohast teise

Allolev kood kopeerib faili kaustast „Allikas” ja kopeerib selle kausta „Sihtkoht”.

Sub CopyFile () Dim MyFSO kui FileSystemObject Dim SourceFile Stringina Dim DestinationFolder kui string Määra MyFSO = New Scripting.FileSystemObject SourceFile = "C: \ Users \ sumit \ Desktop \ Source \ SampleFile.xlsx" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "MyFSO.CopyFile Allikas: = SourceFile, Destination: = DestinationFolder &" \ SampleFileCopy.xlsx "End Sub

Ülaltoodud koodis olen kasutanud kahte muutujat - SourceFile ja DestinationFolder.

Lähtefail hoiab kopeeritava faili aadressi ja muutuja DestinationFolder kausta, kuhu soovin faili kopeerida.

Pange tähele, et faili kopeerimisel ei piisa sihtkausta nime andmisest. Samuti peate määrama faili nime. Võite kasutada sama failinime või seda ka muuta. Ülaltoodud näites kopeerisin faili ja panin sellele nime SampleFileCopy.xlsx

Näide 6: kopeerige kõik failid ühest kaustast teise

Allolev kood kopeerib kõik failid kaustast Allikas sihtkausta.

Sub CopyAllFiles () Dim MyFSO kui FileSystemObject Dim MyFile failina Dim SourceFolder kui string Dim DestinationFolder String Dim MyFolder kaustana 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) Iga MyFile'i jaoks MyFolder.Files MyFSO.CopyFile Allikas: = MyFSO.GetFile (MyFile), _ Destination: =" Destination: " "& MyFile.Name, Overwritefiles: = False Next MyFile End Sub

Ülaltoodud kood kopeerib kõik failid kaustast Allikas sihtkoha kausta.

Pange tähele, et meetodis MyFSO.CopyFile olen määranud atribuudi „Overwritefiles” väärtuseks Väär (see on vaikimisi tõene). See tagab, et kui teil on fail juba kaustas, ei kopeerita seda (ja näete viga). Kui eemaldate „Ülekirjutamise failid” või määrate selle väärtuseks Tõene, kirjutatakse need juhul, kui sihtkaustas on sama nimega faile, üle.

Pro näpunäide: Failide kopeerimisel on alati võimalus failid üle kirjutada. Sel juhul on hea mõte lisada ajaleht koos nimega. See tagab, et nimed on alati erinevad ja saate hõlpsalt jälgida, millised failid mis ajal kopeeriti.

Kui soovite kopeerida ainult teatud laiendi faile, saate seda teha IF -lause abil, et kontrollida, kas laiend on xlsx või mitte.

Sub CopyExcelFilesOnly () Dim MyFSO kui FileSystemObject Dim MyFile kui File Dim SourceFolder kui String Dim DestinationFolder String Dim MyFolder kaustana Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Us: sumit \ Desktop \ Destination "Määra MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) Iga MyFile'i kohta MyFolder.Files If MyFSO.GetExtensionName (MyFile) =" xlsx "Siis MyFSO.CopyFileGap: (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = False End If Next MyFile End Sub

FileSystemObject (FSO) meetodid

Siin on meetodid, mida saate iga objekti jaoks kasutada. See on ainult viitamiseks ja ei muretse selle pärast liiga palju. Mõne neist kasutamist on näidatud ülaltoodud näidetes.

FSO meetodid Objekti jaoks Kirjeldus
DriveExists Sõida Kontrollib, kas draiv on olemas või mitte
GetDrive Sõida Tagastab draivi objekti eksemplari määratud tee alusel
GetDriveName Sõida Käivitab ajami nime uuesti
BuildPath Fail/kaust Looge tee olemasolevast teest ja nimest
CopyFile Fail/kaust Kopeerib faili
GetAbsolutePathName Fail/kaust Tagastage tee kanooniline esitus
GetBaseName Fail/kaust Tagastab baasnime teelt. Näiteks "D: \ TestFolder \ TestFile.xlsm" tagastab tekstifaili.xlsm
GetTempName Fail/kaust Looge nimi, mida saab kasutada ajutise faili nimetamiseks
CopyFolder Kaust Kopeerib kausta ühest asukohast teise
Loo kaust Kaust Loob uue kausta
Kustuta kaust Kaust Kustutab määratud kausta
Kaust Olemas Kaust Kontrollib, kas kaust on olemas või mitte
GetFolder Kaust Tagastab määratud tee põhjal kaustaobjekti eksemplari
GetParentFolderName Kaust Taaskäivitab emakausta nime määratud tee alusel
GetSpecialFolder Kaust Hankige erinevate süsteemikaustade asukohad.
MoveFolder Kaust Teisaldab kausta ühest kohast teise
Kustuta fail Fail Kustutab faili
FileExists Fail Kontrollib, kas fail on olemas või mitte
GetExtensionName Fail Tagastab faililaiendi
GetFile Fail Tagastab määratud tee põhjal failiobjekti eksemplari
GetFileName Fail Tagastab faili nime
GetFileVersion Fail Tagastab faili versiooni
MoveFile Fail Teisaldab faili
CreateTextFile Fail Loob tekstifaili
GetStandardStream Fail Hankige standardne sisend, väljund või vea voog
OpenTextFile Fail Avage fail TextStreamina
wave wave wave wave wave