Коли ми використовуємо 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:
- Встановлення посилання на бібліотеку виконання сценаріїв Microsoft (Scrrun.dll)
- Створення об'єкта для посилання на бібліотеку з самого коду
Хоча обидва ці методи працюють (і я покажу вам, як це зробити далі), я рекомендую використовувати перший метод.
Примітка: Коли ви вмикаєте FileSystemObject, ви можете отримати доступ до всіх об’єктів у ньому. Це включає FileSystemObject, Диск, Файли, Папки тощо. У цьому підручнику я зосереджусь переважно на FileSystemObject.Встановлення посилання на бібліотеку сценаріїв виконання Microsoft
Коли ви створюєте посилання на Бібліотеку виконання сценаріїв, ви дозволяєте Excel VBA доступ до всіх властивостей і методів файлів і папок. Як тільки це буде зроблено, ви можете звернутися до об’єкта файлів/папок/дисків у програмі Excel VBA (так само, як ви можете звернутись до осередків, аркушів або робочих книг).
Нижче наведено кроки для створення посилання на бібліотеку виконання сценаріїв Microsoft:
- У редакторі VB натисніть Інструменти.
- Натисніть посилання.
- У діалоговому вікні Посилання, що відкриється, прокрутіть наявні посилання та перевірте параметр «Среда виконання сценаріїв Microsoft».
- Натисніть 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).
У другому рядку відбуваються дві речі:
- Ключове слово NEW створює екземпляр FileSystemObject. Це означає, що тепер я можу використовувати всі методи FileSystemObject для роботи з файлами та папками. Якщо ви не створите цей екземпляр, ви не зможете отримати доступ до методів FSO.
- Ключове слово 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 | Файл | Відкрийте файл як текстовий потік |