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:
- A Microsoft Scripting Runtime Library (Scrrun.dll) hivatkozásának beállítása
- 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:
- A VB szerkesztőben kattintson az Eszközök elemre.
- Kattintson a Referenciák elemre.
- 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.
- 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:
- 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.
- 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 |