A FileSystemObject (FSO) használata az Excel VBA-ban

A FileSystemObject (FSO) a számítógép fájlrendszerének eléréséhez szükséges funkciók egész sorához biztosít hozzáférést. Ezzel az objektummal könnyedén elérheti a fájlokat, mappákat és meghajtókat, valamint olvashatja és írhatja a fájlokat.

Az FSO függvények közül sokat megírhatna hagyományos VBA-ban, de ez több kódolást igényelne, és egy újonnan érkező fejlesztő számára nehezebb lenne karbantartani és megérteni. Az FSO egy kipróbált és tesztelt API (Application Programming Interface), és megbízhatóbb, mint a saját kód. Könnyen használható, készen áll és rendelkezésre áll.

Az FSO a nemzetközi szabványok és az Ön számítógépén lévő beállítások szerint működik. Ha az Excel-alkalmazását globálisan terjeszti, akkor az FSO használata gondoskodik az országok közötti beállításbeli különbségekről, amit a saját kódja nehezen tudna megtenni.

Az FSO segítségével szinte mindent megtehet a VBA-kódban, amit a Windows File Explorerben megtehet. Teljes hozzáférést biztosít a Windows fájlrendszeréhez.

FileSystemObject létrehozása

A FileSytemObject nem része az Excel VBA-nak. Az FSO-t úgy használhatjuk, hogy létrehozunk egy objektumot (késői kötés) a VBA-ban:

Sub CreateFSO()Set MyFSO = CreateObject("Scripting.FileSystemObject")End Sub

Alternatívaként a VBA-ba felvehetünk egy hivatkozást az FSO könyvtárra. Ezt korai kötésnek nevezzük, és gyorsabb, mint a késői kötés, mivel az objektumot nem kell létrehozni a kód futtatásakor.

Hivatkozás hozzáadásához az Alt-F11 billentyűt kell lenyomni a Visual Basic szerkesztő (VBE) megnyomásához, majd a VBE menüből az ‘Eszközök|Hivatkozások’ parancsot kell használni. Ekkor megjelenik egy felugró ablak, amelyben kiválaszthatja a megfelelő hivatkozást (lásd alább).

Görgessen lefelé a rendelkezésre álló hivatkozások listáján, amíg meg nem jelenik a ‘Microsoft Scripting Runtime’. Jelölje be a négyzetet, majd kattintson az OK gombra, és a könyvtár már az alkalmazás része.

A DLL könyvtárfájl helye: C:\Windows\SysWOW64\scrrun.dll

Ha az alkalmazást más kollégáknak vagy más helyekre is eljuttatja, fontos, hogy ez a fájl a megfelelő helyen legyen a számítógépükön, különben a kódja hibás lesz.

A ‘WorkbookOpen’ eseményre érdemes hibacsapdát tenni a Dir parancs segítségével, hogy ellenőrizze a fájl létezését. Ha nincs, akkor adjon figyelmeztető üzenetet, és zárja be az Excel fájlt.

A hivatkozás hozzáadása után a következő kódot használhatja az FSO létrehozásához:

Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub

A cikk összes példája ezt a módszert használja az FSO létrehozásához.

Az FSO számos metódussal és tulajdonsággal rendelkezik. Ezeket itt szakaszokra osztjuk aszerint, hogy mire képesek.

A ‘Létezik’ módszerek használata

Egy FSO-módszerrel ellenőrizheti, hogy létezik-e egy meghajtó, egy mappa vagy egy fájl. Ezek a módszerek könnyen használhatók, és csak egy paramétert igényelnek.

Sub CheckExistance()Dim MyFSO As New FileSystemObjectMsgBox MyFSO.DriveExists("C:")MsgBox MyFSO.FolderExists("C:\temp\")MsgBox MyFSO.FileExists("C:\temp\testfile.txt")End Sub

Az alábbi utasítások mindegyike ‘True’ értéket ad vissza, feltételezve, hogy a számítógépen van egy C: meghajtó, rajta egy ‘Temp’ nevű mappa és a Temp mappában egy ‘testfile.txt’

A paraméterekben szereplő szöveges karakterláncok nem függnek a nagy- és kisbetűktől. A fenti módszerek egyikében sem használhat helyettesítő karaktereket.

Egy mappa vagy fájl helyének leírására nem használhat URL-címeket (Uniform Resource Locators). Az FSO kizárólag a Windows operációs rendszeren és az azon lévő fájlrendszeren működik. Külső kiszolgálói helyhez először egy meghajtót kell hozzárendelni, majd magát a meghajtó útvonalát kell használni.

A ‘Get’ módszerek használata

Az FSO számos módszerrel rendelkezik a fájlra és az útvonalra vonatkozó információk megszerzésére, akár az útvonal és a fájl felosztására, akár a fájl vagy mappa információinak, például a létrehozás vagy a módosítás dátumának megszerzésére.

GetAbsolutePathname

Ez egy teljes elérési utat ad a megadott meghajtó gyökerétől.

A szintaxis a következő:

GetAbsolutePathName (pathspec)

Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:..."MsgBox MyFSO.GetAbsolutePathName(Pth)End Sub

Ez egy ‘C:\Users\Richard\Documents’ karakterláncot ad vissza. Ez azért van így, mert az elérési út megadásakor a C:-t három pont követi. Minden egyes pont egy következő szintet jelent a mappastruktúrán belül.

GetBaseName

Ez a megadott fájl vagy mappa nevét adja vissza.

A szintaxis a következő:

GetBaseName (path)

Sub BaseName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetBaseName(Pth)End Sub

Ez a kód a ‘testfile’ nevet adja vissza. A módszer az elérési útvonal nevének utolsó szakaszát adja vissza. Ha ez egy fájl, akkor nem adja vissza a fájl utótagját.

Ha az elérési útvonal nem található, akkor egy üres karakterláncot ad vissza.

GetDrive

Ez lehetővé teszi, hogy a megadott meghajtóbetű alapján kód segítségével hozzáférjen a meghajtó információihoz.

A szintaxis a következő:

GetDrive (drivespec)

Sub DriveInfo()Dim MyFSO As New FileSystemObject, Pth As String, Dr As DrivePth = "C:"Set Dr = MyFSO.GetDrive(Pth)MsgBox Dr.FreeSpaceEnd Sub

Ez a módszer egy meghajtóobjektumot ad vissza a megadott meghajtó alapján. Ezzel az objektummal hozzáférhet a meghajtóra vonatkozó információkhoz, például a rendelkezésre álló szabad helyhez.

GetDriveName

Ez a metódus a meghajtó nevét választja ki egy elérési út / fájlnév karakterláncból.

Szintaktikája:

GetDriveName (path)

Sub DriveName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)End Sub

Ez a ‘C:’

GetExtensionName

Ez a megadott útvonalban lévő fájl utótagot adja vissza.

Szintaktika:

GetExtensionName (path)

Sub ExtensionName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)End Sub

Ez a parancs a ‘txt’-t adja vissza.

Ha nincs megadva fájl, akkor egy üres karakterláncot kapunk vissza.

GetFile

Ez a módszer egy fájlobjektumot ad vissza, amely különböző információkat tartalmaz magáról a fájlról.

A szintaxis a következő:

GetFile (filespec)

Sub FileInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fn As FilePth = "C:\temp\testfile.txt"Set Fn = MyFSO.GetFile(Pth)MsgBox Fn.DateCreatedEnd Sub

A megadott fájl létrehozásának dátumát és időpontját adja vissza. Ha nincs megadva fájl, vagy a fájl nem létezik, akkor egy ‘file not found’ hibaüzenetet kapunk.

Sub FileName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)End Sub

Ez a ‘testfile.txt’-t adja vissza.

GetFolder

Ez egy mappaobjektumot hoz létre a megadott elérési útvonalban lévő alapmappához. Az elérési út csak mappaneveket tartalmazhat. Nem szabad fájlneveket tartalmaznia, különben hiba lép fel.

A szintaxis a következő:

GetFolder (folderspec)

Sub FolderInfo()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)MsgBox Fo.DateCreatedEnd Sub

A mappaobjektumban különböző információk vannak, amelyek elérhetők. Ebben az esetben a mappa létrehozásának dátumát adja vissza.

Ezzel a módszerrel egy adott mappán belül az összes fájlnevet is lekérdezhetjük:

Sub FileNames()Dim MyFSO As New FileSystemObject, Pth As String, Fo As Folder, Fn As FilePth = "C:\temp"Set Fo = MyFSO.GetFolder(Pth)For Each Fn In Fo.Files MsgBox Fn.NameNext FnEnd Sub

Ez a kód végigfut a ‘Temp’ mappán, és minden egyes talált fájlnevet megjelenít.

GetParentFolderName

Ez a módszer a mappahierarchiában a következő szinten lévő mappa nevét adja vissza.

Szintaktika:

GetParentFolderName (path)

Sub FolderName()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\users\richard"MsgBox MyFSO.GetParentFolderName(Pth)End Sub

Ez a ‘Users’ mappát adja vissza, mivel ez a ‘richard’ mappa ‘szülője’.

A ‘Create’ módszerek használata

Az FSO-val új mappát és elérési utat hozhat létre, valamint létrehozhat egy szöveges fájlt.

CreateFolder

Megadhatja a létrehozandó új mappa elérési útvonalának nevét. Ennek az a veszélye, hogy ha a mappa már létezik, akkor hiba lép fel. A ‘FolderExists’ metódussal biztosíthatja, hogy ez ne történjen meg.

Az alábbi szintaxis:

CreateFolder (foldername)

Sub CreateNewFolder()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\MyFolder"If MyFSO.FolderExists(Pth) = False Then MyFSO.CreateFolder (Pth)End IfEnd Sub

Ez a kód létrehoz egy új mappát ‘MyFolder’ néven a meglévő ‘C:\temp’ elérési útvonal alatt.

CreateTextFile

Ez a módszer lehetővé teszi egy egyszerű szöveges fájl létrehozását és közvetlen írását.

Szintaktikája:

CreateTextFile (fájlnév, ])

Sub CreateTextFile()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\Myfile.txt"Set Fn = MyFSO.CreateTextFile(Pth,True)Fn.Write "Add my own text here" & vbLf & "This is the second line"Fn.CloseEnd Sub

Ez a kód létrehoz egy ‘Myfile.txt’ nevű szöveges fájlt a ‘C:’ meghajtó ‘Temp’ mappájában, majd két sor szöveget ír bele.

Megjegyezzük, hogy a kiírandó karakterláncba egy sortovábbító karaktert fűzünk be.

Ha az elérési út, ahová írunk, nem létezik, akkor hibaüzenetet kapunk. A ‘FolderExists’ módszerrel ellenőrizheti ezt a fájl létrehozása előtt.

Egy opcionális paraméterrel felülírhatja a meglévő fájlt, ha szükséges – ez lehet True vagy False. Az alapértelmezett érték True.

A ‘Másolás’ módszerek használata

Ezekkel a módszerekkel másolhat egy fájlt vagy mappát egy másik helyre.

CopyFile

Ez a módszer egy fájlt másol át az egyik mappahelyről egy másikra. Vegye figyelembe, hogy a másolás sikertelen lesz, ha a célhelyen a csak olvasható attribútum van beállítva.

A szintaxis:

CopyFile forrás, cél,

Sub CopyFile()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueEnd Sub

Ez a kód a ‘C:\temp’-ben található összes szöveges (txt) fájlt átmásolja a ‘C:\temp\myfolder\’-be, szükség esetén felülírva a fájlt. A Felülírás alapértelmezett beállítása True.

A fájlnevekhez használhat csillag (*) jokert, de nem használhat kérdőjeles (?) jokert az egyes karakterek jelölésére.

CopyFolder

Ezzel a módszerrel egy teljes mappát másolhat át egyik helyről egy másikra.

A szintaxis a következő:

CopyFolder source, destination,

Sub CopyFolder()Dim MyFSO As New FileSystemObjectMyFSO.CopyFolder "C:\temp\*", "C:\users\richard\"End Sub

Ez a kód a ‘C:\temp’ alatti összes mappát és fájlt a ‘C:\users\richard’ helyre másolja. A létrehozott új mappa a ‘C:\users\richard\myfolder’ lesz, mivel a ‘C:\temp’-ben volt egy ‘myfolder’ nevű mappa.

Ezzel a módszerrel négy lehetséges eredményt érhetünk el:

  • Ha a cél nem létezik, akkor a forrásmappa és tartalma másolódik.
  • Ha a célállomás már létezik, akkor hiba lép fel.
  • Ha a célállomás egy mappa, akkor a forrásmappa és annak tartalma kerül másolásra. Hiba lép fel, ha az Overwrite értéke False, és a célállomáson már van egy fájl másolata.
  • Ha a célállomás csak olvasásra van beállítva, hiba lép fel, ha az overwrite értéke false.

Ez a módszer az első hibánál megáll, amellyel találkozik. A hiba bekövetkezése előtt sikeres műveletek visszaállítására nem kerül sor.

A ‘Mozgatás’ módszerek használata

Ezek a módszerek fájlok vagy mappák más helyre történő áthelyezésére használhatók. Ez ugyanaz, mint az egyik helyről történő kivágás és beillesztés egy másik helyre. Vegye figyelembe, hogy ha az áthelyezendő fájl nyitva van, akkor a Mozgatás módszer hibaüzenettel sikertelen lesz.

MoveFile

Ez a módszer egy adott fájl áthelyezésére szolgál egy másik helyre. A forrás utolsó elérési útvonalkomponensében engedélyezettek a helyettesítő karakterek.

Szintaktika:

MoveFile forrás, cél

Sub MoveAFile()Dim MyFSO As New FileSystemObjectMyFSO.MoveFile "C:\temp\*", "C:\temp\myfolder"End Sub

Ez a kód a ‘C:\temp’ címen található összes fájlt a ‘C:\temp\myfolder’ címre mozgatja.

A forrás- és a célmappának léteznie kell, mivel a célmappa nem jön létre automatikusan.

Ez a módszer az első hiba esetén megáll. A hiba bekövetkezése előtt sikeresen végrehajtott műveletek visszaállítására nem kerül sor.

MoveFolder

Ez a módszer egy adott mappát áthelyez egy másik helyre.

Szintaktikája:

MoveFolder (source, destination)

Sub MoveAFolder()Dim MyFSO As New FileSystemObjectMyFSO.MoveFolder "C:\temp\myfolder", "C:\temp\mydestination"End Sub

Ez a kód az ‘myfolder’ mappát és tartalmát az ‘mydestination’ mappába helyezi át. A ‘myfolder’ ténylegesen törlődik, és létrejön a ‘mydestination’, a ‘myfolder’ tartalmával együtt.

Ha a célmappa már létezik, akkor hiba lép fel.

A ‘Delete’ módszerek használata

Ezek a módszerek fájlok vagy mappák törlésére szolgálnak. Óvatosan kell használni őket, mivel nincs visszaállítási vagy visszavonási módszer, ha valami rosszul sülne el.

DeleteFile

Ez a módszer egyedi fájlok vagy fájlcsoportok törlését végzi el vadkeresztek használatával.

Szintaktikája:

DeleteFile filespec,

Sub DeleteFiles()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C:\temp\*"End Sub

Ez a kód a ‘C:\temp’

A Force paraméter opcionális, és True vagy False értékre állítható. Ha True értékre van állítva, akkor a csak olvasható fájlok törlésre kerülnek. Az alapértelmezett érték False.

DeleteFolder

Ez a módszer egy megadott mappát és annak tartalmát törli.

A szintaxis:

DeleteFolder folderspec,

Sub DeleteFolders()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFolder "C:\temp\MyDestination"End Sub

Ez a kód a ‘MyDestination’ mappát és az abban lévő összes fájlt törli. A ‘temp’ mappa megmarad.

A Force paraméter opcionális, és True vagy False értékre állítható. Ha True értékre van állítva, akkor a csak olvasható mappák törlésre kerülnek. Az alapértelmezett érték a False.

Az elérési útvonal utolsó összetevőjében használhatók karakterek. Ha a mappa nem található, akkor hibaüzenet jelenik meg.

Ez a módszer megáll az első hibánál, amellyel találkozik. A hiba bekövetkezése előtt sikeres műveleteket nem lehet visszavonni.

Módszerek az FSO-ban

OpenAsTextStream.

Ez a módszer megnyit egy megadott fájlt mint Text Stream objektumot, és lehetővé teszi annak olvasását vagy írását. A módszer előnye, hogy bármilyen fájltípust meg tud nyitni és a rendelkezésre álló szöveget ki tudja nyerni.

A szintaxis a következő:

OpenAsTextStream (])

A ‘iomode’ paraméter csak olvasást (1), olvasást/írást (2) és csatolást (8) tesz lehetővé. Az olvasás/írás paraméter felülírja a fájlt.

A ‘format’ paraméter értéke -2 a rendszer alapértelmezéséhez, -1 a fájl Unicode-ként való megnyitásához, és 0 a fájl ASCII-ként (American Standard Code for Information Interchange) való megnyitásához.

Sub TextStream()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")Set ts = f.OpenAsTextStream(2)ts.Write "My new text"ts.CloseSet ts = f.OpenAsTextStream(1)s = ts.ReadLineMsgBox sts.CloseEnd Sub

Ez a kód egy meglévő szöveges fájlt kap, és a ‘GetFile’ módszerrel objektumként létrehozza. Ezután megnyitja a szövegfolyamot olvasás / írásként (2), és ír egy sor szöveget. Ezután a fájlt bezárja, majd újra megnyitja olvasásként (1), és beolvas belőle egy sort, amely aztán üzenetdobozként jelenik meg.

Megjegyezzük, hogy az olvasott sort egy változóba kell helyezni, mielőtt az üzenetdobozban megjeleníthető lenne.

BuildPath

Ez a módszer egy mappa vagy fájl nevét csatolja egy meglévő mappa elérési útvonalának végéhez. Ez csak egy szöveges karakterláncot hoz létre, és valójában nem hozza létre az új mappát.

A szintaxis a következő:

BuildPath (path, name)

Sub BuildPth()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npEnd Sub

Ez a módszer megjeleníti a ‘C:\temp\ANewFolder’ mappát. Ha azonban ténylegesen használni akarjuk ezt a mappát, akkor a ‘CreateFolder’ metódust kell használnunk.

OpenTextFile

Ez a metódus lehetővé teszi fájlok megnyitását és a beállított paramétereknek megfelelő olvasását vagy írását. Hasonlóan működik, mint az OpenAsTextStream metódus.

Szintaktikája:

OpenTextFile (fájlnév, ]])

A ‘iomode’ paraméter lehetővé teszi a ForReading, ForWriting és ForAppending használatát. A ForWriting paraméter felülírja a fájlt.

A ‘create’ paraméter egy Boolean érték. A True azt jelenti, hogy új fájl jön létre, ha a megadott fájlnév nem létezik. A False azt jelenti, hogy nem jön létre fájl, ha a fájlnév nem található. Az alapértelmezett érték False.

A ‘format’ paraméter beállítható TristateFalse, TristateMixed, TristateTrue és TristateUseDefault értékre attól függően, hogy a fájl ASCII vagy Unicode.

Sub OpenTxtFile()Dim MyFSO As New FileSystemObjectSet ts = MyFSO.OpenTextFile("C:\temp\myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.CloseEnd Sub

Ez a kód beolvas egy sort a ‘myfile.txt’ szöveges fájlból.

Az OpenTextFile módszer előnye az OpenAsTextStreamMódszerrel szemben, hogy a paraméterekhez legördülő menüpontok állnak rendelkezésre, amelyek értelmesebbek, mintha megpróbálnánk megjegyezni a különböző paraméteropciók megfelelő numerikus értékeit.

A FSO tulajdonságai

Drives

Ez a tulajdonság a számítógépen elérhető meghajtók gyűjteményét tartalmazza.

Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveSet Dr = MyFSO.DrivesFor Each d In Dr MsgBox d.DriveLetterNext dEnd Sub

Ez a kód visszaadja a számítógépen elérhető összes meghajtó betűjelét.

Név

Ez egy megadott fájl vagy mappa nevét adja vissza.

Sub NameExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub

Ez a kód megadja a fájl nevét és a vele kapcsolatos információkat a meghajtó tulajdonság segítségével.

Path

A Path tulajdonság elkülöníti az elérési utat a fájl specifikációtól.

Sub PathExample()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")i = f.Path & f.Name & " on Drive " & UCase(f.Drive) & vbCrLfi = i & "Created: " & f.DateCreated & vbCrLfi = i & "Last Accessed: " & f.DateLastAccessed & vbCrLfi = i & "Last Modified: " & f.DateLastModifiedMsgBox iEnd Sub

Ez a példa ugyanúgy működik, mint a Name példa, azzal a különbséggel, hogy most a fájl elérési útvonalát adja meg.

Size

A Size tulajdonság megadja egy mappa vagy egy fájl méretét.

Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeEnd Sub

A fenti kód a ‘C:\temp\’ mappa méretét adja vissza.

Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeEnd Sub

A fenti kód a ‘myfile.txt’.

Type

A type tulajdonság a fájl vagy mappa típusának szövegét adja vissza.

Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeEnd Sub

Ez a fenti kód a ‘File folder’ szöveget adja vissza.

Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeEnd Sub

Ez a fenti kód a ‘Text document’ szöveget adja vissza.

Figyeljük meg a ‘GetFolder’ és a ‘GetFile’ használatát minden példában.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.