Použití VBA FileSystemObject (FSO) v aplikaci Excel - snadný přehled a příklady

Když používáme VBA v Excelu, většinou jde o automatizaci našich úkolů.

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

Ale VBA je mnohem výkonnější a může být také použit pro práci s věcmi mimo Excel.

V tomto tutoriálu vám ukážu, jak pomocí VBA FileSystemObject (FSO) pracovat se soubory a složkami na vašem systému nebo síťových discích.

Co je VBA FileSystemObject (FSO)?

FileSystemObject (FSO) vám umožňuje přístup k systému souborů vašeho počítače. Pomocí něj můžete přistupovat a upravovat soubory/složky/adresáře ve vašem počítačovém systému.

Níže jsou například některé z věcí, které můžete dělat pomocí FileSystemObject v aplikaci Excel VBA:

  • Zkontrolujte, zda soubor nebo složka existuje.
  • Vytvořte nebo přejmenujte složky/soubory.
  • Získejte seznam všech názvů souborů (nebo názvů podsložek) ve složce.
  • Zkopírujte soubory z jedné složky do druhé.

Doufám, že rozumíte.

Všechny tyto výše uvedené příklady (a další) pokryju později v tomto tutoriálu.

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

Poznámka: FSO lze použít pouze v aplikaci Excel 2000 a novějších verzích.

K jakým všem objektům máte přístup prostřednictvím FileSystemObject?

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

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

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

Každý z výše uvedených objektů má metody, se kterými můžete pracovat.

Chcete -li uvést příklad, pokud chcete odstranit složku, použijete metodu DeleteFolder objektu Folder. Podobně pokud chcete zkopírovat soubor, použijete metodu CopyFile objektu File.

Nedělejte si starosti, pokud se vám to zdá zdrcující nebo těžko pochopitelné. Mnohem lepší porozumění získáte, když si projdete příklady, které jsem v tomto tutoriálu probral.

Jen pro referenční účely jsem na konci tohoto kurzu pokryl všechny metody FileSystemObject (pro každý objekt).

Povolení FileSystemObject v aplikaci Excel VBA

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

Protože máme co do činění se soubory a složkami, které jsou mimo aplikaci Excel, musíme nejprve vytvořit odkaz na knihovnu, která obsahuje tyto objekty (jednotky, soubory, složky).

Nyní existují dva způsoby, jak můžete začít používat FileSystemObject v aplikaci Excel 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

Zatímco obě tyto metody fungují (a já vám ukážu, jak to udělat dále), doporučuji použít první metodu.

Poznámka: Když povolíte FileSystemObject, budete mít přístup ke všem objektům v něm. To zahrnuje FileSystemObject, Drive, Files, Folders atd. V tomto tutoriálu se budu zaměřovat hlavně na FileSystemObject.

Nastavení odkazu na runtime knihovnu Microsoft Scripting

Když vytvoříte odkaz na runtime knihovnu Scripting, umožníte aplikaci Excel VBA přístup ke všem vlastnostem a metodám souborů a složek. Jakmile to bude hotové, můžete odkazovat na objekt soubory/složky/jednotky z aplikace Excel VBA (stejně jako můžete odkazovat na buňky, pracovní listy nebo sešity).

Níže jsou uvedeny kroky k vytvoření odkazu na knihovnu Microsoft Scripting Runtime:

  1. V editoru VB klikněte na Nástroje.
  2. Klikněte na Reference.
  3. V dialogovém okně Reference, které se otevře, procházejte 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 aplikace Excel VBA.

Vytvoření instance FileSystemObject v kódu

Jakmile nastavíte odkaz na knihovnu Scripting FileSystemObject, musíte ve svém kódu vytvořit instanci objektu FSO.

Jakmile je toto vytvořeno, můžete jej použít ve VBA.

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

Sub CreatingFSO () Dim MyFSO as FileSystemObject Set MyFSO = New FileSystemObject End Sub

V tomto kódu jsem nejprve deklaroval proměnnou MyFSO jako objekt typu FileSystemObject. To je možné pouze proto, že jsem vytvořil odkaz na knihovnu Microsoft Scripting Runtime. Pokud odkaz není vytvořen, způsobí to chybu (protože aplikace Excel nerozpozná, co znamená FileSystemObject).

V druhém řádku se dějí dvě věci:

  1. Klíčové slovo NEW vytvoří instanci FileSystemObject. To znamená, že nyní mohu použít všechny metody 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 nastavuje objekt MyFSO na tuto novou instanci FileSystemObject. To mi umožňuje používat tento objekt k přístupu 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é výše uvedené dva příkazy zkombinovat do jednoho, jak je uvedeno níže:

Sub CreatingFSO () Dim MyFSO as New FileSystemObject End Sub

Velkou výhodou použití této metody (kterou je nastavení odkazu na knihovnu Microsoft Scripting Runtime Library) je, že když v kódu použijete objekty FSO, budete moci používat funkci IntelliSense, která ukazuje metody a vlastnosti spojené s předmět (jak je uvedeno níže).

To není možné, když vytvoříte odkaz z kódu (popsaného dále).

Vytvoření objektu z kódu

Další způsob, jak vytvořit odkaz na FSO, je provést to z kódu. V této metodě nemusíte vytvářet žádné reference (jako v předchozí metodě).

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

Níže uvedený kód vytvoří objekt FSO a poté z něj udělá typ FileSystemObject.

Sub FSODemo () Dim FSO as Object Set FSO = CreateObject ("Scripting.FileSystemObject") End Sub

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

Příklady VBA FileSystemObject

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

Příklad 1: Zkontrolujte, zda existuje soubor nebo složka

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 zprávou se zobrazí zpráva „Složka existuje“. A pokud neexistuje, zobrazí se zpráva - Složka neexistuje “.

Sub CheckFolderExist () Dim MyFSO as FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Then MsgBox "The Folks Exists" Else MsgBox "Složka neexistuje" Konec Pokud konec Sub

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

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

Sub CheckFileExist () Dim MyFSO as FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FileExists ("C: \ Users \ sumit \ Desktop \ Test \ Test.xlsx") Then MsgBox "The File Exists" Else MsgBox "Soubor neexistuje "End If End Sub

Příklad 2: Vytvořte novou složku ve specifikovaném umístění

Níže uvedený kód by vytvořil složku s názvem „Test“ na disku 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 FileSystemObject Set MyFSO = New FileSystemObject MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test") End Sub

I když tento kód funguje dobře, v případě, že složka již existuje, zobrazí se chyba.

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í se zpráva. Abych zkontroloval, zda složka existuje, použil jsem Metoda FolderExists FSO.

Sub CreateFolder () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Then MsgBox "The Folder already Exist" Else MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test ") End If End Sub

Příklad 3: Získejte seznam všech souborů ve složce

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

Sub GetFileNames () Dim MyFSO as FileSystemObject Dim MyFile As File Dim MyFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") For each MyFile In MyFolder.Files Debug.Print MyFile.Name Další MyFile End Sub

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

Jak jsem již zmínil výše v tomto tutoriálu, když odkazujete na „knihovnu Microsoft Scripting Runtime Library“, můžete použít FileSystemObject i všechny ostatní objekty (například Soubory a Složky).

Ve výše uvedeném kódu používám tři objekty - FileSystemObject, File a Folder. To mi umožňuje procházet každý soubor v zadané složce. Poté pomocí vlastnosti name získám seznam všech názvů souborů.

Všimněte si, že používám Debug.Print k získání názvů všech souborů. Tato jména budou uvedena v bezprostředním okně v editoru VB.

Příklad 4: Získejte seznam všech podsložek ve složce

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

Sub GetSubFolderNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Dim MySubFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") For V MyFolder.SubFolders Debug.Print MySubFolder.Name Další MySubFolder End Sub

Příklad 5: Zkopírujte soubor z jednoho místa na druhé

Níže uvedený kód zkopíruje soubor ze složky „Zdroj“ a zkopíruje jej do složky „Cíl“.

Sub CopyFile () Dim MyFSO as FileSystemObject Dim SourceFile as String Dim DestinationFolder As String Set MyFSO = New Scripting.FileSystemObject SourceFile = "C: \ Users \ sumit \ Desktop \ Source \ SampleFile.xlsx" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "MyFSO.CopyFile Zdroj: = SourceFile, Destination: = DestinationFolder &" \ SampleFileCopy.xlsx "End Sub

Ve výše uvedeném kódu jsem použil dvě proměnné - SourceFile a DestinationFolder.

Zdrojový soubor obsahuje adresu souboru, který chci kopírovat, a proměnná DestinationFolder uchovává adresu složky, do které chci soubor zkopírovat.

Při kopírování souboru nestačí zadat název cílové složky. Musíte také zadat 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 jej SampleFileCopy.xlsx

Příklad 6: Kopí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 FileSystemObject Dim MyFile As File Dim SourceFolder as String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) For each MyFile In MyFolder.Files MyFSO.CopyFile Source: = MyFSO.GetFile (MyFile), _ Destination: \ DestinationFolder &" "& MyFile.Name, Overwritefiles: = False Next MyFile End 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 je zajištěno, že v případě, že již soubor ve složce máte, nebude zkopírován (a uvidíte chybu). Pokud odeberete „Přepsat soubory“ nebo nastavíte na hodnotu True, v případě, že v cílové složce budou soubory se stejným názvem, budou tyto přepsány.

Profesionální tip: Při kopírování souborů existuje vždy šance na přepsání souborů. V tomto případě je dobré přidat časové razítko spolu se jménem. Tím zajistíte, že názvy budou vždy jiné a budete moci snadno sledovat, které soubory byly v jaké době zkopírovány.

Pokud chcete kopírovat pouze soubory s určitou příponou, můžete to provést pomocí příkazu IF Then a zkontrolovat, zda je přípona xlsx nebo ne.

Sub CopyExcelFilesOnly () Dim MyFSO As FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder (SourceFolder) For each MyFile In MyFolder.Files If MyFSO.GetExtensionName (MyFile) =" xlsx "Then MyFSO.CopyFile Source: = MyFS (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = False End If Next MyFile End Sub

Metody FileSystemObject (FSO)

Zde jsou metody, které můžete použít pro každý objekt. Toto je pouze pro referenční účely a příliš se tím nezabýváme. Použití některých z nich bylo ukázáno ve výše uvedených příkladech.

Metody FSO Pro objekt Popis
DriveExists Řídit Zkontroluje, zda jednotka existuje nebo ne
GetDrive Řídit Vrátí instanci objektu jednotky na základě zadané cesty
GetDriveName Řídit Znovu spustí název jednotky
BuildPath Složka Vygenerujte cestu z existující cesty a názvu
Zkopírovat soubor Složka Zkopíruje soubor
GetAbsolutePathName Složka Vrátí kanonickou reprezentaci cesty
GetBaseName Složka Vraťte základní název z cesty. Například „D: \ TestFolder \ TestFile.xlsm“ vrátí TextFile.xlsm
GetTempName Složka Vygenerujte název, který lze použít k pojmenování dočasného souboru
CopyFolder Složka Zkopíruje složku z jednoho umístění do druhého
Vytvořit složku Složka Vytvoří novou složku
DeleteFolder Složka Odstraní zadanou složku
FolderExists Složka Zkontroluje, zda složka existuje nebo ne
GetFolder Složka Vrátí instanci objektu složky na základě zadané cesty
GetParentFolderName Složka Znovu spustí název nadřazené složky na základě zadané cesty
GetSpecialFolder Složka Získejte 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
Smazat soubor Soubor Odstraní soubor
Soubor existuje Soubor Zkontroluje, zda soubor existuje nebo ne
GetExtensionName Soubor Vrátí příponu souboru
GetFile Soubor Vrátí instanci objektu souboru na základě zadané cesty
GetFileName Soubor Vrátí název souboru
GetFileVersion Soubor Vrátí verzi souboru
MoveFile Soubor Přesune soubor
CreateTextFile Soubor Vytvoří textový soubor
GetStandardStream Soubor Načíst standardní vstupní, výstupní nebo chybový proud
OpenTextFile Soubor Otevřete soubor jako TextStream
wave wave wave wave wave