Използване на FileSystemObject (FSO) в Excel VBA
FileSystemObject (FSO) ви дава достъп до цял набор от функции за достъп до файловата система на вашия компютър. Използвайки този обект, можете лесно да осъществявате достъп до файлове, папки и устройства, както и да четете и пишете във файлове.
Много от функциите на FSO могат да бъдат написани от вас в традиционна VBA, но биха изисквали повече кодиране и биха били по -трудни за поддържане и разбиране от входящия разработчик. FSO е изпитан API (интерфейс за програмиране на приложения) и е по -надежден от вашия собствен код. Той е лесен за използване, готов и достъпен.
FSO работи в съответствие с международните стандарти и настройки, които имате на вашия компютър. Ако разпространявате приложението си Excel в световен мащаб, използването на FSO ще се погрижи за всякакви разлики в настройките между държавите, което вашият собствен код би имал проблеми.
FSO ще ви позволи да правите почти всичко във VBA код, което бихте могли да направите в Windows File Explorer. Тя ви дава пълен достъп до файловата система 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 Runtime“. Поставете отметка в квадратчето и кликнете върху OK и библиотеката вече е част от вашето приложение.
Местоположението на файла DLL библиотека е C: \ Windows \ SysWOW64 \ scrrun.dll
Ако разпространявате молбата си към други колеги или места, важно е те да имат този файл на правилното място на компютъра си, в противен случай кодът ви ще греши.
Струва си да поставите капан за грешки в събитието „WorkbookOpen“, като използвате командата Dir, за да проверите дали файлът съществува. Ако липсва, дайте предупредително съобщение и затворете файла Excel.
След като препратката е добавена, можете да използвате следния код, за да създадете FSO:
123 | Sub TestFSO ()Затъмнете 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 (driverspec)
123456 | Sub DriveInfo ()Dim MyFSO като нов FileSystemObject, Pth As String, Dr As DrivePth = "C:"Задайте Dr = MyFSO.GetDrive (Pth)MsgBox Dr.FreeSpaceEnd Sub |
Този метод връща обект на устройство въз основа на посоченото устройство. Можете да използвате този обект за достъп до информация за устройството, като например свободно място.
Уморени ли сте от търсене на примери за VBA код? Опитайте AutoMacro!
GetDriveName
Този метод ще отдели името на устройството от низ / път на име на файл.
Синтаксисът е:
GetDriveName (път)
12345 | Sub DriveName ()Затъмнете 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 (filespec)
123456 | Sub FileInfo ()Затъмнете MyFSO като нов FileSystemObject, Pth като низ, Fn като файлPth = "C: \ temp \ testfile.txt"Задайте Fn = MyFSO.GetFile (Pth)MsgBox Fn.DateCreatedEnd Sub |
Това ще върне датата и часа на създаването на посочения файл. Ако не е посочен файл или файлът не съществува, ще получите грешка „файлът не е намерен“.
12345 | Sub FileName ()Затъмнете MyFSO като нов FileSystemObject, Pth като низPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetFileName (Pth)End Sub |
Това ще върне „testfile.txt“.
GetFolder
Това създава обект на папка за основната папка в посочения път. Пътят трябва да съдържа само имена на папки. Не трябва да се включват имена на файлове, в противен случай ще възникне грешка.
Синтаксисът е:
GetFolder (folderspec)
123456 | Sub FolderInfo ()Затъмнете 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 |
Това ще върне „Потребители“, тъй като това е „родителят“ за папката „richard“.
VBA програмиране | Code Generator работи за вас!
Използване на методите „Създаване“
С FSO можете да създадете нова папка и път и да създадете текстов файл.
Създай папка
Можете да посочите ново име на пътеката за създаване. Опасност от това е, че ако папката вече съществува, тогава ще възникне грешка. Можете да използвате метода „FolderExists“, за да сте сигурни, че това няма да се случи.
Синтаксисът е:
Създай папка(име на папка)
1234567 | Sub CreateNewFolder ()Затъмнете MyFSO като нов FileSystemObject, Pth като низPth = "C: \ temp \ MyFolder"Ако MyFSO.FolderExists (Pth) = False ТогаваMyFSO.CreateFolder (Pth)Край АкоEnd Sub |
Този код ще създаде нова папка, наречена „MyFolder“ под съществуващия път „C: \ temp“.
CreateTextFile
Този метод ви позволява да създавате прост текстов файл и да пишете директно в него.
Синтаксисът е:
CreateTextFile (име на файл, [ презаписвам, [ unicode ]])
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 или False. По подразбиране е True.
Използване на методите „Копиране“
Можете да използвате тези методи, за да копирате файл или папка на друго място.
VBA програмиране | Code Generator работи за вас!
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 ще се провали с грешка.
MoveFile
Този метод се използва за преместване на конкретен файл на друго място. Заместващите символи са разрешени в последния компонент на пътя на източника.
Синтаксисът е:
MoveFile източник, дестинация
1234 | Sub MoveAFile ()Затъмнете MyFSO като нов FileSystemObjectMyFSO.MoveFile "C: \ temp \*", "C: \ temp \ myfolder"End Sub |
Този код премества всички файлове, намерени в „C: \ temp“ в „C: \ temp \ myfolder“.
Папките източник и дестинация трябва да съществуват, тъй като папката дестинация не се създава автоматично.
Този метод спира при първата грешка, която срещне. Няма отмяна на каквито и да било действия, които са успели преди възникването на грешката.
VBA програмиране | Code Generator работи за вас!
MoveFolder
Този метод премества определена папка от едно място на друго.
Синтаксисът е:
MoveFolder (източник, дестинация)
1234 | Sub MoveAFolder ()Затъмнете MyFSO като нов FileSystemObjectMyFSO.MoveFolder "C: \ temp \ myfolder", "C: \ temp \ mydestination"End Sub |
Този код премества папката „myfolder“ и съдържанието в папката „mydestination“. „Myfolder“ се изтрива ефективно и се създава „mydestination“, заедно със съдържанието от „myfolder“.
Ако целевата папка вече съществува, възниква грешка.
Използвайки методите „Изтриване“
Тези методи се използват за изтриване на файлове или папки. Те трябва да се използват внимателно, тъй като няма методи за връщане или отмяна, ако нещо се обърка.
Изтрий файла
Това изтрива отделни файлове или група файлове, използвайки заместващи символи.
Синтаксисът е:
Изтрий файла filespec, [ сила ]
1234 | Sub DeleteFiles ()Затъмнете MyFSO като нов FileSystemObjectMyFSO.DeleteFile "C: \ temp \*"End Sub |
Този код ще изтрие всички файлове в папката „C: \ temp“
Параметърът Force не е задължителен и е зададен на True или False. Ако е зададено на True, тогава файловете само за четене ще бъдат изтрити. По подразбиране е False.
DeleteFolder
Този метод изтрива определена папка и нейното съдържание.
Синтаксисът е:
DeleteFolder folderspec, [ сила ]
1234 | Sub DeleteFolders ()Затъмнете MyFSO като нов FileSystemObjectMyFSO.DeleteFolder "C: \ temp \ MyDestination"End Sub |
Този код ще изтрие папката „MyDestination“ и всички файлове в тази папка. Папката „temp“ ще остане.
Параметърът Force не е задължителен и е зададен на True или False. Ако е зададено на True, папките само за четене ще бъдат изтрити. По подразбиране е False.
В последния компонент на пътя могат да се използват заместващи символи. Ако папката не бъде намерена, ще възникне грешка.
Този метод спира при първата грешка, която срещне. Няма отмяна на каквито и да било действия, които са успели преди възникването на грешката.
VBA програмиране | Code Generator работи за вас!
Други методи във FSO
OpenAsTextStream.
Този метод отваря определен файл като обект на текстов поток и му позволява да бъде прочетен или записан. Предимството на този метод е, че той може да отваря всеки тип файл и да извлича наличния текст.
Синтаксисът е:
OpenAsTextStream ([ iomode, [ формат ]])
Параметърът „iomode“ позволява само четене (1), четене/запис (2) и добавяне (8). Параметърът за четене/запис презаписва файла.
Параметърът „format“ е зададен на -2 по подразбиране на системата, -1 за отваряне на файла като Unicode и 0 за отваряне на файла като ASCII (американски стандартен код за обмен на информация).
1234567891011 | Sub TextStream ()Затъмнете 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, [ създавам, [ формат ]]])
Параметърът „iomode“ позволява ForReading, ForWriting и ForAppending. Параметърът ForWriting презаписва файла.
Параметърът „create“ е булева стойност. True означава, че ще бъде създаден нов файл, ако посоченото име на файл не съществува. False означава, че няма да се създаде файл, ако името на файла не бъде намерено. По подразбиране е 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 програмиране | Code Generator работи за вас!
Свойства на FSO
Кара
Това свойство съдържа колекция от налични устройства на вашия компютър.
1234567 | Sub Drv ()Затъмнете MyFSO като нов FileSystemObject, d Като дискЗадайте Dr = MyFSO.DrivesЗа всеки d В Dr.MsgBox d.DriveLetterСледва dEnd Sub |
Този код ще върне всяка буква на устройството, налична на вашия компютър.
Име
Това връща името на определен файл или папка.
123456789 | Под име Име Пример ()Затъмнете 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 |
Този код ще даде името на файла и информация за него, използвайки свойството Drive.
Път
Свойството Path ще отдели пътя от спецификацията на файла.
123456789 | Sub PathExample ()Затъмнете MyFSO като нов FileSystemObjectЗадайте f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Path & f.Name & "on Drive" & UCase (f.Drive) & vbCrLfi = i & "Създадено:" & f.DateCreated & vbCrLfi = i & "Последно достъпно:" & f.DateLastAccessed & vbCrLfi = i & "Последна промяна:" & f.DateLastModifiedMsgBox iEnd Sub |
Този пример работи по същия начин като примера с име, с изключение на това, че сега предоставя пътя към файла.
VBA програмиране | Code Generator работи за вас!
Размер
Свойството Размер ще даде размера на папка или файл.
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 | Под FType ()Затъмнете MyFSO като нов FileSystemObjectЗадайте f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.TypeEnd Sub |
Този код по -горе ще върне текста „Файлова папка“.
12345 | Под FType ()Затъмнете MyFSO като нов FileSystemObjectЗадайте f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f.TypeEnd Sub |
Този код по -горе ще върне текста „Текстов документ“.
Обърнете внимание на използването на „GetFolder“ и „GetFile“ във всеки пример.