Використання VBA FileSystemObject (FSO) у Excel - простий огляд та приклади

Коли ми використовуємо VBA в Excel, більшість з них - це автоматизація наших завдань.

Це також означає, що більшість часу ми працюємо з клітинками та діапазонами, аркушами, книгами та іншими об’єктами, які є частиною програми Excel.

Але VBA набагато потужніший і його також можна використовувати для роботи з матеріалами за межами Excel.

У цьому підручнику я покажу вам, як використовувати VBA FileSystemObject (FSO) для роботи з файлами та папками на вашій системі або мережевих дисках.

Що таке VBA FileSystemObject (FSO)?

FileSystemObject (FSO) дозволяє отримати доступ до файлової системи вашого комп’ютера. За допомогою нього ви можете отримати доступ та змінити файли/папки/каталоги у вашій комп’ютерній системі.

Наприклад, нижче наведено деякі з дій, які можна зробити за допомогою FileSystemObject у Excel VBA:

  • Перевірте, чи існує файл або папка.
  • Створення або перейменування папок/файлів.
  • Отримайте список усіх назв файлів (або назв підпапок) у папці.
  • Скопіюйте файли з однієї папки в іншу.

Сподіваюся, ви зрозуміли ідею.

Нижче в цьому підручнику я розгляну всі ці вищенаведені приклади (плюс інші).

Хоча деякі з речей, згаданих вище, також можна зробити за допомогою традиційних функцій VBA (наприклад, функції DIR) та методів, це призведе до більш довгих і складних кодів. FileSystemObject полегшує роботу з файлами та папками, зберігаючи код чистим та коротким.

Примітка: FSO можна використовувати лише в Excel 2000 та пізніших версіях.

До яких усіх об’єктів можна отримати доступ через FileSystemObject?

Як я вже згадував вище, ви можете отримати доступ та змінити файли та папки за допомогою FileSystemObject у VBA.

Нижче наведено таблицю, яка показує найважливіші об’єкти, до яких можна отримати доступ та змінити їх за допомогою FSO:

Об'єкт Опис
Диск Drive Object дозволяє отримувати інформацію про диск, наприклад, чи він існує чи ні, його шлях, тип диска (знімний або фіксований), його розмір тощо.
Папка Об'єкт папки дозволяє створювати або змінювати папки у вашій системі. Наприклад, за допомогою цього об’єкта можна створювати, видаляти, перейменовувати, копіювати папки.
Файл File Object дозволяє працювати з файлами у вашій системі. Наприклад, за допомогою цього об’єкта можна створювати, відкривати, копіювати, переміщувати та видаляти файли.
TextStream Об'єкт TextStream дозволяє створювати або читати текстові файли.

Кожен із вищезгаданих об’єктів має методи, які можна використовувати для роботи з ними.

Щоб навести вам приклад, якщо ви хочете видалити папку, ви будете використовувати метод DeleteFolder об’єкта Folder. Аналогічно, якщо ви хочете скопіювати файл, ви будете використовувати метод CopyFile об'єкта File.

Не переживайте, якщо це здається переважним або важко зрозумілим. Ви отримаєте набагато краще розуміння, коли переглянете приклади, які я розглянув у цьому підручнику.

Просто для довідки, я розглянув усі методи FileSystemObject (для кожного об’єкта) в кінці цього підручника.

Увімкнення FileSystemObject у Excel VBA

FileSystemObject недоступний за замовчуванням у VBA Excel.

Оскільки ми маємо справу з файлами та папками, що знаходяться поза програмою Excel, нам потрібно спочатку створити посилання на бібліотеку, яка містить ці об’єкти (диски, файли, папки).

Тепер є два способи почати використовувати FileSystemObject у Excel VBA:

  1. Встановлення посилання на бібліотеку виконання сценаріїв Microsoft (Scrrun.dll)
  2. Створення об'єкта для посилання на бібліотеку з самого коду

Хоча обидва ці методи працюють (і я покажу вам, як це зробити далі), я рекомендую використовувати перший метод.

Примітка: Коли ви вмикаєте FileSystemObject, ви можете отримати доступ до всіх об’єктів у ньому. Це включає FileSystemObject, Диск, Файли, Папки тощо. У цьому підручнику я зосереджусь переважно на FileSystemObject.

Встановлення посилання на бібліотеку сценаріїв виконання Microsoft

Коли ви створюєте посилання на Бібліотеку виконання сценаріїв, ви дозволяєте Excel VBA доступ до всіх властивостей і методів файлів і папок. Як тільки це буде зроблено, ви можете звернутися до об’єкта файлів/папок/дисків у програмі Excel VBA (так само, як ви можете звернутись до осередків, аркушів або робочих книг).

Нижче наведено кроки для створення посилання на бібліотеку виконання сценаріїв Microsoft:

  1. У редакторі VB натисніть Інструменти.
  2. Натисніть посилання.
  3. У діалоговому вікні Посилання, що відкриється, прокрутіть наявні посилання та перевірте параметр «Среда виконання сценаріїв Microsoft».
  4. Натисніть OK.

Наведені вище кроки тепер дозволять вам звертатися до об’єктів FSO з Excel VBA.

Створення екземпляра FileSystemObject у коді

Після того, як ви встановите посилання на бібліотеку Scripting FileSystemObject, вам потрібно створити екземпляр об’єкта FSO у вашому коді.

Як тільки це буде створено, ви можете використовувати його у VBA.

Нижче наведено код, який встановить змінну об'єкта MyFSO як об'єкт FileSystemObject:

Sub CreatingFSO () Dim MyFSO як FileSystemObject Set MyFSO = Новий FileSystemObject End Sub

У цьому коді спочатку я оголосив змінну MyFSO як об’єкт типу FileSystemObject. Це можливо лише тому, що я створив посилання на бібліотеку виконання сценаріїв Microsoft. Якщо посилання не створено, це призведе до помилки (оскільки Excel не розпізнає, що означає FileSystemObject).

У другому рядку відбуваються дві речі:

  1. Ключове слово NEW створює екземпляр FileSystemObject. Це означає, що тепер я можу використовувати всі методи FileSystemObject для роботи з файлами та папками. Якщо ви не створите цей екземпляр, ви не зможете отримати доступ до методів FSO.
  2. Ключове слово SET встановлює об'єкт MyFSO на цей новий екземпляр FileSystemObject. Це дозволяє мені використовувати цей об’єкт для доступу до файлів і папок. Наприклад, якщо мені потрібно створити папку, я можу використовувати метод MyFSO.CreateFolder.

Якщо ви хочете, ви також можете об'єднати два вищезазначених твердження в одне, як показано нижче:

Sub CreatingFSO () Затемнити MyFSO як новий Кінцевий Sub SubSystemObject

Великою перевагою використання цього методу (тобто встановлення посилання на бібліотеку виконання сценаріїв Microsoft) є те, що під час використання об’єктів FSO у вашому коді ви зможете використовувати функцію IntelliSense, яка показує методи та властивості, пов’язані з об'єкт (як показано нижче).

Це неможливо, коли ви створюєте посилання всередині коду (описано далі).

Створення об'єкта з коду

Інший спосіб створити посилання на FSO - це зробити це з коду. У цьому методі вам не потрібно створювати посилання (як це було зроблено в попередньому методі).

Коли ви пишете код, ви можете створити об'єкт із коду та звернутися до Scripting.FileSystemObject.

Наведений нижче код створює об'єкт FSO, а потім робить його типом FileSystemObject.

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

Хоча це може здатися більш зручним, великий мінус використання цього методу полягає в тому, що він не відображатиме IntelliSense під час роботи з об’єктами в FSO. Для мене це величезний мінус, і я завжди рекомендую використовувати попередній метод увімкнення FSO (який полягає у встановленні посилання на «Microsoft Scripting Runtime»)

Приклади VBA FileSystemObject

Тепер давайте зануримось і подивимося на деякі практичні приклади використання FileSystemObject в Excel.

Приклад 1: Перевірте, чи існує файл або папка

Наступний код перевірить, чи існує папка з назвою «Тест» чи ні (у зазначеному місці).

Якщо папка існує, умова IF - Істина, і у вікні повідомлення відображається повідомлення «Папка існує». А якщо його немає, відображається повідомлення - папка не існує ».

Sub CheckFolderExist () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Тоді MsgBox "Папка існує" В іншому MsgBox "Папка не існує" Закінчується, якщо закінчується Підп

Так само ви можете перевірити, чи існує файл чи ні.

Нижче наведений код перевіряє, чи є файл із назвою Test.xlsx у зазначеній папці чи ні.

Sub CheckFileExist () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FileExists ("C: \ Users \ sumit \ Desktop \ Test \ Test.xlsx") Тоді MsgBox "Файл існує" В іншому MsgBox "Файл не існує "Закінчити, якщо закінчити підп

Приклад 2: Створіть нову папку у вказаному місці

Наведений нижче код створить папку з назвою «Тест» на диску C моєї системи (вам потрібно буде вказати шлях у вашій системі, де ви хочете створити папку).

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

Хоча цей код працює нормально, він покаже помилку, якщо папка вже існує.

Наведений нижче код перевіряє, чи папка вже існує, і створює її, якщо її немає. Якщо папка вже існує, на ній відображається повідомлення. Щоб перевірити, чи існує папка, я використав Метод FolderExists ФСО.

Sub CreateFolder () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject If MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Тоді MsgBox "Папка вже існує" В іншому MyFSO.CreateFolder ("C: \ Users \" sumit \ Desktop \ Test ") End If End Sub

Приклад 3: Отримайте список усіх файлів у папці

У наведеному нижче коді відображатимуться імена всіх файлів у зазначеній папці.

Sub GetFileNames () Dim MyFSO As FileSystemObject Dim MyFile як File Dim MyFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") Для кожного файлу MyFolder.Fi Debug.Print MyFile.Name Next MyFile End Sub

Цей код трохи складніший від тих, які ми вже бачили.

Як я вже згадував вище в цьому підручнику, коли ви посилаєтесь на „Бібліотеку виконання сценаріїв Microsoft“, ви можете використовувати FileSystemObject, а також усі інші об’єкти (наприклад, файли та папки).

У наведеному вище коді я використовую три об’єкти - FileSystemObject, File та Folder. Це дозволяє мені переглядати кожен файл у вказаній папці. Потім я використовую властивість name, щоб отримати список усіх імен файлів.

Зауважте, що я використовую Debug.Print, щоб отримати назви всіх файлів. Ці імена будуть перераховані у вікні редактора VB.

Приклад 4: Отримайте список усіх підпапок у папці

Нижче наведений код містить імена всіх підпапок у зазначеній папці. Логіка точно така ж, як описано у наведеному вище прикладі. Замість файлів у цьому коді ми використовували підпапки.

Sub GetSubFolderNames () Dim MyFSO As FileSystemObject Dim MyFile як File Dim MyFolder as Folder Dim MySubFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test \" У MyFolder.SubFolders Debug.Print MySubFolder.Name Next MySubFolder End Sub

Приклад 5: Скопіюйте файл з одного місця на інше

Нижче наведений код скопіює файл із папки "Джерело" та скопіює його до папки "Призначення".

Sub CopyFile () Dim MyFSO як FileSystemObject Dim Source 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 Джерело: = SourceFile, Destination: = DestinationFolder &" \ SampleFileCopy.xlsx "End Sub

У наведеному вище коді я використовував дві змінні - SourceFile та DestinationFolder.

У вихідному файлі міститься адреса файлу, який я хочу скопіювати, а змінна DestinationFolder містить адресу до папки, куди я хочу скопіювати файл.

Зауважте, що недостатньо вказати назву папки призначення під час копіювання файлу. Також потрібно вказати назву файлу. Ви можете використовувати ту саму назву файлу або також змінити її. У наведеному вище прикладі я скопіював файл і назвав його SampleFileCopy.xlsx

Приклад 6: Скопіюйте всі файли з однієї папки в іншу

Нижче наведений код буде копіювати всі файли з вихідної папки в папку призначення.

Sub CopyAllFiles () Dim MyFSO як FileSystemObject Dim MyFile як 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 "Встановити MyFSO = Новий Scripting.FileSystemObject Набір MyFolder = MyFSO.GetFolder (SourceFolder) Для кожного MyFile у MyFolder.Files MyFSO.CopyFile Джерело: = MyFSO.GetFile (MyFile), _ Destination: = Desto "& MyFile.Name, Overwritefiles: = False Next MyFile End Sub

Наведений вище код буде копіювати всі файли з вихідної папки в папку призначення.

Зауважте, що в методі MyFSO.CopyFile я вказав властивість ‘Overwritefiles’ як False (це значення True за замовчуванням). Це гарантує, що у випадку, якщо файл вже є у папці, він не буде скопійований (і ви побачите помилку). Якщо ви видалите "Overwritefiles" або встановите для цього значення True, якщо у цільовій папці є файли з такою ж назвою, вони будуть перезаписані.

Професійна порада: Під час копіювання файлів завжди існує ймовірність перезапису файлів. У цьому випадку гарна ідея - додати позначку часу разом із назвою. Це гарантує, що імена завжди будуть різними, і ви зможете легко відстежувати, які файли були скопійовані в який час.

Якщо ви хочете скопіювати файли лише певного розширення, ви можете зробити це за допомогою оператора IF Then, щоб перевірити, чи є розширення xlsx чи ні.

Sub CopyExcelFilesOnly () Dim MyFSO As FileSystemObject Dim MyFile як 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: sumit \ Desktop \ Destination "Встановити MyFSO = Новий Scripting.FileSystemObject Набір MyFolder = MyFSO.GetFolder (SourceFolder) Для кожного MyFile у MyFolder.Files Якщо MyFSO.GetExtensionName (MyFile) =" xlsx "Тоді MyFSO.CopyFile Джерело: (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = False End If Next MyFile End Sub

Методи FileSystemObject (FSO)

Ось методи, які можна використовувати для кожного об’єкта. Це лише для довідки і не варто надто турбуватися про це. Використання деяких із них було показано у наведених вище прикладах.

Методи FSO Для об'єкта Опис
DriveExists Диск Перевіряє, чи існує диск чи ні
GetDrive Диск Повертає екземпляр об’єкта диска на основі зазначеного шляху
GetDriveName Диск Повторює назву диска
BuildPath Папка з файлами Створіть шлях із наявного шляху та імені
CopyFile Папка з файлами Копіює файл
GetAbsolutePathName Папка з файлами Поверніть канонічне представлення шляху
GetBaseName Папка з файлами Повернути базову назву з шляху. Наприклад, "D: \ TestFolder \ TestFile.xlsm" поверне TextFile.xlsm
GetTempName Папка з файлами Створення імені, яке можна використовувати для іменування тимчасового файлу
CopyFolder Папка Копіює папку з одного місця в інше
CreateFolder Папка Створює нову папку
Видалити папку Папка Видаляє вказану папку
ПапкаІснує Папка Перевіряє, чи існує папка чи ні
GetFolder Папка Повертає екземпляр об’єкта папки на основі зазначеного шляху
GetParentFolderName Папка Повторює ім'я батьківської папки на основі зазначеного шляху
GetSpecialFolder Папка Отримайте розташування різних системних папок.
Перемістити папку Папка Переміщує папку з одного місця на інше
Видалити файл Файл Видаляє файл
FileExists Файл Перевіряє, чи існує файл чи ні
GetExtensionName Файл Повертає розширення файлу
GetFile Файл Повертає екземпляр об’єкта файлу на основі зазначеного шляху
GetFileName Файл Повертає назву файлу
GetFileVersion Файл Повертає версію файлу
Перемістити файл Файл Переміщує файл
CreateTextFile Файл Створює текстовий файл
GetStandardStream Файл Отримати стандартний вхідний, вихідний або потік помилок
OpenTextFile Файл Відкрийте файл як текстовий потік
wave wave wave wave wave