Використання FileSystemObject (FSO) у Excel VBA
FileSystemObject (FSO) надає вам доступ до цілого ряду функцій для доступу до файлової системи вашого комп’ютера. Використовуючи цей об'єкт, ви можете легко отримати доступ до файлів, папок та дисків, а також читати та записувати у файли.
Багато функцій FSO можна написати вами у традиційній VBA, але вимагатимуть більшого кодування, а вхідному розробнику буде складніше підтримувати та розуміти. FSO - перевірений API (інтерфейс прикладного програмування) і є більш надійним, ніж ваш власний код. Він простий у використанні, готовий і доступний.
FSO працює відповідно до міжнародних стандартів та налаштувань, які є у вас на комп’ютері. Якщо ви розповсюджуєте свою програму Excel у всьому світі, то за допомогою FSO ви впораєтесь з будь -якими відмінностями в налаштуваннях між країнами, що виникне у власного коду.
FSO дозволить вам робити майже все у коді VBA, що ви могли б зробити у Провіднику файлів Windows. Це дає вам повний доступ до файлової системи Windows.
Створення FileSystemObject
FileSytemObject не є частиною Excel VBA. Ви можете використовувати FSO, створивши об'єкт (пізнє прив'язка) у VBA:
123 | Sub CreateFSO ()Встановити MyFSO = CreateObject ("Scripting.FileSystemObject")End Sub |
Крім того, ви можете додати посилання у VBA для бібліотеки FSO. Це називається ранньою прив’язкою, і це швидше, ніж пізнє прив’язування, оскільки об’єкт не потрібно створювати під час запуску коду.
Щоб додати посилання, вам потрібно натиснути клавіші Alt-F11, щоб увійти до редактора Visual Basic (VBE), а потім скористатися "Інструменти | Посилання" з меню VBE. У цьому вікні з’явиться спливаюче вікно, у якому ви зможете вибрати відповідну посилання (див. Нижче).
Прокрутіть список доступних посилань, доки не побачите "Среда виконання Microsoft Scripting". Поставте прапорець і натисніть OK, і бібліотека тепер є частиною вашої програми.
Розташування файлу бібліотеки DLL - C: \ Windows \ SysWOW64 \ scrrun.dll
Якщо ви розповсюджуєте свою заявку іншим колегам або місцеположенням, важливо, щоб вони зберігали цей файл у правильному місці на своєму комп’ютері, інакше у вашому коді буде помилка.
Варто розмістити пастку помилок у події "WorkbookOpen" за допомогою команди Dir, щоб перевірити наявність файлу. Якщо він відсутній, дайте попереджувальне повідомлення та закрийте файл Excel.
Після додавання посилання можна створити такий код для створення FSO:
123 | Підтест FSO ()Затемнити MyFSO як новий FileSystemObjectEnd Sub |
Усі приклади в цій статті будуть використовувати цю методологію для створення FSO.
FSO має багато доступних методів та властивостей. Вони поділяються тут на розділи відповідно до того, що вони можуть зробити.
Використовуючи методи «Існує»
Ви можете скористатися методом FSO, щоб перевірити, чи існує диск, папка чи файл. Ці методи прості у використанні і вимагають лише одного параметра.
123456 | Sub CheckExistance ()Затемнити MyFSO як новий FileSystemObjectMsgBox MyFSO.DriveExists ("C:")MsgBox MyFSO.FolderExists ("C: \ temp \")MsgBox MyFSO.FileExists ("C: \ temp \ testfile.txt")End Sub |
Усі ці твердження повертатимуть «True», якщо припустити, що на вашому комп’ютері є диск C:, папка на ньому під назвою «Temp» і файл у папці Temp під назвою «testfile.txt»
Текстові рядки в параметрах не враховують регістр. Ви не можете використовувати підстановні знаки жодним із цих методів.
Ви також не можете використовувати URL -адреси (єдині локатори ресурсів) для опису розташування папки або файлу. FSO працює виключно з операційною системою Windows та її файловою системою. Для розташування зовнішнього сервера вам потрібно насамперед зіставити диск із цим, а потім використовувати сам шлях до диска.
Використовуючи методи "Отримати"
FSO має численні методи отримання інформації про файл і шлях, або розбиваючи шлях і файл, або отримуючи інформацію про файл або папку, таку як дата створення або дата зміни.
GetAbsolutePathname
Це забезпечить повний шлях від кореня зазначеного диска.
Синтаксис такий:
GetAbsolutePathName (pathspec)
12345 | Sub AbsolutePath ()Затемнити MyFSO як новий FileSystemObject, Pth як рядокPth = "c: …"MsgBox MyFSO.GetAbsolutePathName (Pth)End Sub |
Це поверне рядок "C: \ Users \ Richard \ Documents". Це пояснюється тим, що шлях був вказаний як C: після нього три точки. Кожна крапка означає наступний рівень у структурі папок.
GetBaseName
Це повертає ім'я вказаного файлу або папки.
Синтаксис такий:
GetBaseName(шлях)
12345 | Sub BaseName ()Затемнити MyFSO як новий FileSystemObject, Pth як рядокPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetBaseName (Pth)End Sub |
Цей код поверне "testfile". Метод повертає останній розділ у назві шляху. Якщо це файл, то він не повертає суфікс файлу.
Якщо шлях не вдається знайти, повертається порожній рядок.
GetDrive
Це дозволяє використовувати код для доступу до інформації про диск на основі зазначеної букви диска.
Синтаксис такий:
GetDrive (Drivespec)
123456 | Sub DriveInfo ()Затемнити MyFSO як новий FileSystemObject, Pth як рядок, Dr як дискPth = "C:"Встановити Dr = MyFSO.GetDrive (Pth)MsgBox Dr.FreeSpaceEnd Sub |
Цей метод повертає об’єкт диска на основі зазначеного диска. Ви можете використовувати цей об’єкт для доступу до інформації про накопичувач, наприклад вільного місця.
Втомилися від пошуку прикладів коду VBA? Спробуйте AutoMacro!
GetDriveName
Цей метод відокремлює назву диска від рядка шляху / імені файлу.
Синтаксис такий:
GetDriveName (шлях)
12345 | Додаткове ім'я диска ()Затемнити MyFSO як новий FileSystemObject, Pth як рядокPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetDriveName (Pth)End Sub |
Це поверне "C:"
GetExtensionName
Це поверне суфікс файлу у вказаному шляху.
Синтаксис такий:
GetExtensionName (шлях)
12345 | Sub ExtensionName ()Затемнити MyFSO як новий FileSystemObject, Pth як рядокPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetExtensionName (Pth)End Sub |
Це поверне "txt".
Якщо файл не вказано, повертається порожній рядок.
GetFile
Цей метод повертає об’єкт файлу, який містить різну інформацію про сам файл.
Синтаксис такий:
GetFile (filepec)
123456 | Sub FileInfo ()Затемнити MyFSO як новий FileSystemObject, Pth як рядок, Fn як файлPth = "C: \ temp \ testfile.txt"Встановіть Fn = MyFSO.GetFile (Pth)MsgBox Fn.DateCreatedEnd Sub |
Це поверне дату та час створення зазначеного файлу. Якщо файл не вказано або файл не існує, ви отримаєте помилку "файл не знайдено".
12345 | Додаткова назва файлу ()Затемнити MyFSO як новий FileSystemObject, Pth як рядокPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetFileName (Pth)End Sub |
Це поверне "testfile.txt".
GetFolder
Це створює об’єкт папки для базової папки у вказаному шляху. Шлях повинен містити лише назви папок. Імена файлів не повинні бути включені, інакше станеться помилка.
Синтаксис такий:
GetFolder (folderspec)
123456 | Інформація про підпапку ()Затемнити MyFSO як новий FileSystemObject, Pth як рядок, Fo як папкуPth = "C: \ temp"Встановити Fo = MyFSO.GetFolder (Pth)MsgBox Fo.DateCreatedEnd Sub |
Об'єкт папки містить різну інформацію, до якої можна отримати доступ. У цьому випадку він повертає дату створення папки.
Ви також можете скористатися цим методом, щоб отримати всі імена файлів у даній папці:
12345678 | Додаткові назви файлів ()Затемнити MyFSO як новий FileSystemObject, Pth як рядок, Fo як папку, Fn як файлPth = "C: \ temp"Встановити Fo = MyFSO.GetFolder (Pth)Для кожного файлу Fn у файлах Fo.FilesMsgBox Fn.NameДалі FnEnd Sub |
Цей код буде повторюватись у папці «Temp» і відображатиме кожну знайдену назву файлу.
GetParentFolderName
Цей метод поверне ім’я папки на наступному рівні в ієрархії папок.
Синтаксис такий:
GetParentFolderName (шлях)
12345 | Назва підпапки ()Затемнити MyFSO як новий FileSystemObject, Pth як рядок, Fo як папкуPth = "C: \ users \ richard"MsgBox MyFSO.GetParentFolderName (Pth)End Sub |
Це поверне "Користувачів", оскільки це "батько" для папки "Річард".
Програмування VBA | Генератор коду працює для вас!
Використовуючи методи «Створення»
За допомогою FSO ви можете створити нову папку та шлях та створити текстовий файл.
CreateFolder
Ви можете вказати нову назву шляху до папки для створення. Небезпека цього полягає в тому, що якщо папка вже існує, то станеться помилка. Ви можете скористатися методом "FolderExists", щоб переконатися, що цього не станеться.
Синтаксис такий:
CreateFolder(назва папки)
1234567 | Sub CreateNewFolder ()Затемнити MyFSO як новий FileSystemObject, Pth як рядокPth = "C: \ temp \ MyFolder"Якщо MyFSO.FolderExists (Pth) = False ТодіMyFSO.CreateFolder (Pth)Закінчити ЯкщоEnd Sub |
Цей код створить нову папку під назвою «MyFolder» під існуючим шляхом «C: \ temp».
CreateTextFile
Цей метод дозволяє створювати простий текстовий файл і писати безпосередньо в нього.
Синтаксис такий:
CreateTextFile (ім'я файлу, [ перезаписати, [ Юнікод ]])
1234567 | Sub CreateTextFile ()Затемнити MyFSO як новий FileSystemObject, Pth як рядокPth = "C: \ temp \ Myfile.txt"Встановіть Fn = MyFSO.CreateTextFile (Pth, True)Fn.Write "Додати власний текст тут" & vbLf & "Це другий рядок"Fn.ЗакритиEnd Sub |
Цей код створює текстовий файл під назвою “Myfile.txt” у папці “Temp” на диску “C:”, а потім записує до нього два рядки тексту.
Зауважте, що символ подачі рядка об'єднаний у рядок, що записується.
Якщо шлях, на який ви пишете, не існує, то станеться помилка. Ви можете скористатися методом "FolderExists", щоб перевірити це перед створенням файлу.
Існує необов’язковий параметр для перезапису існуючого файлу, якщо це необхідно - це може бути Істина або Неправда. Типовим значенням є True.
Використовуючи методи «Копіювати»
Ви можете використовувати ці методи, щоб скопіювати файл або папку в інше місце.
Програмування VBA | Генератор коду працює для вас!
CopyFile
Цей метод буде копіювати файл з однієї папки в іншу. Зауважте, що копіювання не вдасться, якщо місце призначення має встановлений атрибут лише для читання.
Синтаксис такий:
CopyFile джерело, призначення, [ перезаписати ]
1234 | Sub CopyFile ()Затемнити MyFSO як новий FileSystemObjectMyFSO.CopyFile "C: \ temp \*. Txt", "C: \ temp \ myfolder \", ІстинаEnd Sub |
Цей код зробить копію всіх текстових (txt) файлів у "C: \ temp" у "C: \ temp \ myfolder \", переписуючи файл там, де це необхідно. За промовчанням для Overwrite є True.
Ви можете використовувати підстановку зірочки (*) для імен файлів, але не можете використовувати знак підписку (?) Для представлення окремих символів.
CopyFolder
Ви можете використовувати цей метод для копіювання всієї папки з одного місця в інше.
Синтаксис такий:
CopyFolder джерело, призначення, [ перезаписати ]
1234 | Підкопійна папка ()Затемнити MyFSO як новий FileSystemObjectMyFSO.CopyFolder "C: \ temp \*", "C: \ users \ richard \"End Sub |
Цей код копіює всі папки та файли нижче "C: \ temp" у "C: \ users \ richard". Створена нова папка буде "C: \ users \ richard \ myfolder", оскільки "C: \ temp" містить папку "myfolder".
При використанні цього методу можливі чотири результати:
- Якщо пункт призначення не існує, то вихідна папка та вміст копіюються.
- Якщо пункт призначення вже існує, виникає помилка.
- Якщо місце призначення - це папка, буде скопійовано вихідну папку та її вміст. Помилка виникне, якщо для параметра Overwrite встановлено значення False, а в адресі вже є копія файлу.
- Якщо пункт призначення призначений лише для читання, помилка станеться, якщо для заміни встановлено значення false.
Цей метод зупиняється на першій помилці, з якою він стикається. Немає відкоту будь -яких дій, які були успішні до виникнення помилки.
Використовуючи методи «переміщення»
Ці методи можна використовувати для переміщення файлів або папок в інші місця. Це те саме, що вирізати з одного місця та вставити в інше. Зауважте, що якщо файл, який потрібно перемістити, відкритий, то метод Move вийде з ладу з помилкою.
Перемістити файл
Цей метод використовується для переміщення певного файлу в інше місце. Дорожні символи дозволені в компоненті останнього шляху джерела.
Синтаксис такий:
Перемістити файл джерело, призначення
1234 | Sub MoveAFile ()Затемнити MyFSO як новий FileSystemObjectMyFSO.MoveFile "C: \ temp \*", "C: \ temp \ myfolder"End Sub |
Цей код переміщує всі файли, знайдені у "C: \ temp", у "C: \ temp \ myfolder".
Папки джерела та цілі мають існувати, оскільки папка призначення не створюється автоматично.
Цей метод зупиняється на першій помилці, з якою він стикається. Немає відкоту будь -яких дій, які були успішні до виникнення помилки.
Програмування VBA | Генератор коду працює для вас!
Перемістити папку
Цей метод переміщує певну папку з одного місця в інше.
Синтаксис такий:
Перемістити папку (джерело, призначення)
1234 | Sub MoveAFolder ()Затемнити MyFSO як новий FileSystemObjectMyFSO.MoveFolder "C: \ temp \ myfolder", "C: \ temp \ mydestination"End Sub |
Цей код переміщує папку "моя папка" та її вміст у папку "моя ціль". "Моя папка" ефективно видаляється і створюється "мій пункт призначення" разом із вмістом "моєї папки".
Якщо цільова папка вже існує, виникає помилка.
Використовуючи методи «Видалити»
Ці методи використовуються для видалення файлів або папок. Їх слід використовувати обережно, оскільки немає методів відкату або скасування, якщо щось піде не так.
Видалити файл
Це видаляє окремі файли або групу файлів за допомогою символів підстановки.
Синтаксис такий:
Видалити файл filepec, [ силу ]
1234 | Sub DeleteFiles ()Затемнити MyFSO як новий FileSystemObjectMyFSO.DeleteFile "C: \ temp \*"End Sub |
Цей код видалить усі файли в папці "C: \ temp"
Параметр Force є необов’язковим і має значення True або False. Якщо встановлено значення True, то файли лише для читання будуть видалені. За замовчуванням встановлено значення False.
Видалити папку
Цей метод видаляє вказану папку та її вміст.
Синтаксис такий:
Видалити папку folderspec, [ силу ]
1234 | Sub DeleteFolders ()Затемнити MyFSO як новий FileSystemObjectMyFSO.DeleteFolder "C: \ temp \ MyDestination"End Sub |
Цей код видалить папку "Моє призначення" та всі файли в цій папці. Папка "temp" залишиться.
Параметр Force є необов’язковим і має значення True або False. Якщо встановлено значення True, папки, призначені лише для читання, будуть видалені. За замовчуванням - False.
Підстановні знаки можна використовувати в останній складовій шляху. Якщо папка не знайдена, то станеться помилка.
Цей метод зупиняється на першій помилці, з якою він стикається. Немає відкоту будь -яких дій, які були успішні до виникнення помилки.
Програмування VBA | Генератор коду працює для вас!
Інші методи у FSO
OpenAsTextStream.
Цей метод відкриває вказаний файл як об’єкт текстового потоку і дозволяє його читати або записувати. Перевага цього методу в тому, що він може відкривати будь -який тип файлу та витягувати доступний текст.
Синтаксис такий:
OpenAsTextStream ([ іомод, [ формату ]])
Параметр ‘iomode’ дозволяє лише читання (1), читання/запис (2) та додавання (8). Параметр читання/запису перезаписує файл.
Параметр "format" встановлено на -2 за замовчуванням системи, -1 для відкриття файлу як Unicode та 0 для відкриття файлу як ASCII (американський стандартний код для обміну інформацією).
1234567891011 | Підтекстовий потік тексту ()Затемнити MyFSO як новий FileSystemObjectВстановіть f = MyFSO.GetFile ("C: \ temp \ myfile.txt")Встановіть ts = f.OpenAsTextStream (2)ts.Напишіть "Мій новий текст"ts.ЗакритиВстановіть ts = f.OpenAsTextStream (1)s = ts.ReadLineMsgBox sts.ЗакритиEnd Sub |
Цей код отримує існуючий текстовий файл і створює його як об’єкт за допомогою методу «GetFile». Потім він відкриває текстовий потік у вигляді читання / запису (2) і записує рядок тексту. Потім файл закривається і знову відкривається як прочитаний (1), а з нього зчитується рядок, який потім відображається у вигляді вікна повідомлення.
Зауважте, що рядок для читання повинен бути розміщений у змінній, перш ніж він може відображатися у вікні повідомлення.
BuildPath
Цей метод додасть назву папки або файлу до кінця існуючого шляху до папки. Це лише створює текстовий рядок, а фактично не створює нову папку.
Синтаксис такий:
BuildPath (шлях, ім'я)
12345 | Sub BuildPth ()Затемнити MyFSO як новий FileSystemObjectnp = MyFSO.BuildPath ("C: \ temp", "ANewFolder")MsgBox npEnd Sub |
Буде відображено "C: \ temp \ ANewFolder". Однак, якщо ви дійсно хочете використовувати цю папку, вам потрібно використовувати метод "CreateFolder".
OpenTextFile
Цей метод дозволяє відкривати і читати файли або записувати їх відповідно до заданих параметрів. Він працює подібно до методу OpenAsTextStream.
Синтаксис такий:
OpenTextFile (ім'я файлу, [ іомод, [ створити, [ формату ]]])
Параметр ‘iomode’ дозволяє ForReading, ForWriting та ForAppending. Параметр ForWriting перезаписує файл.
Параметр ‘create’ є булевим значенням. Істина означає, що новий файл буде створено, якщо вказана назва файлу не існує. Неправда означає, що файл не буде створено, якщо ім'я файлу не знайдено. За замовчуванням встановлено значення False.
Параметр "format" можна встановити на TristateFalse, TristateMixed, TristateTrue і TristateUseDefault залежно від того, чи є файл ASCII або Unicode.
1234567 | Sub OpenTxtFile ()Затемнити MyFSO як новий FileSystemObjectВстановіть ts = MyFSO.OpenTextFile ("C: \ temp \ myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.ЗакритиEnd Sub |
Цей код прочитає рядок із текстового файлу "myfile.txt".
Перевага, яку має метод OpenTextFile перед OpenAsTextStreamMethod, полягає в тому, що він має спадні параметри для параметрів, які є більш значущими, ніж спроба запам'ятати відповідні числові значення для різних параметрів параметрів.
Програмування VBA | Генератор коду працює для вас!
Властивості FSO
Приводи
Ця властивість містить колекцію доступних дисків на вашому комп’ютері.
1234567 | Sub Drv ()Затемнити MyFSO як новий FileSystemObject, d Як дискВстановіть Dr = MyFSO.DrivesДля кожного d В DrMsgBox d.DriveLetterДалі dEnd Sub |
Цей код поверне кожну букву диска, наявну на вашому комп’ютері.
Назва
Це повертає ім'я вказаного файлу або папки.
123456789 | Sub NameExample ()Затемнити MyFSO як новий FileSystemObjectВстановіть f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Name & "on Drive" & UCase (f.Drive) & vbCrLfi = i & "Створено:" & f.DateCreated & vbCrLfi = i & "Останній доступ:" & f.DateLastAccessed & vbCrLfi = i & "Остання зміна:" & f.DateLastModifiedMsgBox iEnd Sub |
Цей код надасть назву файлу та інформацію про нього за допомогою властивості Диска.
Шлях
Властивість Path відокремлює шлях від специфікації файлу.
123456789 | Sub PathExample ()Затемнити MyFSO як новий FileSystemObjectВстановіть f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Path & f.Name & "на диску" & UCase (f.Drive) & vbCrLfi = i & "Створено:" & f.DateCreated & vbCrLfi = i & "Останній доступ:" & f.DateLastAccessed & vbCrLfi = i & "Остання зміна:" & f.DateLastModifiedMsgBox iEnd Sub |
Цей приклад працює так само, як і приклад Ім'я, за винятком того, що тепер він надає шлях до файлу.
Програмування VBA | Генератор коду працює для вас!
Розмір
Властивість Size визначає розмір папки або файлу.
12345 | Sub FSize ()Затемнити MyFSO як новий FileSystemObjectВстановіть f = MyFSO.GetFolder ("C: \ temp \")MsgBox f. РозмірEnd Sub |
Цей код вище поверне розмір папки "C: \ temp \".
12345 | Sub FSize ()Затемнити MyFSO як новий FileSystemObjectВстановіть f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f. РозмірEnd Sub |
Цей код вище поверне розмір файлу "myfile.txt".
Тип
Властивість type повертає текст типу файлу або папки.
12345 | Sub FType ()Затемнити MyFSO як новий FileSystemObjectВстановіть f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.TypeEnd Sub |
Цей код вище поверне текст "Папка файлів".
12345 | Sub FType ()Затемнити MyFSO як новий FileSystemObjectВстановіть f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f.TypeEnd Sub |
Цей код вище поверне текст "Текстовий документ".
Зверніть увагу на використання "GetFolder" та "GetFile" у кожному прикладі.