A VBA FileSystemObject (FSO) használata az Excelben - Egyszerű áttekintés és példák

Amikor a VBA -t Excelben használjuk, a legtöbb feladatunk automatizálása.

Ez azt is jelenti, hogy legtöbbször cellákkal és tartományokkal, munkalapokkal, munkafüzetekkel és más, az Excel alkalmazás részét képező objektumokkal dolgozunk.

De a VBA sokkal erősebb, és az Excel -en kívüli dolgokkal is használható.

Ebben az oktatóanyagban megmutatom, hogyan kell használni a VBA FileSystemObject (FSO) programot a rendszeren vagy hálózati meghajtókon lévő fájlok és mappák kezelésére.

Mi az a VBA FileSystemObject (FSO)?

A FileSystemObject (FSO) lehetővé teszi a számítógép fájlrendszerének elérését. Használatával elérheti és módosíthatja a számítógépes rendszer fájljait/mappáit/könyvtárait.

Például az alábbiakban bemutatunk néhány olyan dolgot, amelyet az Excel VBA FileSystemObject használatával tehet:

  • Ellenőrizze, hogy létezik -e fájl vagy mappa.
  • Mappák/fájlok létrehozása vagy átnevezése.
  • Szerezze be a mappa összes fájlnevét (vagy almappaneveit).
  • Fájlok másolása egyik mappából a másikba.

Remélem érted az ötletet.

Mindezekre a fenti példákra (és még többre) kitérek ebben az oktatóanyagban.

Bár a fent említett dolgok némelyike ​​hagyományos VBA függvények (például DIR függvény) és módszerek használatával is elvégezhető, ez hosszabb és bonyolultabb kódokhoz vezetne. A FileSystemObject megkönnyíti a fájlokkal és mappákkal való munkavégzést, miközben a kód tiszta és rövid.

Megjegyzés: Az FSO csak Excel 2000 és újabb verziókban használható.

Milyen összes objektumhoz férhet hozzá a FileSystemObject segítségével?

Amint fentebb említettem, elérheti és módosíthatja a fájlokat és mappákat a VBA FileSystemObject használatával.

Az alábbi táblázat bemutatja a legfontosabb objektumokat, amelyeket elérhet és módosíthat az FSO használatával:

Tárgy Leírás
Hajtás A Drive Object lehetővé teszi, hogy információkat szerezzen a meghajtóról, például hogy létezik -e vagy sem, az útvonal neve, a meghajtó típusa (cserélhető vagy rögzített), mérete stb.
Mappa A mappaobjektum lehetővé teszi mappák létrehozását vagy módosítását a rendszerben. Például létrehozhat, törölhet, átnevezhet és másolhat mappákat ezzel az objektummal.
Fájl A File Object lehetővé teszi, hogy a rendszer fájljaival dolgozzon. Például létrehozhat, megnyithat, másolhat, áthelyezhet és törölhet fájlokat ezzel az objektummal.
TextStream A TextStream objektum lehetővé teszi szöveges fájlok létrehozását vagy olvasását.

A fenti objektumok mindegyike rendelkezik módszerekkel, amelyekkel ezekkel dolgozhat.

Például, ha törölni szeretne egy mappát, használja a Folder objektum DeleteFolder metódusát. Hasonlóképpen, ha másolni szeretne egy fájlt, akkor használja a File objektum CopyFile metódusát.

Ne aggódjon, ha ez lehengerlőnek vagy nehezen érthetőnek tűnik. Sokkal jobb megértést fog kapni, ha áttekinti az ebben a bemutatóban bemutatott példákat.

Csak referenciaként az oktatóanyag végén leírtam az összes FileSystemObject metódust (minden objektumra vonatkozóan).

A FileSystemObject engedélyezése az Excel VBA -ban

A FileSystemObject alapértelmezés szerint nem érhető el az Excel VBA -ban.

Mivel olyan fájlokkal és mappákkal van dolgunk, amelyek nem az Excel alkalmazásban vannak, először létre kell hoznunk egy hivatkozást az objektumokat (meghajtók, fájlok, mappák) tartalmazó könyvtárra.

Most kétféle módon indíthatja el a FileSystemObject használatát az Excel VBA programban:

  1. A Microsoft Scripting Runtime Library (Scrrun.dll) hivatkozásának beállítása
  2. A könyvtárra hivatkozó objektum létrehozása magából a kódból

Bár mindkét módszer működik (és a következőkben megmutatom, hogyan kell ezt megtenni), javaslom az első módszer használatát.

Megjegyzés: A FileSystemObject engedélyezésekor hozzáférhet a benne található összes objektumhoz. Ez magában foglalja a FileSystemObject, Drive, Files, Folders stb. Ebben az oktatóanyagban elsősorban a FileSystemObject -re fogok összpontosítani.

A hivatkozás beállítása a Microsoft Scripting Runtime Library -re

Amikor hivatkozást hoz létre a Scripting Runtime Library könyvtárhoz, engedélyezi az Excel VBA számára, hogy hozzáférjen a fájlok és mappák összes tulajdonságához és módszeréhez. Ha ez megtörtént, hivatkozhat a fájlok/mappák/meghajtók objektumra az Excel VBA -ból (ugyanúgy, mint a cellákra, munkalapokra vagy munkafüzetekre).

Az alábbiakban bemutatjuk a Microsoft Scripting Runtime Library hivatkozás létrehozásának lépéseit:

  1. A VB szerkesztőben kattintson az Eszközök elemre.
  2. Kattintson a Referenciák elemre.
  3. A megnyíló Hivatkozások párbeszédpanelen görgessen a rendelkezésre álló hivatkozások között, és jelölje be a „Microsoft Scripting Runtime” opciót.
  4. Kattintson az OK gombra.

A fenti lépések lehetővé teszik, hogy hivatkozzon az Excel VBA FSO -objektumaira.

FileSystemObject példány létrehozása a kódban

Miután beállította a hivatkozást a Scripting FileSystemObject könyvtárra, létre kell hoznia egy példányt az FSO objektumból a kódjában.

Miután ezt létrehozta, használhatja a VBA -ban.

Az alábbiakban az a kód található, amely a MyFSO objektumváltozót FileSystemObject objektumként állítja be:

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

Ebben a kódban először a MyFSO változót FileSystemObject típusú objektumnak nyilvánítottam. Ez csak azért lehetséges, mert létrehoztam egy hivatkozást a Microsoft Scripting Runtime Library -re. Ha a hivatkozás nem jön létre, ez hibát fog okozni (mivel az Excel nem ismeri fel a FileSystemObject jelentését).

A második sorban két dolog történik:

  1. Az NEW kulcsszó létrehoz egy példányt a FileSystemObject -ből. Ez azt jelenti, hogy most a FileSystemObject összes módszerét használhatom fájlokkal és mappákkal való munkához. Ha nem Ön hozza létre ezt a példányt, akkor nem fogja tudni elérni az FSO módszereit.
  2. A SET kulcsszó a MyFSO objektumot a FileSystemObject új példányára állítja. Ez lehetővé teszi számomra, hogy ezt az objektumot fájlok és mappák eléréséhez használjam. Például, ha létre kell hoznom egy mappát, használhatom a MyFSO.CreateFolder metódust.

Ha szeretné, a fenti két állítást is egyesítheti az alábbiak szerint:

Sub CreatingFSO () Dim MyFSO mint új FileSystemObject End Sub

Ennek a módszernek (amely a Microsoft Scripting Runtime Library -re való hivatkozást kell megadnia) használatának nagy előnye, hogy amikor a kódban lévő FSO -objektumokat használja, használhatja az IntelliSense szolgáltatást, amely megjeleníti a egy objektum (az alábbiak szerint).

Ez nem lehetséges, ha a hivatkozást a kódon belül hozza létre (a következőkben).

Objektum létrehozása a kódból

Egy másik módja annak, hogy hivatkozást hozzon létre az FSO -ra, ha a kódból teszi. Ennél a módszernél nem kell semmilyen hivatkozást létrehoznia (mint az előző módszerben).

Amikor írja a kódot, létrehozhat egy objektumot a kódon belül, és olvassa el a Scripting.FileSystemObject fájlt.

Az alábbi kód létrehoz egy FSO objektumot, majd ezt FileSystemObject típusúvá teszi.

Sub FSODemo () Dim FSO objektumkészletként FSO = CreateObject ("Scripting.FileSystemObject") End Sub

Bár ez kényelmesebbnek tűnhet, a módszer használatának nagy hátránya, hogy nem mutat IntelliSense -t, ha az FSO -ban lévő objektumokkal dolgozik. Számomra ez óriási negatívum, és mindig azt javaslom, hogy az FSO engedélyezésének korábbi módszerét használja (amely a „Microsoft Scripting Runtime” hivatkozás beállítása)

VBA FileSystemObject Példák

Most merüljünk el, és nézzünk néhány gyakorlati példát a FileSystemObject használatára az Excelben.

1. példa: Ellenőrizze, hogy létezik -e fájl vagy mappa

A következő kód ellenőrzi, hogy létezik -e a „Test” nevű mappa (a megadott helyen).

Ha a mappa létezik, az IF feltétel igaz, és egy üzenet jelenik meg - „A mappa létezik” az üzenetmezőben. Ha pedig nem létezik, üzenetet mutat - A mappa nem létezik ”.

Sub CheckFolderExist () Dim MyFSO FileSystemObject halmazként Alatti

Hasonlóképpen ellenőrizheti, hogy létezik -e fájl vagy sem.

Az alábbi kód ellenőrzi, hogy van -e Test.xlsx nevű fájl a megadott mappában.

Sub CheckFileExist () Dim MyFSO fájlrendszerként "Vége, ha vége Sub

2. példa: Hozzon létre egy új mappát a megadott helyen

Az alábbi kód létrehoz egy „Test” nevű mappát a rendszer C meghajtójában (meg kell adnia a rendszer elérési útját, ahol létre szeretné hozni a mappát).

Sub CreateFolder () Dim MyFSO FileSystemObject Set MyFSO = New FileSystemObject MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test") Végezet

Bár ez a kód jól működik, hibát mutat, ha a mappa már létezik.

Az alábbi kód ellenőrzi, hogy a mappa már létezik -e, és létrehoz egy mappát, ha nem. Ha a mappa már létezik, akkor üzenet jelenik meg. A mappa létezésének ellenőrzéséhez a FolderExists metódus az FSO.

Sub CreateFolder () Dim MyFSO FileSystemObject Set MyFSO = Új FileSystemObject Ha MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test"), akkor az MsgBox "A mappa már létezik" Más MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test ") End If End Sub

3. példa: A mappában található összes fájl listájának beszerzése

Az alábbi kód a megadott mappában található összes fájl nevét jeleníti meg.

Sub GetFileNames () Dim MyFSO FileSystemObject Dim MyFile fájlként Dim MyFolder as Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") a MyFolder.Files minden MyFile fájljához Hibakeresés. Nyomtassa ki a MyFile fájlt. Név Következő MyFile End Sub

Ez a kód egy kicsit bonyolultabb, mint a már látottak.

Amint fentebb említettem ebben az oktatóanyagban, amikor a „Microsoft Scripting Runtime Library” -re hivatkozik, akkor a FileSystemObject és az összes többi objektum (például a fájlok és mappák) is használható.

A fenti kódban három objektumot használok - FileSystemObject, File és Folder. Ez lehetővé teszi számomra, hogy a megadott mappában lévő összes fájlt átnézzem. Ezután a name tulajdonságot használva megkapom az összes fájlnév listáját.

Ne feledje, hogy a Debug.Print programot használom az összes fájl nevének lekéréséhez. Ezek a nevek megjelennek a VB Editor közvetlen ablakában.

Példa 4: Szerezze be a mappa összes almappájának listáját

Az alábbi kód megadja a megadott mappa összes almappájának nevét. A logika pontosan ugyanaz, mint a fenti példában. A fájlok helyett ebben a kódban almappákat használtunk.

Sub GetSubFolderNames () Dim MyFSO FileSystemObject Dim MyFile Fájlként Dim MyFolder mint mappa Dim MySubFolder as Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test" In MyFolder.SubFolders Debug. Print MySubFolder.Name Next MySubFolder End Sub

5. példa: Fájl másolása egyik helyről a másikra

Az alábbi kód másolja a fájlt a „Forrás” mappából, és másolja át a „Cél” mappába.

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

A fenti kódban két változót használtam - SourceFile és DestinationFolder.

A Forrásfájl tartalmazza a másolni kívánt fájl címét, a DestinationFolder változó pedig annak a mappának a címét, ahová a fájlt másolni szeretném.

Ne feledje, hogy fájl másolásakor nem elegendő a célmappa nevét megadni. Meg kell adnia a fájl nevét is. Használhatja ugyanazt a fájlnevet, vagy módosíthatja is. A fenti példában másoltam a fájlt, és elneveztem SampleFileCopy.xlsx

6. példa: Az összes fájl másolása egyik mappából a másikba

Az alábbi kód a forrás mappából az összes fájlt átmásolja a célmappába.

Sub CopyAllFiles () Dim MyFSO, mint FileSystemObject Dim MyFile, mint File Dim SourceFolder, mint karakterlánc Dim DestinationFolder, mint String Dim Saját mappa, mint mappa Dim MySubFolder mint mappa SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) Minden MyFile In MyFolder.Files MyFSO.CopyFile Forrás: = MyFSO.GetFile (MyFile), _ Destination: =" Destination: = " "& MyFile.Name, Overwritefiles: = Hamis Következő MyFile End Sub

A fenti kód a forrás mappából az összes fájlt átmásolja a célmappába.

Ne feledje, hogy a MyFSO.CopyFile metódusban a „felülírási fájlok” tulajdonságot hamisnak adtam meg (ez alapértelmezés szerint igaz). Ez biztosítja, hogy ha a fájl már a mappában van, akkor azt nem másolja át (és hibaüzenetet fog látni). Ha eltávolítja a „felülírási fájlokat”, vagy True értékre állítja, ha a célmappában azonos nevű fájlok vannak, akkor ezek felülíródnak.

Profi tipp: Fájlok másolásakor mindig fennáll a lehetőség a fájlok felülírására. Ebben az esetben jó ötlet az időbélyegző hozzáadása a névhez. Ez biztosítja, hogy a nevek mindig különbözőek legyenek, és könnyen nyomon követheti, hogy mely fájlokat mikor másolta.

Ha csak egy bizonyos kiterjesztés fájljait szeretné másolni, akkor ezt IF IF utasítás használatával ellenőrizheti, hogy a kiterjesztés xlsx -e vagy sem.

Sub CopyExcelFilesOnly () Dim MyFSO, mint FileSystemObject Dim MyFile, mint File Dim SourceFolder, mint String Dim DestinationFolder Mint String Dim MyFolder, mint mappa Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Us: sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) Minden MyFile In MyFolder.Files Ha MyFSO.GetExtensionName (MyFile) =" xlsx ", majd MyFSO.CopyFileFile: (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = False End if Next MyFile End Sub

FileSystemObject (FSO) módszerek

Íme az egyes objektumokhoz használható módszerek. Ez csak referenciaként szolgál, és nem aggódik túl sokat. Ezek közül néhány használatát a fenti példák mutatják be.

FSO módszerek Az Object számára Leírás
DriveExists Hajtás Ellenőrzi, hogy a meghajtó létezik -e vagy sem
GetDrive Hajtás Visszaadja a meghajtóobjektum egy példányát a megadott útvonal alapján
GetDriveName Hajtás Újra futtatja a meghajtó nevét
BuildPath Fájl mappa Hozzon létre egy elérési utat egy meglévő útvonalból és egy névből
Fájl másolás, fájl másolása Fájl mappa Fájlt másol
GetAbsolutePathName Fájl mappa Adja vissza az út kanonikus ábrázolását
GetBaseName Fájl mappa Visszaadja az alap nevét egy útvonalból. Például a „D: \ TestFolder \ TestFile.xlsm” visszaadja a TextFile.xlsm fájlt
GetTempName Fájl mappa Hozzon létre egy nevet, amely használható ideiglenes fájl elnevezésére
CopyFolder Mappa Mappa másolása egyik helyről a másikra
Mappa létrehozás Mappa Új mappát hoz létre
DeleteFolder Mappa Törli a megadott mappát
FolderExists Mappa Ellenőrzi, hogy a mappa létezik -e vagy sem
GetFolder Mappa Visszaadja a mappaobjektum egy példányát a megadott útvonal alapján
GetParentFolderName Mappa A megadott útvonal alapján újraindítja a szülő mappa nevét
GetSpecialFolder Mappa Szerezze be a különböző rendszermappák helyét.
MoveFolder Mappa Egy mappa áthelyezése egyik helyről a másikra
Fájl törlése Fájl Töröl egy fájlt
A fájl létezik Fájl Ellenőrzi, hogy létezik -e fájl vagy sem
GetExtensionName Fájl Visszaadja a fájlkiterjesztést
GetFile Fájl Visszaadja a fájlobjektum példányát a megadott elérési út alapján
GetFileName Fájl Visszaadja a fájl nevét
GetFileVersion Fájl Visszaadja a fájl verzióját
MoveFile Fájl Fájlt mozgat
CreateTextFile Fájl Létrehoz egy szöveges fájlt
GetStandardStream Fájl A standard bemenet, kimenet vagy hibafolyam letöltése
OpenTextFile Fájl Nyisson meg egy fájlt TextStream -ként
wave wave wave wave wave