Използване на FileSystemObject в Excel VBA

Използване на 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“ във всеки пример.

Така ще помогнете за развитието на сайта, сподели с приятелите си

wave wave wave wave wave