Použití FileSystemObject (FSO) v aplikaci Excel VBA
Server FileSystemObject (FSO) vám poskytuje přístup k celé řadě funkcí pro přístup k systému souborů vašeho 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 v tradiční VBA, ale vyžadovalo by to více kódování a pro příchozího vývojáře by bylo obtížnější je udržovat a chápat. FSO je osvědčené API (Application Programming Interface) a je spolehlivější než váš vlastní kód. Je snadno použitelný, připravený a dostupný.
FSO funguje podle mezinárodních standardů a nastavení, která máte ve svém počítači. Pokud svou aplikaci Excel distribuujete globálně, pak se pomocí FSO postará o veškeré rozdíly v nastavení mezi zeměmi, s čímž by měl váš vlastní kód potíže.
FSO vám umožní dělat téměř vše v kódu VBA, co byste mohli dělat v Průzkumníku souborů Windows. Poskytuje vám úplný přístup k systému souborů Windows.
Vytvoření FileSystemObject
Soubor FileSytemObject není součástí aplikace Excel VBA. FSO můžete použít vytvořením objektu (pozdní vazba) ve VBA:
123 | Dílčí CreateFSO ()Nastavit MyFSO = CreateObject ("Scripting.FileSystemObject")End Sub |
Alternativně můžete přidat odkaz do VBA pro knihovnu FSO. Toto se nazývá časná vazba a je rychlejší než pozdní vazba, protože objekt nemusí být vytvořen při spuštění kódu.
Chcete-li přidat odkaz, musíte stisknutím Alt-F11 vstoupit do editoru jazyka Visual Basic (VBE) a poté použít „Nástroje | Reference“ z nabídky VBE. Zobrazí se vyskakovací okno, ve kterém můžete vybrat příslušnou referenci (viz níže).
Procházejte seznamem dostupných odkazů dolů, dokud neuvidíte „Microsoft Scripting Runtime“. Zaškrtněte políčko a klikněte na 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 místům, je nezbytné, aby měli tento soubor ve svém počítači na správném místě, jinak se váš kód pokazí.
Stojí za to umístit chybovou past na událost „WorkbookOpen“ pomocí příkazu Dir a zkontrolovat, zda soubor existuje. Pokud chybí, zadejte varovnou zprávu a zavřete soubor aplikace Excel.
Po přidání odkazu můžete k vytvoření FSO použít následující kód: Once the reference has been added, you can use the following code to create the FSO:
123 | Dílčí testFSO ()Dim MyFSO jako nový FileSystemObjectEnd Sub |
Všechny příklady v tomto článku použijí tuto metodiku k vytvoření FSO.
FSO má k dispozici mnoho metod a vlastností. Ty jsou zde rozděleny do sekcí podle toho, co umí.
Pomocí metod „Existuje“
Pomocí metody FSO můžete zkontrolovat, zda existuje jednotka, složka nebo soubor. Tyto metody se snadno používají a vyžadují pouze jeden parametr.
123456 | Dílčí kontrola Vzdálenost ()Dim MyFSO jako nový FileSystemObjectMsgBox MyFSO.DriveExists ("C:")MsgBox MyFSO.FolderExists ("C: \ temp \")MsgBox MyFSO.FileExists ("C: \ temp \ testfile.txt")End Sub |
Všechna tato prohlášení vrátí hodnotu „True“ za předpokladu, že váš počítač má jednotku C:, složku na ní nazvanou „Temp“ a soubor ve složce Temp nazvaný „testfile.txt“
V textových řetězcích v parametrech se nerozlišují malá a velká písmena. V žádné z těchto metod nemůžete použít zástupné znaky.
Adresy URL (Uniform Resource Locators) také nemůžete použít k popisu umístění složky nebo souboru. FSO funguje čistě na operačním systému Windows a na systému souborů na něm. Pokud jde o umístění externího serveru, musíte k tomu nejprve namapovat jednotku a poté použít samotnou cestu k disku.
Pomocí metod „Získat“
FSO má mnoho způsobů, jak získat informace o souboru a cestě, a to buď rozdělením cesty a souboru, nebo získáním informací o souboru nebo složce, jako je datum vytvoření nebo datum změny.
GetAbsolutePathname
To poskytne úplnou cestu z kořenového adresáře zadané jednotky.
Syntaxe je:
GetAbsolutePathName (roadspec)
12345 | Sub AbsolutePath ()Dim MyFSO jako nový FileSystemObject, Pth jako řetězecPth = "c: …"MsgBox MyFSO.GetAbsolutePathName (Pth)End Sub |
Tím se vrátí řetězec „C: \ Users \ Richard \ Documents“. Důvodem je, ž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
Tím se vrátí název zadaného souboru nebo složky.
Syntaxe je:
GetBaseName(cesta)
12345 | Sub BaseName ()Dim MyFSO jako nový FileSystemObject, Pth jako řetězecPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetBaseName (Pth)End Sub |
Tento kód vrátí „testovací soubor“. Metoda vrací poslední část v názvu cesty. Pokud se jedná o soubor, nevrací příponu souboru.
Pokud cestu nelze najít, bude vrácen prázdný řetězec.
GetDrive
To vám umožní použít kód pro přístup k informacím o jednotce na základě zadaného písmene jednotky.
Syntaxe je:
GetDrive (drivepec)
123456 | Sub DriveInfo ()Dim MyFSO jako nový FileSystemObject, Pth jako řetězec, Dr jako diskPth = "C:"Nastavit Dr = MyFSO.GetDrive (Pth)MsgBox Dr.FreeSpaceEnd Sub |
Tato metoda vrací objekt jednotky na základě zadané jednotky. Tento objekt můžete použít k přístupu k informacím o jednotce, jako je například dostupné volné místo.
Už vás nebaví hledat příklady kódu VBA? Zkuste AutoMacro!
GetDriveName
Tato metoda oddělí název jednotky od řetězce cesty / názvu souboru.
Syntaxe je:
GetDriveName (cesta)
12345 | Sub DriveName ()Dim MyFSO jako nový FileSystemObject, Pth jako řetězecPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetDriveName (Pth)End Sub |
Tím se vrátí „C:“
GetExtensionName
Tím se vrátí přípona souboru v zadané cestě.
Syntaxe je:
GetExtensionName (cesta)
12345 | Sub ExtensionName ()Dim MyFSO jako nový FileSystemObject, Pth jako řetězecPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetExtensionName (Pth)End Sub |
Tím se vrátí „txt“.
Pokud není zadán žádný soubor, bude vrácen prázdný řetězec.
GetFile
Tato metoda vrací objekt souboru, který obsahuje různé informace o samotném souboru.
Syntaxe je:
GetFile (filepec)
123456 | PodsouborInfo ()Dim MyFSO jako nový FileSystemObject, Pth jako řetězec, Fn jako souborPth = "C: \ temp \ testfile.txt"Nastavit Fn = MyFSO.GetFile (Pth)MsgBox Fn.DateCreatedEnd Sub |
Tím se vrátí datum a čas, kdy byl zadaný soubor vytvořen. Pokud není zadán žádný soubor nebo soubor neexistuje, zobrazí se chyba „soubor nebyl nalezen“.
12345 | Podsoubor ()Dim MyFSO jako nový FileSystemObject, Pth jako řetězecPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetFileName (Pth)End Sub |
Tím se vrátí soubor „testfile.txt“.
GetFolder
Tím se vytvoří objekt složky pro základní složku v zadané cestě. Cesta musí obsahovat pouze názvy složek. Nesmí obsahovat žádná jména souborů, jinak dojde k chybě.
Syntaxe je:
GetFolder (folderspec)
123456 | PodsložkaInfo ()Dim MyFSO jako nový FileSystemObject, Pth jako řetězec, Fo jako složkaPth = "C: \ temp"Nastavit Fo = MyFSO.GetFolder (Pth)MsgBox Fo.DateCreatedEnd Sub |
Objekt složky obsahuje různé informace, ke kterým je přístup. V tomto případě vrátí datum vytvoření složky.
Tuto metodu můžete také použít k načtení všech názvů souborů v dané složce:
12345678 | Podsoubory ()Dim MyFSO jako nový souborSystemObject, Pth jako řetězec, Fo jako složka, Fn jako souborPth = "C: \ temp"Nastavit Fo = MyFSO.GetFolder (Pth)Za každý Fn v Fo. SouboryMsgBox Fn. JménoDalší FnEnd Sub |
Tento kód bude iterovat ve složce „Temp“ a zobrazí každý nalezený název souboru.
GetParentFolderName
Tato metoda vrátí název složky v další úrovni v hierarchii složek.
Syntaxe je:
GetParentFolderName (cesta)
12345 | Název podsložky ()Dim MyFSO jako nový FileSystemObject, Pth jako řetězec, Fo jako složkaPth = "C: \ users \ richard"MsgBox MyFSO.GetParentFolderName (Pth)End Sub |
Tím se vrátí „Uživatelé“, protože toto je „rodič“ pro složku „richard“.
Programování VBA | Generátor kódu pracuje pro vás!
Pomocí metod „Vytvořit“
Pomocí FSO můžete vytvořit novou složku a cestu a vytvořit textový soubor.
Vytvořit složku
Můžete zadat nový název cesty ke složce, která se má vytvořit. Hrozí nebezpečí, že pokud složka již existuje, dojde k chybě. Můžete použít metodu „FolderExists“, abyste zajistili, že k tomu nedojde.
Syntaxe je:
Vytvořit složku(název složky)
1234567 | Sub CreateNewFolder ()Dim MyFSO jako nový FileSystemObject, Pth jako řetězecPth = "C: \ temp \ MyFolder"Pokud MyFSO.FolderExists (Pth) = False ThenMyFSO.CreateFolder (Pth)Konec IfEnd Sub |
Tento kód vytvoří novou složku s názvem „MyFolder“ pod existující cestou „C: \ temp“.
CreateTextFile
Tato metoda vám umožňuje vytvořit jednoduchý textový soubor a zapisovat přímo do něj.
Syntaxe je:
CreateTextFile (název souboru, [ přepsat, [ unicode ]])
1234567 | Sub CreateTextFile ()Dim MyFSO jako nový FileSystemObject, Pth jako řetězecPth = "C: \ temp \ Myfile.txt"Nastavit Fn = MyFSO.CreateTextFile (Pth, True)Fn.Write „Přidat můj vlastní text sem“ & vbLf & „Toto je druhý řádek“Fn. ZavřítEnd 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 toho, že znak řádku je zřetězen do zapisovaného řetězce.
Pokud cesta, na kterou píšete, neexistuje, dojde k chybě. Můžete to zkontrolovat pomocí metody „FolderExists“ před vytvořením souboru.
V případě potřeby je existující soubor přepsán volitelným parametrem - může to být True nebo False. Výchozí hodnota je True.
Pomocí metod „Kopírovat“
Tyto metody můžete použít ke zkopírování souboru nebo složky do jiného umístění.
Programování VBA | Generátor kódu pracuje pro vás!
Zkopírovat soubor
Tato metoda zkopíruje soubor z jednoho umístění složky do jiného. Pokud má cílové umístění nastaven atribut jen pro čtení, kopie se nezdaří.
Syntaxe je:
Zkopírovat soubor zdroj, destinace, [ přepsat ]
1234 | Dílčí kopírovací soubor ()Dim MyFSO jako nový FileSystemObjectMyFSO.CopyFile "C: \ temp \*. Txt", "C: \ temp \ myfolder \", TrueEnd Sub |
Tento kód vytvoří kopii všech textových (txt) souborů na 'C: \ temp' do 'C: \ temp \ myfolder \', 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 s hvězdičkou (*), ale pro reprezentaci jednotlivých znaků nemůžete použít zástupný znak s otazníkem (?).
CopyFolder
Tuto metodu můžete použít ke kopírování celé složky z jednoho umístění do jiného.
Syntaxe je:
CopyFolder zdroj, destinace, [ přepsat ]
1234 | Dílčí kopírovací složka ()Dim MyFSO jako nový 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“ obsahuje složku s názvem „myfolder“.
Při použití této metody existují čtyři možné výsledky:
- Pokud cíl neexistuje, zkopíruje se zdrojová složka a obsah.
- Pokud cíl již existuje, dojde k chybě.
- Pokud je cílem složka, zkopíruje se zdrojová složka a její obsah. Pokud je Overwrite nastaveno na False a v cílovém umístění již existuje kopie souboru, dojde k chybě.
- Pokud je cíl nastaven pouze na čtení, dojde k chybě, pokud je přepis nastaven na hodnotu false.
Tato metoda se zastaví při první chybě, na kterou narazí. Než dojde k chybě, není možné vrátit zpět žádné akce, které byly úspěšné.
Pomocí metod „Přesunout“
Tyto metody lze použít k přesunu souborů nebo složek do jiných umístění. To je stejné jako vyjmutí z jednoho místa a vložení na jiné místo. Všimněte si, že pokud je soubor, který chcete přesunout, otevřený, metoda Move se nezdaří s chybou.
MoveFile
Tato metoda se používá k přesunu konkrétního souboru do jiného umístění. V komponentě poslední cesty zdroje jsou povoleny zástupné znaky.
Syntaxe je:
MoveFile zdroj, destinace
1234 | Sub MoveAFile ()Dim MyFSO jako nový FileSystemObjectMyFSO.MoveFile "C: \ temp \*", "C: \ temp \ myfolder"End Sub |
Tento kód přesune všechny soubory nalezené na ‘C: \ temp’ do ‘C: \ temp \ myfolder’.
Zdrojová a cílová složka musí existovat, protože cílová složka se nevytvoří automaticky.
Tato metoda se zastaví při první chybě, na kterou narazí. Než dojde k chybě, není možné vrátit zpět žádné akce, které byly úspěšné.
Programování VBA | Generátor kódu pracuje pro vás!
MoveFolder
Tato metoda přesune konkrétní složku z jednoho umístění do jiného.
Syntaxe je:
MoveFolder (zdroj, destinace)
1234 | Sub MoveAFolder ()Dim MyFSO jako nový FileSystemObjectMyFSO.MoveFolder "C: \ temp \ myfolder", "C: \ temp \ mydestination"End Sub |
Tento kód přesune složku „myfolder“ a obsah do složky „mydestination“. „Myfolder“ se účinně odstraní a „mydestination“ se vytvoří společně s obsahem z „myfolder“.
Pokud cílová složka již existuje, dojde k chybě.
Pomocí metod „Odstranit“
Tyto metody se používají k odstranění souborů nebo složek. Musí být používány opatrně, protože pokud se něco pokazí, neexistují metody vrácení zpět nebo zpět.
Smazat soubor
Tím se odstraní jednotlivé soubory nebo skupina souborů pomocí zástupných znaků.
Syntaxe je:
Smazat soubor filepec, [ platnost ]
1234 | Dílčí mazací soubory ()Dim MyFSO jako nový FileSystemObjectMyFSO.DeleteFile "C: \ temp \*"End Sub |
Tento kód odstraní všechny soubory ve složce „C: \ temp“
Parametr Force je volitelný a je nastaven na True nebo False. Pokud je nastavena na hodnotu True, budou soubory pouze pro čtení odstraněny. Výchozí hodnota je False.
Smazat složku
Tato metoda odstraní zadanou složku a její obsah.
Syntaxe je:
Smazat složku folderspec, [ platnost ]
1234 | Dílčí složky Odstranit ()Dim MyFSO jako nový 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.
Parametr Force je volitelný a je nastaven na True nebo False. Pokud je nastaveno na True, budou odstraněny pouze složky 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í. Než dojde k chybě, není možné vrátit zpět žádné akce, které byly úspěšné.
Programování VBA | Generátor kódu pracuje pro vás!
Další metody v FSO
OpenAsTextStream.
Tato metoda otevře zadaný soubor jako objekt Textového proudu a umožní jeho čtení nebo zápis. Výhodou této metody je, že dokáže otevřít jakýkoli typ souboru a extrahovat dostupný text.
Syntaxe je:
OpenAsTextStream ([ iomode, [ formát ]])
Parametr „iomode“ umožňuje pouze čtení (1), čtení/zápis (2) a připojování (8). Parametr čtení/zápis přepíše soubor.
Parametr „formát“ je nastaven na -2 pro výchozí nastavení systému, -1 pro otevření souboru jako Unicode a 0 pro otevření souboru jako ASCII (americký standardní kód pro výměnu informací).
1234567891011 | Sub TextStream ()Dim MyFSO jako nový FileSystemObjectNastavit f = MyFSO.GetFile ("C: \ temp \ myfile.txt")Nastavit ts = f.OpenAsTextStream (2)ts.Napište „Můj nový text“TS. ZavřítNastavit ts = f.OpenAsTextStream (1)s = ts.ReadLineMsgBox sTS. ZavřítEnd 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 se poté zavře a znovu otevře jako čtení (1) a načte se z něj řádek, který se poté zobrazí jako okno se zprávou.
Pamatujte, že přečtený řádek musí být umístěn v proměnné, než může být zobrazen v okně zprávy.
BuildPath
Tato metoda připojí název složky nebo souboru na konec cesty ke stávající složce. Tím se vytvoří pouze textový řetězec a ve skutečnosti se nevytvoří nová složka.
Syntaxe je:
BuildPath (cesta, název)
12345 | Dílčí buildPth ()Dim MyFSO jako nový FileSystemObjectnp = MyFSO.BuildPath ("C: \ temp", "ANewFolder")MsgBox npEnd Sub |
Zobrazí se „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írání a čtení souborů nebo zápis do nich podle nastavených parametrů. Funguje to podobným způsobem jako metoda OpenAsTextStream.
Syntaxe je:
OpenTextFile (název souboru, [ iomode, [ vytvořit, [ formát ]]])
Parametr „iomode“ umožňuje ForReading, ForWriting a ForAppending. Parametr ForWriting přepíše soubor.
Parametr ‘create’ je logická hodnota. True znamená, že pokud zadaný název souboru neexistuje, bude vytvořen nový soubor. False znamená, že pokud nebude nalezen název souboru, nebude vytvořen žádný soubor. Výchozí hodnota je False.
Parametr „formát“ lze nastavit na TristateFalse, TristateMixed, TristateTrue a TristateUseDefault podle toho, zda je soubor ASCII nebo Unicode.
1234567 | Sub OpenTxtFile ()Dim MyFSO jako nový FileSystemObjectNastavit ts = MyFSO.OpenTextFile ("C: \ temp \ myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sTS. ZavřítEnd Sub |
Tento kód načte řádek z textového souboru „myfile.txt“.
Výhodou metody OpenTextFile oproti OpenAsTextStreamMethod je, že má rozbalovací nabídky pro parametry, které jsou smysluplnější než snaha zapamatovat si příslušné číselné hodnoty pro různé možnosti parametrů.
Programování VBA | Generátor kódu pracuje pro vás!
Vlastnosti FSO
Pohony
Tato vlastnost obsahuje kolekci dostupných disků ve vašem počítači.
1234567 | Sub Drv ()Dim MyFSO jako nový FileSystemObject, d jako DriveNastavit Dr = MyFSO.DrivesZa každého d In Dr.MsgBox d.DriveLetterDalší dEnd Sub |
Tento kód vrátí každé písmeno jednotky dostupné ve vašem počítači.
název
Tím se vrátí název zadaného souboru nebo složky.
123456789 | Sub NameExample ()Dim MyFSO jako nový FileSystemObjectNastavit f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Název & "na Disku" & UCase (f.Drive) & vbCrLfi = i & "Vytvořeno:" & f.DateCreated & vbCrLfi = i & "Poslední přístup:" & f.DateLastAccessed & vbCrLfi = i & "Poslední změna:" & f.DateLastModifiedMsgBox iEnd Sub |
Tento kód poskytne název souboru a informace o něm pomocí vlastnosti Drive.
Cesta
Vlastnost Cesta oddělí cestu od specifikace souboru.
123456789 | Dílčí cesta Příklad ()Dim MyFSO jako nový FileSystemObjectNastavit f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Path & f.Name & "on Drive" & UCase (f.Drive) & vbCrLfi = i & "Vytvořeno:" & f.DateCreated & vbCrLfi = i & "Poslední přístup:" & f.DateLastAccessed & vbCrLfi = i & "Poslední změna:" & f.DateLastModifiedMsgBox iEnd Sub |
Tento příklad funguje stejným způsobem jako příklad Název, kromě toho, že nyní poskytuje cestu k souboru.
Programování VBA | Generátor kódu pracuje pro vás!
Velikost
Vlastnost Size udává velikost složky nebo souboru.
12345 | Sub FSize ()Dim MyFSO jako nový FileSystemObjectNastavit f = MyFSO.GetFolder ("C: \ temp \")MsgBox f. VelikostEnd Sub |
Tento kód výše vrátí velikost složky „C: \ temp \“.
12345 | Sub FSize ()Dim MyFSO jako nový FileSystemObjectNastavit f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f. VelikostEnd Sub |
Tento kód výše vrátí velikost souboru „myfile.txt“.
Typ
Vlastnost type vrátí text pro typ souboru nebo složky.
12345 | Sub FType ()Dim MyFSO jako nový FileSystemObjectNastavit f = MyFSO.GetFolder ("C: \ temp \")MsgBox f. TypEnd Sub |
Tento kód výše vrátí text „Složka souboru“.
12345 | Podtyp F ()Dim MyFSO jako nový FileSystemObjectNastavit f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f. TypEnd Sub |
Tento kód výše vrátí text „Textový dokument“.
Všimněte si použití ‘GetFolder’ a ‘GetFile’ v každém příkladu.