Použití VBA FileSystemObject (FSO) v Excelu – snadný přehled a příklady

Při používání VBA v Excelu většinou automatizujeme naše úlohy.

To také znamená, že většinu času pracujeme s buňkami a rozsahy, listy, sešity a dalšími objekty, které jsou součástí aplikace Excel.

VBA je však mnohem mocnější a lze jej použít i pro práci s věcmi mimo Excel.

V tomto kurzu vám ukážu, jak používat VBA FileSystemObject (FSO) pro práci se soubory a složkami na systémových nebo síťových discích.

Tento kurz zahrnuje:

Co je VBA FileSystemObject (FSO)?

FileSystemObject (FSO) umožňuje přístup k souborovému systému počítače. Pomocí něj můžete přistupovat k souborům/složkám/adresářům v systému počítače a upravovat je.

Níže jsou například uvedeny některé z činností, které můžete provádět pomocí FileSystemObject v Excelu VBA:

  • Zkontrolovat, zda soubor nebo složka existuje.
  • Vytvářet nebo přejmenovávat složky/soubory.
  • Získat seznam všech názvů souborů (nebo názvů podsložek) ve složce.
  • Kopírování souborů z jedné složky do druhé.

Doufám, že jste pochopili, o co jde.

Všem těmto výše uvedeným příkladům (a dalším) se budu věnovat později v tomto kurzu.

Některé z výše uvedených věcí lze sice provést také pomocí tradičních funkcí a metod VBA (například funkce DIR), ale to by vedlo k delším a složitějším kódům. FileSystemObject usnadňuje práci se soubory a složkami, přičemž kód zůstává čistý a krátký.

Note: FSO can only be used in Excel 2000 and later versions.

K jakým všem objektům můžete přistupovat prostřednictvím FileSystemObject?

Jak jsem se zmínil výše, pomocí objektu FileSystemObject můžete ve VBA přistupovat k souborům a složkám a upravovat je.

Níže je uvedena tabulka, která ukazuje nejdůležitější objekty, ke kterým můžete přistupovat a upravovat je pomocí FSO:

Objekt Popis
Disk Objekt disku umožňuje získat informace o disku, například zda existuje nebo ne, název cesty, typ disku (vyměnitelný nebo pevný), jeho velikost atd.
Objekt Složka Objekt Složka umožňuje vytvářet nebo upravovat složky v systému. Pomocí tohoto objektu můžete například vytvářet, mazat, přejmenovávat, kopírovat složky.
File Objekt File umožňuje pracovat se soubory v systému. Pomocí tohoto objektu můžete například vytvářet, otevírat, kopírovat, přesouvat a mazat soubory.
TextStream Objekt TextStream umožňuje vytvářet nebo číst textové soubory.

Každý z výše uvedených objektů má metody, které můžete použít pro práci s nimi.

Pro příklad, pokud chcete smazat složku, použijete metodu DeleteFolder objektu Folder. Podobně, pokud chcete zkopírovat soubor, použijete metodu CopyFile objektu File.

Nebojte se, pokud se vám to zdá zdlouhavé nebo těžko pochopitelné. Mnohem lépe to pochopíte, když si projdete příklady, které jsem popsal v tomto tutoriálu.

Jen pro informaci jsem na konci tohoto tutoriálu popsal všechny metody objektu FileSystemObject (pro každý objekt).

Povolení FileSystemObject v Excel VBA

FileSystemObject není ve výchozím nastavení Excel VBA k dispozici.

Protože se zabýváme soubory a složkami, které jsou mimo aplikaci Excel, musíme nejprve vytvořit odkaz na knihovnu, která tyto objekty (disky, soubory, složky) obsahuje.

Nyní existují dva způsoby, jak začít používat FileSystemObject v Excelu VBA:

  1. Nastavení odkazu na knihovnu Microsoft Scripting Runtime Library (Scrrun.dll)
  2. Vytvoření objektu odkazujícího na knihovnu ze samotného kódu

Ačkoli oba tyto způsoby fungují (a příště vám ukážu, jak to udělat), doporučuji použít první způsob.

Poznámka: Když povolíte FileSystemObject, můžete přistupovat ke všem objektům v něm. To zahrnuje objekty FileSystemObject, Drive, Files, Folders atd. V tomto návodu se zaměřím hlavně na objekt FileSystemObject.

Nastavení odkazu na knihovnu Microsoft Scripting Runtime Library

Když vytvoříte odkaz na knihovnu Scripting Runtime Library, umožníte Excelu VBA přístup ke všem vlastnostem a metodám souborů a složek. Jakmile tak učiníte, můžete se na objekt souborů/složek/jednotek odkazovat z prostředí Excel VBA (stejně jako se můžete odkazovat na buňky, listy nebo sešity).

Níže uvádíme postup vytvoření odkazu na knihovnu Microsoft Scripting Runtime Library:

  1. V Editoru VB klikněte na Nástroje.
  2. Klikněte na Reference.
  3. V otevřeném dialogovém okně Reference projděte dostupné reference a zaškrtněte možnost „Microsoft Scripting Runtime“.
  4. Klikněte na OK.

Výše uvedené kroky by vám nyní umožnily odkazovat na objekty FSO z Excelu VBA.

Vytvoření instance objektu FileSystemObject v kódu

Po nastavení odkazu na knihovnu Scripting FileSystemObject je třeba vytvořit instanci objektu FSO v kódu.

Po jejím vytvoření ji můžete používat ve VBA.

Níže je uveden kód, který nastaví proměnnou MyFSO jako objekt FileSystemObject:

Sub CreatingFSO()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectEnd Sub

V tomto kódu jsem nejprve deklaroval proměnnou MyFSO jako objekt typu FileSystemObject. To je možné jen proto, že jsem vytvořil odkaz na knihovnu Microsoft Scripting Runtime Library. Pokud by odkaz nebyl vytvořen, došlo by k chybě (protože Excel by nerozpoznal, co znamená FileSystemObject).

V druhém řádku se stanou dvě věci:

  1. Klíčové slovo NEW vytvoří instanci objektu FileSystemObject. To znamená, že nyní mohu používat všechny metody objektu FileSystemObject pro práci se soubory a složkami. Pokud tuto instanci nevytvoříte, nebudete mít přístup k metodám FSO.
  2. Klíčové slovo SET nastaví objekt MyFSO na tuto novou instanci FileSystemObject. To mi umožní používat tento objekt pro přístup k souborům a složkám. Pokud například potřebuji vytvořit složku, mohu použít metodu MyFSO.CreateFolder.

Pokud chcete, můžete také spojit výše uvedené dva příkazy do jednoho, jak je znázorněno níže:

Sub CreatingFSO()Dim MyFSO As New FileSystemObjectEnd Sub

Velkou výhodou použití této metody (která spočívá v nastavení reference na knihovnu Microsoft Scripting Runtime Library) je to, že při použití objektů FSO v kódu budete moci využít funkci IntelliSense, která zobrazuje metody a vlastnosti spojené s objektem (jak je znázorněno níže).

To není možné, když vytvoříte odkaz z kódu (o tom bude řeč dále).

Vytvoření objektu z kódu

Jiný způsob, jak vytvořit odkaz na FSO, je provést to z kódu. Při tomto způsobu nemusíte vytvářet žádný odkaz (jako v předchozím způsobu).

Při psaní kódu můžete vytvořit objekt z kódu a odkazovat na objekt Scripting.FileSystemObject.

Následující kód vytvoří objekt FSO a pak z něj udělá typ FileSystemObject.

Sub FSODemo()Dim FSO As ObjectSet FSO = CreateObject("Scripting.FileSystemObject")End Sub

Ačkoli se to může zdát pohodlnější, velkou nevýhodou použití této metody je, že by se při práci s objekty ve FSO nezobrazoval IntelliSense. Pro mě je to velké mínus a vždy doporučuji použít předchozí způsob zapnutí FSO (což je nastavení odkazu na „Microsoft Scripting Runtime“)

Příklady VBA FileSystemObject

Nyní se ponoříme a podíváme se na několik praktických příkladů použití FileSystemObject v Excelu.

Příklad 1: Kontrola existence souboru nebo složky

Následující kód zkontroluje, zda složka s názvem ‚Test‘ existuje nebo ne (v zadaném umístění).

Pokud složka existuje, podmínka IF je True a v okně se zobrazí zpráva – ‚Složka existuje‘. A pokud neexistuje, zobrazí se zpráva – Složka neexistuje‘.

Sub CheckFolderExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Exists"Else MsgBox "The Folder Does Not Exist"End IfEnd Sub

Podobně můžete také zkontrolovat, zda soubor existuje, nebo ne.

Níže uvedený kód kontroluje, zda v zadané složce existuje soubor s názvem Test.xlsx, nebo ne.

Sub CheckFileExist()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FileExists("C:\Users\sumit\Desktop\Test\Test.xlsx") Then MsgBox "The File Exists"Else MsgBox "The File Does Not Exist"End IfEnd Sub

Příklad 2: Vytvoření nové složky v zadaném umístění

Níže uvedený kód by vytvořil složku s názvem „Test“ v jednotce C mého systému (budete muset zadat cestu ve vašem systému, kde chcete složku vytvořit).

Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectMyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End Sub

Tento kód sice funguje dobře, ale v případě, že by složka již existovala, zobrazil by chybu.

Níže uvedený kód kontroluje, zda složka již existuje, a pokud ne, vytvoří složku. V případě, že složka již existuje, zobrazí hlášení. Pro kontrolu, zda složka existuje, jsem použil metodu FolderExists FSO.

Sub CreateFolder()Dim MyFSO As FileSystemObjectSet MyFSO = New FileSystemObjectIf MyFSO.FolderExists("C:\Users\sumit\Desktop\Test") Then MsgBox "The Folder Already Exist"Else MyFSO.CreateFolder ("C:\Users\sumit\Desktop\Test")End IfEnd Sub

Příklad 3: Získání seznamu všech souborů ve složce

Níže uvedený kód by zobrazil názvy všech souborů v zadané složce.

Sub GetFileNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MyFile In MyFolder.Files Debug.Print MyFile.NameNext MyFileEnd Sub

Tento kód je o něco složitější než ty, které jsme již viděli.

Jak jsem se již zmínil výše v tomto návodu, při odkazování na ‚Microsoft Scripting Runtime Library‘ můžete používat objekt FileSystemObject, stejně jako všechny ostatní objekty (například Files a Folders).

V uvedeném kódu používám tři objekty – FileSystemObject, File a Folder. To mi umožňuje procházet jednotlivé soubory v zadané složce. Pomocí vlastnosti name pak získám seznam názvů všech souborů.

Všimněte si, že pro získání názvů všech souborů používám Debug.Print. Tyto názvy budou uvedeny v okamžitém okně v editoru VB.

Příklad 4: Získání seznamu všech podsložek ve složce

Následující kód poskytne názvy všech podsložek v zadané složce. Logika je naprosto stejná, jako je popsána ve výše uvedeném příkladu. Místo souborů jsme v tomto kódu použili podsložky.

Sub GetSubFolderNames()Dim MyFSO As FileSystemObjectDim MyFile As FileDim MyFolder As FolderDim MySubFolder As FolderSet MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder("C:\Users\sumit\Desktop\Test")For Each MySubFolder In MyFolder.SubFolders Debug.Print MySubFolder.NameNext MySubFolderEnd Sub

Příklad 5: Kopírování souboru z jednoho místa na jiné

Níže uvedený kód zkopíruje soubor ze složky ‚Source‘ a zkopíruje jej do složky ‚Destination‘.

Sub CopyFile()Dim MyFSO As FileSystemObjectDim SourceFile As StringDim DestinationFolder As StringSet MyFSO = New Scripting.FileSystemObjectSourceFile = "C:\Users\sumit\Desktop\Source\SampleFile.xlsx"DestinationFolder = "C:\Users\sumit\Desktop\Destination"MyFSO.CopyFile Source:=SourceFile, Destination:=DestinationFolder & "\SampleFileCopy.xlsx"End Sub

V uvedeném kódu jsem použil dvě proměnné – SourceFile a DestinationFolder.

Proměnná Source File obsahuje adresu souboru, který chci zkopírovat, a proměnná DestinationFolder obsahuje adresu složky, do které chci soubor zkopírovat.

Všimněte si, že při kopírování souboru nestačí uvést název cílové složky. Je třeba zadat také název souboru. Můžete použít stejný název souboru nebo jej také můžete změnit. Ve výše uvedeném příkladu jsem zkopíroval soubor a pojmenoval ho SampleFileCopy.xlsx

Příklad 6: Zkopírování všech souborů z jedné složky do druhé

Níže uvedený kód zkopíruje všechny soubory ze zdrojové složky do cílové složky.

Sub CopyAllFiles()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=FalseNext MyFileEnd Sub

Výše uvedený kód zkopíruje všechny soubory ze zdrojové složky do cílové složky.

Všimněte si, že v metodě MyFSO.CopyFile jsem zadal vlastnost ‚Overwritefiles‘ jako False (ve výchozím nastavení je to True). Tím zajistíte, že v případě, že již soubor ve složce máte, nebude zkopírován (a zobrazí se chyba). Pokud odstraníte vlastnost ‚Overwritefiles‘ nebo ji nastavíte na hodnotu True, v případě, že se v cílové složce nacházejí soubory se stejným názvem, dojde k jejich přepsání.

Profesionální tip: Při kopírování souborů vždy existuje možnost jejich přepsání. Dobrým nápadem je v tomto případě přidat spolu s názvem i časové razítko. Tím zajistíte, že se názvy budou vždy lišit, a můžete snadno sledovat, které soubory byly zkopírovány v jakém čase.

Pokud chcete kopírovat pouze soubory určité přípony, můžete to provést pomocí příkazu IF Then, kterým zkontrolujete, zda je přípona xlsx, nebo ne.

Sub CopyExcelFilesOnly()Dim MyFSO As FileSystemObjectDim MyFile As FileDim SourceFolder As StringDim DestinationFolder As StringDim MyFolder As FolderDim MySubFolder As FolderSourceFolder = "C:\Users\sumit\Desktop\Source"DestinationFolder = "C:\Users\sumit\Desktop\Destination"Set MyFSO = New Scripting.FileSystemObjectSet MyFolder = MyFSO.GetFolder(SourceFolder)For Each MyFile In MyFolder.Files If MyFSO.GetExtensionName(MyFile) = "xlsx" Then MyFSO.CopyFile Source:=MyFSO.GetFile(MyFile), _ Destination:=DestinationFolder & "\" & MyFile.Name, Overwritefiles:=False End IfNext MyFileEnd Sub

Metody objektu souborového systému (FSO)

Tady jsou metody, které můžete použít pro jednotlivé objekty. Toto je pouze pro referenční účely a příliš se tím nezabývá. Použití některých z nich bylo ukázáno v příkladech popsaných výše.

.

.

.

.

MetodyFSO Pro objekt Popis
DriveExists Drive Zjišťuje, zda jednotka existuje, nebo ne
GetDrive Drive Vrátí instanci objektu jednotky na základě zadané cesty
GetDriveName Drive Zjistí název jednotky
BuildPath File/Folder Vytvoří cestu z existující cesty a názvu
CopyFile File/Folder Kopíruje soubor
GetAbsolutePathName File/Folder Vrátí kanonickou reprezentaci cesty
GetBaseName File/Folder Vrátí základní název z cesty. Například „D:\TestFolder\TestFile.xlsm“ vrátí TextFile.xlsm
GetTempName File/Folder Vygeneruje název, který lze použít k pojmenování dočasného souboru
CopyFolder Folder Zkopíruje složku z jednoho umístění do druhého. jiného
CreateFolder Folder Vytvoří novou složku
DeleteFolder Folder Smaže zadanou složku
FolderExists Folder Zkontroluje, zda složka existuje či nikoliv
GetFolder Folder Vrátí instanci objektu složky na základě zadané cesty
GetParentFolderName Folder Vyhledá název nadřazené složky na základě zadané cesty
GetSpecialFolder Folder Zjistí umístění různých systémových složek.
MoveFolder Složka Přesune složku z jednoho umístění do druhého
DeleteFile Soubor Smaže soubor
FileExists File Zkontroluje, zda soubor existuje nebo ne
GetExtensionName File Vrátí příponu souboru
GetFile File Vrátí instanci souboru. objektu na základě zadané cesty
GetFileName File Vrátí název souboru
GetFileVersion File Vrátí verzi souboru
MoveFile File Přesune soubor
CreateTextFile File Vytvoří textový soubor
GetStandardStream File Získá standardní vstup, výstupní nebo chybový proud
OpenTextFile File Otevřít soubor jako TextStream

Mohou se vám líbit také následující výukové programy Excel:

  • Získat seznam názvů souborů ze složek & Podsložky (pomocí Power Query).
  • Získání seznamu názvů souborů ze složky v aplikaci Excel (s využitím VBA i bez něj).
  • Pochopení datových typů aplikace Excel VBA (proměnné a konstanty).
  • Vytvoření uživatelsky definované funkce (UDF) v aplikaci Excel VBA.

Pochopení datových typů aplikace Excel VBA (proměnné a konstanty).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.