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:
- Nastavení odkazu na knihovnu Microsoft Scripting Runtime Library (Scrrun.dll)
- 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:
- V editoru VB klikněte na Nástroje.
- Klikněte na Reference.
- V dialogovém okně Reference, které se otevře, procházejte dostupné reference a zaškrtněte možnost „Microsoft Scripting Runtime“.
- 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:
- 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.
- 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 |