- Použití objektu FileSystemObject (FSO) v Excelu VBA
- Vytvoření objektu FileSystemObject
- Použití metod ‚Exists‘
- Použití metod ‚Get‘
- GetAbsolutePathName
- GetBaseName
- GetDriveName
- GetExtensionName
- GetFile
- GetFolder
- GetParentFolderName
- Použití metod ‚Create‘
- CreateFolder
- CreateTextFile
- Použití metod ‚Copy‘
- CopyFile
- CopyFolder
- Použití metod ‚Přesunout‘
- PřesunoutSoubor
- MoveFolder
- Použití metod ‚Delete‘
- DeleteFile
- DeleteFolder
- Další metody ve FSO
- OpenAsTextStream.
- BuildPath
- OpenTextFile
- Vlastnosti FSO
- Drives
- Název
- Path
- Size
- Type
Použití objektu FileSystemObject (FSO) v Excelu VBA
Objekt FileSystemObject (FSO) poskytuje přístup k celé řadě funkcí pro přístup k souborovému systému počítače. Pomocí tohoto objektu můžete snadno přistupovat k souborům, složkám a jednotkám a také číst a zapisovat do souborů.
Mnoho funkcí FSO byste mohli napsat sami v tradičním jazyce VBA, ale vyžadovalo by to více kódování a pro začínajícího vývojáře by bylo obtížnější je udržovat a pochopit. FSO je osvědčené rozhraní API (Application Programming Interface) a je spolehlivější než váš vlastní kód. Je snadno použitelné a připravené a dostupné.
FSO pracuje podle mezinárodních standardů a nastavení, které máte ve svém počítači. Pokud distribuujete svou aplikaci Excel po celém světě, pak se použití FSO postará o případné rozdíly v nastavení mezi jednotlivými zeměmi, což by váš vlastní kód těžko zvládl.
FSO vám umožní dělat v kódu VBA téměř vše, co byste mohli dělat v Průzkumníku souborů systému Windows. Poskytne vám kompletní přístup k souborovému systému Windows.
Vytvoření objektu FileSystemObject
Objekt FileSytemObject není součástí Excel VBA. FSO můžete použít vytvořením objektu (pozdní vazba) ve VBA:
Sub CreateFSO()Set MyFSO = CreateObject("Scripting.FileSystemObject")End Sub
Případně můžete do VBA přidat odkaz na knihovnu FSO. Tomuto postupu se říká časná vazba a je rychlejší než pozdní vazba, protože objekt nemusí být vytvořen při spuštění vašeho kódu.
Chcete-li přidat odkaz, musíte stisknutím kláves Alt-F11 vstoupit do editoru Visual Basic (VBE) a poté použít „Nástroje|Reference“ z nabídky VBE. Tím se zobrazí vyskakovací okno, ve kterém můžete vybrat příslušnou referenci (viz níže).
Přejděte dolů seznamem dostupných referencí, dokud neuvidíte ‚Microsoft Scripting Runtime‘. Zaškrtněte políčko a klikněte na tlačítko OK a knihovna je nyní součástí vaší aplikace.
Umístění souboru knihovny DLL je C:\Windows\SysWOW64\scrrun.dll
Pokud distribuujete svou aplikaci dalším kolegům nebo na jiná místa, je nezbytné, aby měli tento soubor na správném místě ve svém počítači, jinak bude váš kód chybovat.
Vyplatí se umístit na událost „WorkbookOpen“ past na chyby pomocí příkazu Dir a zkontrolovat, zda soubor existuje. Pokud neexistuje, pak vydejte varovnou zprávu a soubor Excelu zavřete.
Po přidání odkazu můžete k vytvoření FSO použít následující kód:
Sub TestFSO()Dim MyFSO As New FileSystemObjectEnd Sub
Ve všech příkladech v tomto článku bude k vytvoření FSO použita tato metodika.
FSO má k dispozici mnoho metod a vlastností. Ty jsou zde rozděleny do sekcí podle toho, co umí.
Použití metod ‚Exists‘
Metodu FSO můžete použít ke kontrole, zda disk, složka nebo soubor existuje. Tyto metody se snadno používají a vyžadují pouze jeden parametr.
Sub CheckExistance()Dim MyFSO As New FileSystemObjectMsgBox MyFSO.DriveExists("C:")MsgBox MyFSO.FolderExists("C:\temp\")MsgBox MyFSO.FileExists("C:\temp\testfile.txt")End Sub
Všechny tyto příkazy vrátí hodnotu ‚True‘ za předpokladu, že váš počítač má jednotku C:, na ní složku s názvem ‚Temp‘ a ve složce Temp soubor s názvem ‚testfile.txt‘
Textové řetězce v parametrech nerozlišují velikost písmen. V žádné z těchto metod nelze použít zástupné znaky.
K popisu umístění složky nebo souboru nelze použít ani adresy URL (Uniform Resource Locators). FSO pracuje výhradně s operačním systémem Windows a souborovým systémem v něm. Pro umístění na externím serveru musíte nejprve namapovat jednotku a pak použít samotnou cestu k jednotce.
Použití metod ‚Get‘
FSO má řadu metod pro získání informací o souboru a cestě, buď rozdělení cesty a souboru, nebo získání informací o souboru nebo složce, jako je datum vytvoření nebo datum změny.
GetAbsolutePathName
Tato funkce poskytne kompletní cestu od kořene zadané jednotky.
Syntaxe je:
GetAbsolutePathName (pathspec)
Sub AbsolutePath()Dim MyFSO As New FileSystemObject, Pth As StringPth = "c:..."MsgBox MyFSO.GetAbsolutePathName(Pth)End Sub
Tato funkce vrátí řetězec ‚C:\Users\Richard\Documents‘. Je to proto, že cesta byla zadána jako C: následovaná třemi tečkami. Každá tečka znamená další úroveň ve struktuře složek.
GetBaseName
Tento kód vrátí název zadaného souboru nebo složky.
Syntaxe je:
GetBaseName (cesta)
Sub BaseName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetBaseName(Pth)End Sub
Tento kód vrátí ‚testfile‘. Metoda vrací poslední část v názvu cesty. Pokud se jedná o soubor, pak nevrací příponu souboru.
Pokud cestu nelze najít, bude vrácen prázdný řetězec.
GetDrive
Tato funkce umožňuje použít kód pro přístup k informacím o jednotce na základě zadaného písmene jednotky.
Syntaxe je:
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
Tato metoda vrací objekt jednotky na základě zadané jednotky. Tento objekt můžete použít pro přístup k informacím o jednotce, například o volném místě, které je k dispozici.
GetDriveName
Tato metoda oddělí název jednotky z řetězce cesta / název souboru.
Syntaxe je:
GetDriveName (cesta)
Sub DriveName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetDriveName(Pth)End Sub
Tato funkce vrátí ‚C:‘
GetExtensionName
Tato funkce vrátí příponu souboru v zadané cestě.
Syntaxe je:
GetExtensionName (cesta)
Sub ExtensionName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetExtensionName(Pth)End Sub
Vrátí se ‚txt‘.
Pokud není zadán žádný soubor, vrátí se prázdný řetězec.
GetFile
Tato metoda vrací objekt souboru, který obsahuje různé informace o samotném souboru.
Syntaxe je:
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
Vrátí datum a čas vytvoření zadaného souboru. Pokud není zadán žádný soubor nebo soubor neexistuje, zobrazí se chyba ‚soubor nenalezen‘.
Sub FileName()Dim MyFSO As New FileSystemObject, Pth As StringPth = "C:\temp\testfile.txt"MsgBox MyFSO.GetFileName(Pth)End Sub
Vrátí se ‚testfile.txt‘.
GetFolder
Vytvoří objekt složky pro základní složku v zadané cestě. Cesta musí obsahovat pouze názvy složek. Nesmí obsahovat jména souborů, jinak dojde k chybě.
Syntaxe je:
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
Objekt složky má v sobě různé informace, ke kterým lze přistupovat. V tomto případě vrací datum, kdy byla složka vytvořena.
Tuto metodu můžete také použít k získání všech názvů souborů v dané složce:
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
Tento kód bude iterovat přes složku ‚Temp‘ a zobrazí každý nalezený název souboru.
GetParentFolderName
Tato metoda vrátí název složky v další úrovni hierarchie složek.
Syntaxe je:
GetParentFolderName (cesta)
Sub FolderName()Dim MyFSO As New FileSystemObject, Pth As String, Fo As FolderPth = "C:\users\richard"MsgBox MyFSO.GetParentFolderName(Pth)End Sub
Tato funkce vrátí ‚Users‘, protože to je ‚rodič‘ pro složku ‚richard‘.
Použití metod ‚Create‘
Pomocí FSO můžete vytvořit novou složku a cestu a vytvořit textový soubor.
CreateFolder
Můžete zadat název cesty k nové složce, která se má vytvořit. Nebezpečí tohoto postupu spočívá v tom, že pokud složka již existuje, dojde k chybě. Můžete použít metodu ‚FolderExists‘, která zajistí, že k tomu nedojde.
Syntaxe je:
CreateFolder (jméno složky)
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
Tento kód vytvoří novou složku s názvem ‚MyFolder‘ pod stávající cestou ‚C:\temp‘.
CreateTextFile
Tato metoda umožňuje vytvořit jednoduchý textový soubor a přímo do něj zapisovat.
Syntaxe je:
CreateTextFile (název souboru, ])
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
Tento kód vytvoří textový soubor s názvem ‚Myfile.txt‘ ve složce ‚Temp‘ na disku ‚C:‘ a poté do něj zapíše dva řádky textu.
Všimněte si, že do zapisovaného řetězce je vložen znak pro posuv řádku.
Pokud cesta, do které zapisujete, neexistuje, dojde k chybě. Před vytvořením souboru to můžete zkontrolovat pomocí metody ‚FolderExists‘.
V případě potřeby je zde volitelný parametr pro přepsání existujícího souboru – může být True nebo False. Výchozí hodnota je True.
Použití metod ‚Copy‘
Těmito metodami můžete zkopírovat soubor nebo složku do jiného umístění.
CopyFile
Tato metoda zkopíruje soubor z jednoho umístění složky do jiného. Všimněte si, že kopírování selže, pokud má cílové umístění nastaven atribut pouze pro čtení.
Syntaxe je:
CopyFile zdroj, cíl,
Sub CopyFile()Dim MyFSO As New FileSystemObjectMyFSO.CopyFile "C:\temp\*.txt", "C:\temp\myfolder\", TrueEnd Sub
Tento kód provede kopii všech textových (txt) souborů v ‚C:\temp‘ do ‚C:\temp\myfolder\‘, přičemž v případě potřeby soubor přepíše. Výchozí nastavení pro Přepsat je True.
Pro názvy souborů můžete použít zástupný znak hvězdička (*), ale nemůžete použít zástupný znak otazník (?) pro jednotlivé znaky.
CopyFolder
Tuto metodu můžete použít ke zkopírování celé složky z jednoho umístění do jiného.
Syntaxe je:
CopyFolder source, destination,
Sub CopyFolder()Dim MyFSO As New FileSystemObjectMyFSO.CopyFolder "C:\temp\*", "C:\users\richard\"End Sub
Tento kód zkopíruje všechny složky a soubory pod ‚C:\temp‘ do ‚C:\users\richard‘. Nově vytvořená složka bude ‚C:\users\richard\myfolder‘, protože ‚C:\temp‘ v sobě měla složku ‚myfolder‘.
Při použití této metody jsou čtyři možné výsledky:
- Pokud cílová složka neexistuje, zkopíruje se zdrojová složka a její obsah.
- Jestliže cílová složka již existuje, dojde k chybě.
- Jestliže je cílová složka složkou, zkopíruje se zdrojová složka a její obsah. K chybě dojde, pokud je hodnota Overwrite nastavena na False a v cíli již existuje kopie souboru.
- Je-li cíl nastaven pouze pro čtení, dojde k chybě, pokud je hodnota Overwrite nastavena na false.
Tato metoda se zastaví při první chybě, na kterou narazí. Nedochází ke zpětnému vrácení akcí, které byly úspěšné před výskytem chyby.
Použití metod ‚Přesunout‘
Tyto metody lze použít k přesunu souborů nebo složek do jiných umístění. Je to stejné jako vyjmutí z jednoho umístění a vložení do jiného umístění. Všimněte si, že pokud je přesouvaný soubor otevřený, metoda Přesunout selže s chybou.
PřesunoutSoubor
Tato metoda slouží k přesunu určitého souboru do jiného umístění. V poslední složce cesty zdroje jsou povoleny zástupné znaky.
Syntaxe je:
MoveFile zdroj, cíl
Sub MoveAFile()Dim MyFSO As New FileSystemObjectMyFSO.MoveFile "C:\temp\*", "C:\temp\myfolder"End Sub
Tento kód přesune všechny soubory nalezené na adrese ‚C:\temp‘ do ‚C:\temp\myfolder‘.
Složky zdroj a cíl musí existovat, protože cílová složka se nevytvoří automaticky.
Tato metoda se zastaví při první chybě, na kterou narazí. Nedochází ke zpětnému vrácení akcí, které byly úspěšné před výskytem chyby.
MoveFolder
Tato metoda přesune určitou složku z jednoho umístění do jiného.
Syntaxe je:
MoveFolder (source, destination)
Sub MoveAFolder()Dim MyFSO As New FileSystemObjectMyFSO.MoveFolder "C:\temp\myfolder", "C:\temp\mydestination"End Sub
Tento kód přesune složku ‚myfolder‘ a její obsah do složky ‚mydestination‘. Složka ‚myfolder‘ je ve skutečnosti smazána a složka ‚mydestination‘ je vytvořena spolu s obsahem ze složky ‚myfolder‘.
Pokud cílová složka již existuje, dojde k chybě.
Použití metod ‚Delete‘
Tyto metody slouží k odstranění souborů nebo složek. Je třeba je používat opatrně, protože pokud se něco pokazí, není k dispozici žádná metoda vrácení nebo odvolání.
DeleteFile
Tato metoda odstraní jednotlivé soubory nebo skupinu souborů pomocí zástupných znaků.
Syntaxe je:
DeleteFile filespec,
Sub DeleteFiles()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFile "C:\temp\*"End Sub
Tento kód odstraní všechny soubory ve složce ‚C:\temp‘
Parametr Force je nepovinný a nastavuje se na True nebo False. Pokud je nastaven na True, budou smazány soubory určené pouze pro čtení. Výchozí hodnota je False.
DeleteFolder
Tato metoda odstraní zadanou složku a její obsah.
Syntaxe je:
DeleteFolder folderspec,
Sub DeleteFolders()Dim MyFSO As New FileSystemObjectMyFSO.DeleteFolder "C:\temp\MyDestination"End Sub
Tento kód odstraní složku ‚MyDestination‘ a všechny soubory v této složce. Složka ‚temp‘ zůstane zachována.
Parametr Force je nepovinný a nastavuje se na hodnotu True nebo False. Pokud je nastaven na True, budou odstraněny složky určené pouze pro čtení. Výchozí hodnota je False.
V poslední složce cesty lze použít zástupné znaky. Pokud není složka nalezena, dojde k chybě.
Tato metoda se zastaví při první chybě, na kterou narazí. Nedochází ke zpětnému vrácení akcí, které byly úspěšné před výskytem chyby.
Další metody ve FSO
OpenAsTextStream.
Tato metoda otevře zadaný soubor jako objekt Text Stream a umožní jeho čtení nebo zápis. Výhodou této metody je, že může otevřít jakýkoli typ souboru a extrahovat dostupný text.
Syntaxe je:
OpenAsTextStream (])
Parametr ‚iomode‘ umožňuje pouze čtení (1), čtení/zápis (2) a připojování (8). Parametr čtení/zápis soubor přepíše.
Parametr ‚format‘ je nastaven na -2 pro výchozí systém, -1 pro otevření souboru jako Unicode a 0 pro otevření souboru jako ASCII (American Standard Code for Information Interchange).
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
Tento kód získá existující textový soubor a vytvoří jej jako objekt pomocí metody ‚GetFile‘. Poté otevře textový proud jako čtení / zápis (2) a zapíše řádek textu. Soubor je poté uzavřen a znovu otevřen jako čtení (1) a je z něj přečten řádek, který je poté zobrazen jako okno zprávy.
Všimněte si, že přečtený řádek musí být umístěn do proměnné, než může být zobrazen v poli zprávy.
BuildPath
Tato metoda připojí název složky nebo souboru na konec existující cesty ke složce. Tím se pouze vytvoří textový řetězec a nová složka se ve skutečnosti nevytvoří.
Syntaxe je:
BuildPath (cesta, název)
Sub BuildPth()Dim MyFSO As New FileSystemObjectnp = MyFSO.BuildPath("C:\temp", "ANewFolder")MsgBox npEnd Sub
Tímto se zobrazí ‚C:\temp\ANewFolder‘. Pokud však chcete tuto složku skutečně použít, musíte použít metodu ‚CreateFolder‘.
OpenTextFile
Tato metoda umožňuje otevírat soubory a číst z nich nebo do nich zapisovat podle nastavených parametrů. Pracuje podobně jako metoda OpenAsTextStream.
Syntaxe je:
OpenTextFile (jméno souboru, ]])
Parametr ‚iomode‘ umožňuje ForReading, ForWriting a ForAppending. Parametr ForWriting soubor přepíše.
Parametr ‚create‘ je logická hodnota. True znamená, že bude vytvořen nový soubor, pokud zadané jméno souboru neexistuje. False znamená, že nebude vytvořen žádný soubor, pokud nebude nalezen zadaný název souboru. Výchozí hodnota je False.
Parametr ‚format‘ může být nastaven na TristateFalse, TristateMixed, TristateTrue a TristateUseDefault podle toho, zda je soubor ASCII nebo Unicode.
Sub OpenTxtFile()Dim MyFSO As New FileSystemObjectSet ts = MyFSO.OpenTextFile("C:\temp\myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.CloseEnd Sub
Tento kód načte řádek z textového souboru ‚myfile.txt‘.
Výhodou metody OpenTextFile oproti metodě OpenAsTextStreamMethod je, že má rozbalovací seznamy parametrů, které jsou smysluplnější než snaha zapamatovat si příslušné číselné hodnoty pro různé možnosti parametrů.
Vlastnosti FSO
Drives
Tato vlastnost obsahuje kolekci dostupných jednotek v počítači.
Sub Drv()Dim MyFSO As New FileSystemObject, d As DriveSet Dr = MyFSO.DrivesFor Each d In Dr MsgBox d.DriveLetterNext dEnd Sub
Tento kód vrátí každé písmeno jednotky dostupné v počítači.
Název
Vrátí název zadaného souboru nebo složky.
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
Tento kód uvede název souboru a informace o něm pomocí vlastnosti Drive.
Path
Vlastnost Path oddělí cestu od specifikace souboru.
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
Tento příklad funguje stejným způsobem jako příklad Name s tím rozdílem, že nyní poskytuje cestu k souboru.
Size
Vlastnost Size uvede velikost složky nebo souboru.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.SizeEnd Sub
Tento výše uvedený kód vrátí velikost složky ‚C:\temp\‘.
Sub FSize()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.SizeEnd Sub
Tento výše uvedený kód vrátí velikost souboru ‚myfile.txt‘.
Type
Vlastnost type vrátí text pro typ souboru nebo složky.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFolder("C:\temp\")MsgBox f.TypeEnd Sub
Tento výše uvedený kód vrátí text ‚Složka souboru‘.
Sub FType()Dim MyFSO As New FileSystemObjectSet f = MyFSO.GetFile("C:\temp\myfile.txt")MsgBox f.TypeEnd Sub
Tento výše uvedený kód vrátí text ‚Textový dokument‘.
Všimněte si, že v každém příkladu je použito ‚GetFolder‘ a ‚GetFile‘.
Všimněte si, že v každém příkladu je použito ‚GetFolder‘.