Uporaba FileSystemObject (FSO) v Excelu VBA
FileSystemObject (FSO) vam omogoča dostop do številnih funkcij za dostop do datotečnega sistema vašega računalnika. S tem predmetom lahko preprosto dostopate do datotek, map in pogonov ter tudi berete in pišete v datoteke.
Mnoge funkcije FSO bi lahko napisali v tradicionalnem VBA, vendar bi zahtevali več kodiranja, prihajajoči razvijalec pa bi jih težje vzdrževal in razumel. FSO je preizkušen API (vmesnik za programiranje aplikacij) in je bolj zanesljiv kot vaša koda. Je enostaven za uporabo, pripravljen in na voljo.
FSO deluje v skladu z mednarodnimi standardi in nastavitvami, ki jih imate v računalniku. Če svojo aplikacijo Excel distribuirate po vsem svetu, bo uporaba sistema FSO poskrbela za vse razlike v nastavitvah med državami, kar bi vaša koda imela težave.
FSO vam bo omogočil, da v kodi VBA naredite skoraj vse, kar lahko storite v Raziskovalcu datotek Windows. Omogoča popoln dostop do datotečnega sistema Windows.
Ustvarjanje FileSystemObject
FileSytemObject ni del Excelovega VBA. FSO lahko uporabite tako, da ustvarite objekt (pozna vezava) v VBA:
123 | Sub CreateFSO ()Nastavi MyFSO = CreateObject ("Scripting.FileSystemObject")End Sub |
Druga možnost je, da v knjižnico FSO dodate referenco v VBA. To se imenuje zgodnja vezava in je hitrejša od pozne vezave, saj predmeta ni treba ustvariti med izvajanjem kode.
Če želite dodati sklic, pritisnite Alt-F11, da vstopite v urejevalnik Visual Basic (VBE), nato pa v meniju VBE uporabite »Orodja | Reference«. To bo prikazalo pojavno okno, v katerem lahko izberete ustrezno referenco (glejte spodaj).
Pomaknite se navzdol po seznamu razpoložljivih referenc, dokler ne vidite »Microsoft Scripting Runtime«. Potrdite polje in kliknite V redu, knjižnica je zdaj del vaše aplikacije.
Datoteka knjižnice DLL se nahaja na lokaciji C: \ Windows \ SysWOW64 \ scrrun.dll
Če svojo aplikacijo distribuirate drugim sodelavcem ali lokacijam, je nujno, da imajo to datoteko na pravilnem mestu v svojem računalniku, sicer bo prišlo do napake v kodi.
V dogodek 'WorkbookOpen' je vredno vnesti past za napake z ukazom Dir, da preverite, ali datoteka obstaja. Če ni, pošljite opozorilno sporočilo in zaprite datoteko Excel.
Ko je referenca dodana, lahko za ustvarjanje FSO uporabite naslednjo kodo:
123 | Pod TestFSO ()Zatemni MyFSO kot nov FileSystemObjectEnd Sub |
Vsi primeri v tem članku bodo uporabili to metodologijo za ustvarjanje FSO.
FSO ima na voljo veliko metod in lastnosti. Ti so tukaj razdeljeni na odseke glede na to, kaj zmorejo.
Z uporabo metod "Obstaja"
Z metodo FSO lahko preverite, ali obstaja pogon, mapa ali datoteka. Te metode so enostavne za uporabo in zahtevajo le en parameter.
123456 | Sub CheckExistance ()Zatemni MyFSO kot nov FileSystemObjectMsgBox MyFSO.DriveExists ("C:")MsgBox MyFSO.FolderExists ("C: \ temp \")MsgBox MyFSO.FileExists ("C: \ temp \ testfile.txt")End Sub |
Vse te izjave bodo vrnile vrednost »True« ob predpostavki, da ima vaš računalnik pogon C: mapo, imenovano »Temp«, in datoteko v mapi Temp, imenovano »testfile.txt«
Besedilni nizi v parametrih ne razlikujejo med velikimi in malimi črkami. Pri nobeni od teh metod ne morete uporabiti nadomestnih znakov.
Za opis mape ali lokacije datoteke tudi ne morete uporabiti URL -jev (enotnih lokatorjev virov). FSO deluje izključno v operacijskem sistemu Windows in datotečnem sistemu v njem. Za lokacijo zunanjega strežnika morate najprej preslikati pogon na to in nato uporabiti samo pot pogona.
Z uporabo metod »Pridobite«
FSO ima številne načine za pridobivanje informacij o datoteki in poti, tako da razdeli pot in datoteko ali pridobi podatke o datoteki ali mapi, na primer datum ustvarjanja ali datum spremembe.
GetAbsolutePathname
To bo zagotovilo popolno pot od korena podanega pogona.
Sintaksa je:
GetAbsolutePathName (pathspec)
12345 | Sub AbsolutePath ()Zatemni MyFSO kot nov FileSystemObject, Pth kot nizPth = "c: …"MsgBox MyFSO.GetAbsolutePathName (Pth)End Sub |
To bo vrnilo niz "C: \ Users \ Richard \ Documents". To je zato, ker je bila pot podana kot C: sledijo tri pike. Vsaka pika pomeni naslednjo stopnjo v strukturi map.
GetBaseName
To vrne ime določene datoteke ali mape.
Sintaksa je:
GetBaseName(pot)
12345 | Sub BaseName ()Zatemni MyFSO kot nov FileSystemObject, Pth kot nizPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetBaseName (Pth)End Sub |
Ta koda bo vrnila "testfile". Metoda vrne zadnji odsek v imenu poti. Če gre za datoteko, potem ne vrne pripone datoteke.
Če poti ni mogoče najti, se vrne prazen niz.
GetDrive
To vam omogoča uporabo kode za dostop do informacij o pogonu glede na podano črko pogona.
Sintaksa je:
GetDrive (driverspec)
123456 | Sub DriveInfo ()Zatemni MyFSO kot nov FileSystemObject, Pth kot niz, Dr kot pogonPth = "C:"Nastavi Dr = MyFSO.GetDrive (Pth)MsgBox Dr.FreeSpaceEnd Sub |
Ta metoda vrne objekt pogona na podlagi podanega pogona. S tem predmetom lahko dostopate do informacij o pogonu, na primer prostega prostora.
Utrujen od iskanja primerov kode VBA? Preizkusite AutoMacro!
GetDriveName
Ta metoda bo ločila ime pogona od niza poti / imena datoteke.
Sintaksa je:
GetDriveName (pot)
12345 | Sub DriveName ()Zatemni MyFSO kot nov FileSystemObject, Pth kot nizPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetDriveName (Pth)End Sub |
To bo vrnilo "C:"
GetExtensionName
S tem se vrne pripona datoteke na podani poti.
Sintaksa je:
GetExtensionName (pot)
12345 | Sub ExtensionName ()Zatemni MyFSO kot nov FileSystemObject, Pth kot nizPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetExtensionName (Pth)End Sub |
To bo vrnilo "txt".
Če ni podana nobena datoteka, se vrne prazen niz.
GetFile
Ta metoda vrne datotečni objekt, ki vsebuje različne podatke o sami datoteki.
Sintaksa je:
GetFile (filespec)
123456 | Sub FileInfo ()Zatemni MyFSO kot nov FileSystemObject, Pth kot niz, Fn kot datotekoPth = "C: \ temp \ testfile.txt"Nastavite Fn = MyFSO.GetFile (Pth)MsgBox Fn.DateCreatedEnd Sub |
To vrne datum in čas, ko je bila določena datoteka ustvarjena. Če datoteka ni določena ali datoteka ne obstaja, se prikaže napaka »datoteke ni mogoče najti«.
12345 | Sub FileName ()Zatemni MyFSO kot nov FileSystemObject, Pth kot nizPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetFileName (Pth)End Sub |
To bo vrnilo datoteko »testfile.txt«.
GetFolder
To ustvari predmet mape za osnovno mapo na podani poti. Pot mora vsebovati samo imena map. Imena datotek ne smejo biti vključena, sicer bo prišlo do napake.
Sintaksa je:
GetFolder (folderspec)
123456 | PodmapaInfo ()Zatemni MyFSO kot nov FileSystemObject, Pth kot niz, Fo kot mapoPth = "C: \ temp"Nastavi Fo = MyFSO.GetFolder (Pth)MsgBox Fo.DateCreatedEnd Sub |
Objekt mape vsebuje različne informacije, do katerih lahko dostopate. V tem primeru vrne datum ustvarjanja mape.
To metodo lahko uporabite tudi za pridobivanje vseh imen datotek v dani mapi:
12345678 | Imena pod -datotek ()Zatemni MyFSO kot nov FileSystemObject, Pth kot niz, Fo kot mapo, Fn kot datotekoPth = "C: \ temp"Nastavi Fo = MyFSO.GetFolder (Pth)Za vsako datoteko Fn In Fo.FilesMsgBox Fn.NameNaprej FnEnd Sub |
Ta koda se bo ponavljala skozi mapo "Temp" in prikazala vsako najdeno ime datoteke.
GetParentFolderName
Ta metoda bo vrnila ime mape na naslednji stopnji v hierarhiji map.
Sintaksa je:
GetParentFolderName (pot)
12345 | Ime podmape ()Zatemni MyFSO kot nov FileSystemObject, Pth kot niz, Fo kot mapoPth = "C: \ users \ richard"MsgBox MyFSO.GetParentFolderName (Pth)End Sub |
To bo vrnilo "Uporabniki", saj je to "nadrejeni" za mapo "richard".
Programiranje VBA | Generator kod deluje za vas!
Z uporabo metod "Ustvari"
S FSO lahko ustvarite novo mapo in pot ter ustvarite besedilno datoteko.
Ustvari mapo
Določite lahko novo ime poti mape, ki jo želite ustvariti. Nevarnost tega je, da če mapa že obstaja, bo prišlo do napake. Če želite zagotoviti, da se to ne bo zgodilo, uporabite metodo "FolderExists".
Sintaksa je:
Ustvari mapo(ime mape)
1234567 | Sub CreateNewFolder ()Zatemni MyFSO kot nov FileSystemObject, Pth kot nizPth = "C: \ temp \ MyFolder"Če je MyFSO.FolderExists (Pth) = False PotemMyFSO.CreateFolder (Pth)Konec ČeEnd Sub |
Ta koda bo ustvarila novo mapo z imenom »Moja mapa« pod obstoječo potjo »C: \ temp«.
CreateTextFile
Ta metoda vam omogoča, da ustvarite preprosto besedilno datoteko in pišete neposredno vanjo.
Sintaksa je:
CreateTextFile (Ime datoteke, [ prepisati, [ unicode ]])
1234567 | Sub CreateTextFile ()Zatemni MyFSO kot nov FileSystemObject, Pth kot nizPth = "C: \ temp \ Myfile.txt"Nastavite Fn = MyFSO.CreateTextFile (Pth, True)Fn.Write "Dodaj svoje besedilo tukaj" & vbLf & "To je druga vrstica"Fn.ZapriEnd Sub |
Ta koda ustvari besedilno datoteko z imenom »Myfile.txt« v mapi »Temp« pogona »C:« in nato vanj zapiše dve vrstici besedila.
Upoštevajte, da je znak za vnos vrstice združen v niz, ki se zapisuje.
Če pot, na katero pišete, ne obstaja, bo prišlo do napake. Preden ustvarite datoteko, lahko to preverite z metodo 'FolderExists'.
Obstaja neobvezen parameter za prepis obstoječe datoteke, če je to potrebno - to je lahko True ali False. Privzeto je True.
Z uporabo metod "Kopiraj"
Te metode lahko uporabite za kopiranje datoteke ali mape na drugo mesto.
Programiranje VBA | Generator kod deluje za vas!
CopyFile
Ta metoda bo kopirala datoteko iz ene lokacije mape v drugo. Upoštevajte, da kopija ne bo uspela, če je na ciljni lokaciji nastavljen atribut samo za branje.
Sintaksa je:
CopyFile vir, cilj, [ prepisati ]
1234 | Sub CopyFile ()Zatemni MyFSO kot nov FileSystemObjectMyFSO.CopyFile "C: \ temp \*. Txt", "C: \ temp \ myfolder \", TrueEnd Sub |
Ta koda bo naredila kopijo vseh besedilnih (txt) datotek v "C: \ temp" v "C: \ temp \ myfolder \" in prepisala datoteko, kjer je to potrebno. Privzeta nastavitev za Overwrite je True.
Za imena datotek lahko uporabite zvezdico (*), za predstavitev posameznih znakov pa ne morete uporabiti nadomestnega znaka (?).
CopyFolder
S to metodo lahko kopirate celotno mapo z ene lokacije na drugo.
Sintaksa je:
CopyFolder vir, cilj, [ prepisati ]
1234 | Mapa podkopiranja ()Zatemni MyFSO kot nov FileSystemObjectMyFSO.CopyFolder "C: \ temp \*", "C: \ users \ richard \"End Sub |
Ta koda kopira vse mape in datoteke pod "C: \ temp" v "C: \ users \ richard". Nova ustvarjena mapa bo "C: \ users \ richard \ myfolder", saj je imela "C: \ temp" mapo v sebi imenovano "myfolder".
Pri uporabi te metode so možni štirje rezultati:
- Če cilj ne obstaja, se kopira izvorna mapa in vsebina.
- Če cilj že obstaja, pride do napake.
- Če je cilj mapa, se kopira izvorna mapa in njena vsebina. Napaka se bo pojavila, če je Overwrite nastavljeno na False in je v cilju že kopija datoteke.
- Če je cilj nastavljen samo na branje, bo prišlo do napake, če je prepis nastavljen na false.
Ta metoda se ustavi pri prvi napaki, na katero naleti. Nobenega odmika nobenega dejanja, ki je bilo uspešno, preden je prišlo do napake.
Z uporabo metod "Premakni"
Te metode lahko uporabite za premikanje datotek ali map na druga mesta. To je enako rezanju z enega mesta in lepljenju na drugo mesto. Upoštevajte, da če je datoteka, ki jo želite premakniti, odprta, potem metoda Move ne bo uspela z napako.
Premakni datoteko
Ta metoda se uporablja za premik določene datoteke na drugo mesto. Nadomestni znaki so dovoljeni v komponenti zadnje poti vira.
Sintaksa je:
Premakni datoteko vir, cilj
1234 | Sub MoveAFile ()Zatemni MyFSO kot nov FileSystemObjectMyFSO.MoveFile "C: \ temp \*", "C: \ temp \ myfolder"End Sub |
Ta koda premakne vse datoteke, najdene na 'C: \ temp', v 'C: \ temp \ myfolder'.
Izvorna in ciljna mapa morata obstajati, saj se ciljna mapa ne ustvari samodejno.
Ta metoda se ustavi pri prvi napaki, na katero naleti. Nobenega vračila ni nobenega dejanja, ki je bilo uspešno, preden je prišlo do napake.
Programiranje VBA | Generator kod deluje za vas!
Premakni mapo
Ta metoda premakne določeno mapo z ene lokacije na drugo.
Sintaksa je:
Premakni mapo (vir, cilj)
1234 | Sub MoveAFolder ()Zatemni MyFSO kot nov FileSystemObjectMyFSO.MoveFolder "C: \ temp \ myfolder", "C: \ temp \ mydestination"End Sub |
Ta koda premakne mapo "moja mapa" in vsebino v mapo "moja destinacija". 'Myfolder' se učinkovito izbriše in ustvari 'mydestination' skupaj z vsebino iz 'myfolder'.
Če ciljna mapa že obstaja, pride do napake.
Z uporabo metod "Izbriši"
Te metode se uporabljajo za brisanje datotek ali map. Uporabljati jih je treba previdno, saj ni možnosti vračanja ali razveljavitve, če gre kaj narobe.
DeleteFile
S tem se z nadomestnimi znaki izbrišejo posamezne datoteke ali skupina datotek.
Sintaksa je:
DeleteFile filespec, [ sila ]
1234 | Sub DeleteFiles ()Zatemni MyFSO kot nov FileSystemObjectMyFSO.DeleteFile "C: \ temp \*"End Sub |
Ta koda bo izbrisala vse datoteke v mapi 'C: \ temp'
Parameter Force ni obvezen in je nastavljen na True ali False. Če je nastavljeno na True, bodo datoteke samo za branje izbrisane. Privzeto je False.
Izbriši mapo
Ta metoda izbriše določeno mapo in njeno vsebino.
Sintaksa je:
Izbriši mapo folderspec, [ sila ]
1234 | Podbriši mape ()Zatemni MyFSO kot nov FileSystemObjectMyFSO.DeleteFolder "C: \ temp \ MyDestination"End Sub |
Ta koda bo izbrisala mapo "MyDestination" in vse datoteke v tej mapi. Mapa "temp" bo ostala.
Parameter Force ni obvezen in je nastavljen na True ali False. Če je nastavljeno na True, bodo mape samo za branje izbrisane. Privzeto je False.
Nadomestne znake lahko uporabite v zadnji komponenti poti. Če mape ne najdete, bo prišlo do napake.
Ta metoda se ustavi pri prvi napaki, na katero naleti. Nobenega odmika nobenega dejanja, ki je bilo uspešno, preden je prišlo do napake.
Programiranje VBA | Generator kod deluje za vas!
Druge metode v FSO
OpenAsTextStream.
Ta metoda odpre določeno datoteko kot objekt Text Stream in ji omogoča branje ali pisanje. Prednost te metode je, da lahko odpre katero koli vrsto datoteke in izvleče razpoložljivo besedilo.
Sintaksa je:
OpenAsTextStream ([ iomode, [ format ]])
Parameter ‘iomode’ omogoča samo branje (1), branje/pisanje (2) in dodajanje (8). Parameter branje/pisanje prepiše datoteko.
Parameter »format« je nastavljen na -2 za sistemske privzete vrednosti, -1 za odpiranje datoteke kot Unicode in 0 za odpiranje datoteke kot ASCII (ameriška standardna koda za izmenjavo informacij).
1234567891011 | Sub TextStream ()Zatemni MyFSO kot nov FileSystemObjectNastavite f = MyFSO.GetFile ("C: \ temp \ myfile.txt")Nastavi ts = f.OpenAsTextStream (2)ts.Napiši "Moje novo besedilo"ts.ZapriNastavi ts = f.OpenAsTextStream (1)s = ts.ReadLineMsgBox sts.ZapriEnd Sub |
Ta koda dobi obstoječo besedilno datoteko in jo ustvari kot objekt z metodo »GetFile«. Nato odpre tok besedila kot branje / pisanje (2) in zapiše vrstico besedila. Datoteka se nato zapre in znova odpre kot prebrana (1), iz nje pa se prebere vrstica, ki se nato prikaže kot polje s sporočilom.
Upoštevajte, da mora biti prebrana vrstica postavljena v spremenljivko, preden se lahko prikaže v polju za sporočila.
BuildPath
Ta metoda bo dodala ime mape ali datoteke na konec obstoječe poti mape. To ustvari samo besedilni niz in dejansko ne ustvari nove mape.
Sintaksa je:
BuildPath (pot, ime)
12345 | Sub BuildPth ()Zatemni MyFSO kot nov FileSystemObjectnp = MyFSO.BuildPath ("C: \ temp", "ANewFolder")MsgBox npEnd Sub |
Prikazalo se bo »C: \ temp \ ANewFolder«. Če pa želite dejansko uporabiti to mapo, morate uporabiti metodo 'CreateFolder'.
OpenTextFile
Ta metoda omogoča odpiranje in branje datotek ali pisanje v skladu z nastavljenimi parametri. Deluje na podoben način kot metoda OpenAsTextStream.
Sintaksa je:
OpenTextFile (Ime datoteke, [ iomode, [ ustvarite, [ format ]]])
Parameter ‘iomode’ omogoča ForReading, ForWriting in ForAppending. Parameter ForWriting prepiše datoteko.
Parameter 'create' je logična vrednost. True pomeni, da bo nova datoteka ustvarjena, če podano ime datoteke ne obstaja. False pomeni, da datoteka ne bo ustvarjena, če imena datoteke ne najdete. Privzeto je False.
Parameter »format« lahko nastavite na TristateFalse, TristateMixed, TristateTrue in TristateUseDefault, odvisno od tega, ali je datoteka ASCII ali Unicode.
1234567 | Sub OpenTxtFile ()Zatemni MyFSO kot nov FileSystemObjectNastavite ts = MyFSO.OpenTextFile ("C: \ temp \ myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.ZapriEnd Sub |
Ta koda bo prebrala vrstico iz besedilne datoteke "myfile.txt".
Prednost metode OpenTextFile pred metodo OpenAsTextStreamMethod je v tem, da ima spustne menije za parametre, ki so bolj smiselni, kot da si zapomnimo ustrezne številske vrednosti za različne možnosti parametrov.
Programiranje VBA | Generator kod deluje za vas!
Lastnosti FSO
Pogoni
Ta lastnost vsebuje zbirko razpoložljivih pogonov v vašem računalniku.
1234567 | Poddrv ()Zatemni MyFSO kot nov FileSystemObject, d kot pogonNastavite Dr = MyFSO.DrivesZa vsakega d V drMsgBox d.DriveLetterNaslednji dEnd Sub |
Ta koda bo vrnila vsako črko pogona, ki je na voljo v vašem računalniku.
Ime
To vrne ime določene datoteke ali mape.
123456789 | Podime Primer ()Zatemni MyFSO kot nov FileSystemObjectNastavite f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Name & "on Drive" & UCase (f.Drive) & vbCrLfi = i & "Ustvarjeno:" & f.DateCreated & vbCrLfi = i & "Zadnji dostop:" & f.DateLastAccessed & vbCrLfi = i & "Zadnja sprememba:" & f.DateLastModifiedMsgBox iEnd Sub |
Ta koda bo dala ime datoteke in podatke o njej z uporabo lastnosti Drive.
Pot
Lastnost Path bo ločila pot od specifikacije datoteke.
123456789 | Primer pod -poti ()Zatemni MyFSO kot nov FileSystemObjectNastavite f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Path & f.Name & "on Drive" & UCase (f.Drive) & vbCrLfi = i & "Ustvarjeno:" & f.DateCreated & vbCrLfi = i & "Zadnji dostop:" & f.DateLastAccessed & vbCrLfi = i & "Zadnja sprememba:" & f.DateLastModifiedMsgBox iEnd Sub |
Ta primer deluje na enak način kot primer Name, le da zdaj podaja pot do datoteke.
Programiranje VBA | Generator kod deluje za vas!
Velikost
Lastnost Size bo dala velikost mape ali datoteke.
12345 | Sub FSize ()Zatemni MyFSO kot nov FileSystemObjectNastavite f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.VelikostEnd Sub |
Zgornja koda bo vrnila velikost mape "C: \ temp \".
12345 | Sub FSize ()Zatemni MyFSO kot nov FileSystemObjectNastavite f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f.SizeEnd Sub |
Zgornja koda bo vrnila velikost datoteke »myfile.txt«.
Vrsta
Lastnost type bo vrnila besedilo za vrsto datoteke ali mape.
12345 | Podvrsta FType ()Zatemni MyFSO kot nov FileSystemObjectNastavite f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.TypeEnd Sub |
Zgornja koda bo vrnila besedilo »Datoteka mapa«.
12345 | Podvrsta FType ()Zatemni MyFSO kot nov FileSystemObjectNastavite f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f.TypeEnd Sub |
Zgornja koda bo vrnila besedilo „Besedilni dokument“.
Upoštevajte uporabo "GetFolder" in "GetFile" v vsakem primeru.