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:
- Viite seadmine Microsofti skriptimise käitusajale (Scrrun.dll)
- 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.
- Klõpsake VB redaktoris nuppu Tööriistad.
- Klõpsake valikul Viited.
- Avanevas dialoogiboksis Viited kerige saadaolevaid viiteid ja märkige valik „Microsoft Scripting Runtime”.
- 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:
- 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.
- 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 |