Uporaba VBA FileSystemObject (FSO) v Excelu - enostaven pregled in primeri

Ko uporabljamo VBA v Excelu, je večina za avtomatizacijo naših nalog.

To tudi pomeni, da večino časa delamo s celicami in obsegi, delovnimi listi, delovnimi zvezki in drugimi predmeti, ki so del aplikacije Excel.

Toda VBA je veliko močnejša in se lahko uporablja tudi za delo z zunaj Excela.

V tej vadnici vam bom pokazal, kako uporabljati VBA FileSystemObject (FSO) za delo z datotekami in mapami na vašem sistemu ali omrežnih pogonih.

Kaj je VBA FileSystemObject (FSO)?

FileSystemObject (FSO) omogoča dostop do datotečnega sistema vašega računalnika. Z njim lahko dostopate do datotek/map/imenikov v računalniškem sistemu in jih spreminjate.

Spodaj je na primer nekaj stvari, ki jih lahko naredite z uporabo FileSystemObject v Excelu VBA:

  • Preverite, ali obstaja datoteka ali mapa.
  • Ustvarite ali preimenujte mape/datoteke.
  • Pridobite seznam vseh imen datotek (ali imen podmap) v mapi.
  • Kopirajte datoteke iz ene mape v drugo.

Upam, da razumete idejo.

Vse te zgornje primere (in še več) bom obravnaval kasneje v tej vadnici.

Čeprav je nekatere zgoraj omenjene stvari mogoče narediti tudi s tradicionalnimi funkcijami VBA (na primer funkcijo DIR) in metodami, bi to vodilo v daljše in bolj zapletene kode. FileSystemObject olajša delo z datotekami in mapami, hkrati pa ohrani kodo čisto in kratko.

Opomba: FSO je mogoče uporabljati samo v Excelu 2000 in novejših različicah.

Do katerih objektov lahko dostopate prek FileSystemObject?

Kot sem že omenil, lahko do datotek in map dostopate in jih spreminjate s pomočjo FileSystemObject v VBA.

Spodaj je tabela, ki prikazuje najpomembnejše predmete, do katerih lahko dostopate in jih spreminjate z uporabo FSO:

Objekt Opis
Vozi Drive Object vam omogoča, da dobite informacije o pogonu, na primer, ali obstaja ali ne, njegovo ime poti, vrsto pogona (odstranljivo ali fiksno), njegovo velikost itd.
Mapa Objekt mape vam omogoča ustvarjanje ali spreminjanje map v vašem sistemu. S tem predmetom lahko na primer ustvarite, izbrišete, preimenujete in kopirate mape.
mapa File Object vam omogoča delo z datotekami v vašem sistemu. S tem predmetom lahko na primer ustvarite, odprete, kopirate, premaknete in izbrišete datoteke.
TextStream Objekt TextStream vam omogoča ustvarjanje ali branje besedilnih datotek.

Vsak od zgornjih predmetov ima metode, s katerimi lahko delate s temi.

Če želite na primer zbrisati mapo, uporabite metodo DeleteFolder predmeta Folder. Podobno, če želite kopirati datoteko, boste uporabili metodo CopyFile predmeta File.

Ne skrbite, če se vam zdi to pretežko ali težko razumljivo. Ko boste pregledali primere, ki sem jih obravnaval v tej vadnici, boste veliko bolje razumeli.

Za referenco sem obravnaval vse metode FileSystemObject (za vsak predmet) na koncu te vadnice.

Omogočanje FileSystemObject v Excelu VBA

FileSystemObject privzeto ni na voljo v Excelovem VBA.

Ker imamo opravka z datotekami in mapami, ki so zunaj aplikacije Excel, moramo najprej ustvariti referenco na knjižnico, ki hrani te predmete (pogone, datoteke, mape).

Zdaj obstajata dva načina za začetek uporabe FileSystemObject v Excelu VBA:

  1. Nastavitev sklica na Microsoftovo knjižnico izvajalnega skripta (Scrrun.dll)
  2. Ustvarjanje predmeta za sklicevanje na knjižnico iz same kode

Medtem ko obe metodi delujeta (v nadaljevanju vam bom pokazal, kako to storiti), priporočam uporabo prve metode.

Opomba: Ko omogočite FileSystemObject, lahko dostopate do vseh predmetov v njem. To vključuje FileSystemObject, Drive, Datoteke, Mape itd. V tej vadnici se bom osredotočil predvsem na FileSystemObject.

Nastavitev sklica na knjižnico Microsoft Scripting Runtime Library

Ko ustvarite referenco na Knjižnico izvajalnega skripta, omogočite Excelu VBA dostop do vseh lastnosti in metod datotek in map. Ko to storite, se lahko v Excelu VBA sklicujete na predmet datoteke/mape/pogone (tako kot se lahko sklicujete na celice, delovne liste ali delovne zvezke).

Spodaj so navedeni koraki za ustvarjanje sklica na knjižnico Microsoft Scripting Runtime Library:

  1. V urejevalniku VB kliknite Orodja.
  2. Kliknite na Reference.
  3. V pogovornem oknu Reference, ki se odpre, se pomaknite po razpoložljivih referencah in preverite možnost »Microsoft Scripting Runtime«.
  4. Kliknite V redu.

Zgornji koraki bi vam zdaj omogočili sklicevanje na objekte FSO iz Excela VBA.

Ustvarjanje primerka FileSystemObject v kodi

Ko nastavite sklic na knjižnico Scripting FileSystemObject, morate v kodi ustvariti primerek objekta FSO.

Ko je to ustvarjeno, ga lahko uporabite v VBA.

Spodaj je koda, ki bo spremenljivko objekta MyFSO nastavila kot objekt FileSystemObject:

Sub CreatingFSO () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject End Sub

V tej kodi sem najprej spremenljivko MyFSO razglasil za objekt tipa FileSystemObject. To je mogoče le zato, ker sem ustvaril referenco na knjižnico Microsoft Scripting Runtime Library. Če sklic ni ustvarjen, bo to povzročilo napako (saj Excel ne bi prepoznal, kaj pomeni FileSystemObject).

V drugi vrstici se zgodita dve stvari:

  1. Ključna beseda NEW ustvari primerek FileSystemObject. To pomeni, da lahko zdaj uporabljam vse metode FileSystemObject za delo z datotekami in mapami. Če tega primerka ne ustvarite, ne boste mogli dostopati do metod FSO.
  2. Ključna beseda SET nastavi objekt MyFSO na ta nov primerek FileSystemObject. To mi omogoča uporabo tega predmeta za dostop do datotek in map. Na primer, če moram ustvariti mapo, lahko uporabim metodo MyFSO.CreateFolder.

Če želite, lahko zgornji dve izjavi združite tudi v eno, kot je prikazano spodaj:

Pod UstvarjanjeFSO () Zatemni MyFSO kot novo končnico podv. FileSystemObject

Velika prednost uporabe te metode (to je nastavitev sklicevanja na knjižnico izvajalnega okolja Microsoft Scripting Runtime) je, da boste pri uporabi objektov FSO v kodi lahko uporabili funkcijo IntelliSense, ki prikazuje metode in lastnosti, povezane z predmet (kot je prikazano spodaj).

To ni mogoče, če sklic ustvarite znotraj kode (opisano v nadaljevanju).

Ustvarjanje predmeta iz kode

Drug način za ustvarjanje sklicevanja na FSO je, da to storite iz kode. Pri tej metodi vam ni treba ustvariti referenc (kot je bilo storjeno v prejšnji metodi).

Ko pišete kodo, lahko ustvarite predmet v kodi in se obrnete na Scripting.FileSystemObject.

Spodnja koda ustvari objekt FSO in nato to naredi kot tip FileSystemObject.

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

Čeprav se to morda zdi bolj priročno, je velika pomanjkljivost uporabe te metode v tem, da ne prikazuje IntelliSense, ko delate s predmeti v FSO. Zame je to velik minus in vedno priporočam uporabo prejšnje metode omogočanja FSO (to je z nastavitvijo sklica na »Microsoft Scripting Runtime«)

Primeri datotek VBA FileSystemObject

Zdaj pa se potopimo in poglejmo nekaj praktičnih primerov uporabe FileSystemObject v Excelu.

Primer 1: Preverite, ali datoteka ali mapa obstaja

Naslednja koda bo preverila, ali mapa z imenom "Test" obstaja ali ne (na določenem mestu).

Če mapa obstaja, je pogoj IF resničen in v sporočilnem polju se prikaže sporočilo - "Mapa obstaja". In če ne obstaja, se prikaže sporočilo - Mapa ne obstaja '.

Sub CheckFolderExist () Zatemni MyFSO kot FileSystemObject Nastavi MyFSO = Nov FileSystemObject Če MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Nato MsgBox "Mapa obstaja" Sicer MsgBox "Mapa ne obstaja" Konec, če se konča Pod

Podobno lahko preverite tudi, ali datoteka obstaja ali ne.

Spodnja koda preveri, ali je v podani mapi datoteka z imenom Test.xlsx ali ne.

Sub CheckFileExist () Dim MyFSO kot FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FileExists ("C: \ Users \ sumit \ Desktop \ Test \ Test.xlsx") Potem MsgBox "Datoteka obstaja" Drugače MsgBox "Datoteka ne obstaja" "End If End Sub

Primer 2: ustvarite novo mapo na določenem mestu

Spodnja koda bi ustvarila mapo z imenom 'Test' v pogonu C mojega sistema (v sistemu boste morali določiti pot, kamor želite ustvariti mapo).

Sub CreateFolder () Zatemni MyFSO kot FileSystemObject Set MyFSO = New FileSystemObject MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test") End Sub

Čeprav ta koda deluje v redu, bi prikazala napako, če mapa že obstaja.

Spodnja koda preveri, ali mapa že obstaja, in ustvari mapo, če je ni. Če mapa že obstaja, se prikaže sporočilo. Za preverjanje, ali mapa obstaja, sem uporabil datoteko Metoda FolderExists FSO.

Sub CreateFolder () Dim MyFSO kot FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Nato MsgBox "Mapa že obstaja" Drugače MyFSO.CreateFolder ("C: \ Users \" sumit \ Desktop \ Test ") End If End Sub

Primer 3: Pridobite seznam vseh datotek v mapi

Spodnja koda bi prikazala imena vseh datotek v določeni mapi.

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

Ta koda je nekoliko bolj zapletena od tistih, ki smo jih že videli.

Kot sem že omenil v tej vadnici, ko se sklicujete na »knjižnico izvajalnega okolja Microsoft Scripting Runtime«, lahko uporabite FileSystemObject in vse druge predmete (na primer datoteke in mape).

V zgornji kodi uporabljam tri predmete - FileSystemObject, File in Folder. To mi omogoča pregled vseh datotek v določeni mapi. Nato z lastnostjo name dobim seznam vseh imen datotek.

Upoštevajte, da uporabljam Debug.Print, da dobim imena vseh datotek. Ta imena bodo navedena v neposrednem oknu urejevalnika VB.

Primer 4: Pridobite seznam vseh podmap v mapi

Spodnja koda bo dala imena vseh podmap v določeni mapi. Logika je popolnoma enaka kot v zgornjem primeru. Namesto datotek smo v tej kodi uporabili podmape.

Sub GetSubFolderNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder Kot Mapa Dim MySubFolder Kot Mapa Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test \ Desktop" V MyFolder.SubFolders Debug.Natisni MySubFolder.Name Naprej MySubFolder End Sub

Primer 5: Kopirajte datoteko z enega mesta na drugega

Spodnja koda bo datoteko kopirala iz mape »Vir« in jo kopirala v mapo »Destinacija«.

Sub CopyFile () Dim MyFSO kot 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 Vir: = SourceFile, Destination: = DestinationFolder &" \ SampleFileCopy.xlsx "End Sub

V zgornji kodi sem uporabil dve spremenljivki - SourceFile in DestinationFolder.

Izvorna datoteka vsebuje naslov datoteke, ki jo želim kopirati, spremenljivka DestinationFolder pa naslov v mapo, v katero želim kopirati datoteko.

Upoštevajte, da pri kopiranju datoteke ni dovolj, da navedete ime ciljne mape. Določiti morate tudi ime datoteke. Uporabite lahko isto ime datoteke ali pa ga tudi spremenite. V zgornjem primeru sem kopiral datoteko in jo poimenoval SampleFileCopy.xlsx

Primer 6: Kopirajte vse datoteke iz ene mape v drugo

Spodnja koda bo kopirala vse datoteke iz izvorne mape v ciljno mapo.

Sub CopyAllFiles () Zatemni MyFSO kot FileSystemObject Dim MyFile kot 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 vsak MyFile v MyFolder.Files MyFSO.CopyFile Vir: = MyFSO.GetFile (MyFile), _ Destination: = Desto "& MyFile.Name, Overwritefiles: = False Next MyFile End Sub

Zgornja koda bo kopirala vse datoteke iz izvorne mape v ciljno mapo.

Upoštevajte, da sem v metodi MyFSO.CopyFile lastnost 'Overwritefiles' določil kot False (to je privzeto True). To zagotavlja, da v primeru, da datoteko že imate v mapi, ni kopirana (in prikazala se bo napaka). Če odstranite »Overwritefiles« ali nastavite na True, bi bile v primeru, če so datoteke v ciljni mapi z istim imenom, te prepisane.

Nasvet za profesionalce: Pri kopiranju datotek vedno obstaja možnost prepisa datotek. V tem primeru bi bilo dobro dodati časovni žig skupaj z imenom. Tako boste zagotovili, da so imena vedno različna, in lahko preprosto sledite, katere datoteke so bile ob določenem času kopirane.

Če želite kopirati datoteke samo določene razširitve, lahko to storite z uporabo stavka IF Then, da preverite, ali je razširitev xlsx ali ne.

Sub CopyExcelFilesOnly () Dim MyFSO Kot FileSystemObject Dim MyFile Kot File Dim SourceFolder Kot String Dim DestinationFolder As String Dim MyFolder Kot mapa Dim MySubFolder kot mapa SourceFolder = "C: \ Users \ sumit \ Desktop \ Source \ DestinationFolder =" C: sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) Za vsako MyFile v MyFolder.Files Če MyFSO.GetExtensionName (MyFile) =" xlsx "Potem MyFSO.CopyFile Vir: (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = False End Če je naslednji MyFile End Sub

Metode FileSystemObject (FSO)

Tu so metode, ki jih lahko uporabite za vsak predmet. To je samo za referenco in ne skrbite preveč. Uporaba nekaterih od teh je bila prikazana v zgornjih primerih.

Metode FSO Za Objekt Opis
DriveExists Vozi Preveri, ali pogon obstaja ali ne
GetDrive Vozi Vrne primerek pogonskega objekta na podlagi podane poti
GetDriveName Vozi Ponovi ime pogona
BuildPath Mapa z datotekami Ustvarite pot iz obstoječe poti in imena
CopyFile Mapa z datotekami Kopira datoteko
GetAbsolutePathName Mapa z datotekami Vrnite kanonično predstavitev poti
GetBaseName Mapa z datotekami Vrni osnovno ime s poti. Na primer, "D: \ TestFolder \ TestFile.xlsm" vrne TextFile.xlsm
GetTempName Mapa z datotekami Ustvarite ime, ki ga lahko uporabite za poimenovanje začasne datoteke
CopyFolder Mapa Kopira mapo z ene lokacije na drugo
Ustvari mapo Mapa Ustvari novo mapo
Izbriši mapo Mapa Izbriše določeno mapo
MapaObstoja Mapa Preveri, ali mapa obstaja ali ne
GetFolder Mapa Vrne primerek predmeta mape na podlagi podane poti
GetParentFolderName Mapa Ponovno prikaže ime nadrejene mape na podlagi podane poti
GetSpecialFolder Mapa Ugotovite lokacijo različnih sistemskih map.
Premakni mapo Mapa Premakne mapo z ene lokacije na drugo
DeleteFile mapa Izbriše datoteko
FileExists mapa Preveri, ali datoteka obstaja ali ne
GetExtensionName mapa Vrne pripono datoteke
GetFile mapa Vrne primerek datotečnega objekta na podlagi podane poti
GetFileName mapa Vrne ime datoteke
GetFileVersion mapa Vrne različico datoteke
Premakni datoteko mapa Premakne datoteko
CreateTextFile mapa Ustvari besedilno datoteko
GetStandardStream mapa Pridobite standardni vnos, izhod ali tok napak
OpenTextFile mapa Odprite datoteko kot TextStream

Vam bo pomagal razvoj spletnega mesta, ki si delijo stran s svojimi prijatelji

wave wave wave wave wave