Использование FileSystemObject (FSO) в Excel VBA
FileSystemObject (FSO) дает вам доступ к целому ряду функций для доступа к файловой системе вашего компьютера. Используя этот объект, вы можете легко получить доступ к файлам, папкам и дискам, а также читать и записывать файлы.
Многие функции FSO могут быть написаны вами на традиционном языке VBA, но для этого потребуется больше кода, и их будет сложнее поддерживать и понимать начинающему разработчику. FSO - это проверенный и проверенный API (интерфейс прикладного программирования), который более надежен, чем ваш собственный код. Он прост в использовании, готов и доступен.
FSO работает в соответствии с международными стандартами и настройками, установленными на вашем компьютере. Если вы распространяете свое приложение Excel по всему миру, то использование FSO устранит любые различия в настройках между странами, с которыми ваш собственный код столкнется с трудностями.
FSO позволит вам делать в коде VBA почти все, что вы могли бы делать в проводнике Windows. Это дает вам полный доступ к файловой системе Windows.
Создание объекта FileSystemObject
FileSytemObject не является частью Excel VBA. Вы можете использовать FSO, создав объект (позднее связывание) в VBA:
123 | Подложка CreateFSO ()Установите MyFSO = CreateObject ("Scripting.FileSystemObject")Конец подписки |
Кроме того, вы можете добавить ссылку на библиотеку FSO в VBA. Это называется ранним связыванием и выполняется быстрее, чем позднее связывание, поскольку объект не нужно создавать при запуске вашего кода.
Чтобы добавить ссылку, вам нужно нажать Alt-F11, чтобы войти в редактор Visual Basic (VBE), а затем использовать «Инструменты | Ссылки» из меню VBE. Откроется всплывающее окно, в котором вы сможете выбрать соответствующую ссылку (см. Ниже).
Прокрутите список доступных ссылок, пока не увидите «Microsoft Scripting Runtime». Установите флажок и нажмите ОК, и библиотека теперь является частью вашего приложения.
Расположение файла библиотеки DLL: C: \ Windows \ SysWOW64 \ scrrun.dll.
Если вы распространяете свое приложение среди других коллег или мест, важно, чтобы у них был этот файл в правильном месте на своем компьютере, иначе ваш код будет ошибочным.
Стоит поместить ловушку ошибки в событие «WorkbookOpen» с помощью команды Dir, чтобы проверить, существует ли файл. Если его нет, то выведите предупреждающее сообщение и закройте файл Excel.
После добавления ссылки вы можете использовать следующий код для создания FSO:
123 | Sub TestFSO ()Dim MyFSO как новый объект FileSystemObjectКонец подписки |
Все примеры в этой статье будут использовать эту методологию для создания FSO.
FSO имеет множество доступных методов и свойств. Здесь они разделены на разделы в зависимости от того, что они могут делать.
Использование "существующих" методов
Вы можете использовать метод FSO, чтобы проверить, существует ли диск, папка или файл. Эти методы просты в использовании и требуют только одного параметра.
123456 | Sub CheckExistance ()Dim MyFSO как новый объект FileSystemObjectMsgBox MyFSO.DriveExists ("C:")MsgBox MyFSO.FolderExists ("C: \ temp \")MsgBox MyFSO.FileExists ("C: \ temp \ testfile.txt")Конец подписки |
Все эти операторы вернут «True» при условии, что на вашем компьютере есть диск C :, на нем папка с именем «Temp» и файл в папке Temp с именем «testfile.txt».
Текстовые строки в параметрах не чувствительны к регистру. Ни в одном из этих методов нельзя использовать подстановочные знаки.
Вы также не можете использовать URL-адреса (унифицированные указатели ресурсов) для описания папки или расположения файла. FSO работает исключительно в операционной системе Windows и ее файловой системе. Для местоположения внешнего сервера вам необходимо сначала сопоставить диск с этим, а затем использовать сам путь к диску.
Использование методов "Get"
FSO имеет множество методов для получения информации о файле и пути, либо разделяя путь и файл, либо получая информацию о файле или папке, такую как дата создания или дата изменения.
GetAbsolutePathname
Это предоставит полный путь от корня указанного диска.
Синтаксис:
GetAbsolutePathName (pathspec)
12345 | Sub AbsolutePath ()Dim MyFSO как новый объект FileSystemObject, Pth как строкуPth = "c:…"MsgBox MyFSO.GetAbsolutePathName (Pth)Конец подписки |
Это вернет строку «C: \ Users \ Richard \ Documents». Это потому, что путь был указан как C: с тремя точками. Каждая точка обозначает следующий уровень в структуре папок.
GetBaseName
Это возвращает имя указанного файла или папки.
Синтаксис:
GetBaseName(дорожка)
12345 | Sub BaseName ()Dim MyFSO как новый объект FileSystemObject, Pth как строкуPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetBaseName (Pth)Конец подписки |
Этот код вернет testfile. Метод возвращает последний раздел в имени пути. Если это файл, то он не возвращает суффикс файла.
Если путь не может быть найден, будет возвращена пустая строка.
GetDrive
Это позволяет использовать код для доступа к информации о диске в зависимости от указанной буквы диска.
Синтаксис:
GetDrive (drivepec)
123456 | Дополнительная информация о приводе ()Dim MyFSO как новый объект FileSystemObject, Pth как строка, Dr As DrivePth = "C:"Установите Dr = MyFSO.GetDrive (Pth)MsgBox Dr.FreeSpaceКонец подписки |
Этот метод возвращает приводной объект на основе указанного диска. Вы можете использовать этот объект для доступа к информации о диске, например, о свободном пространстве.
Устали искать примеры кода VBA? Попробуйте AutoMacro!
GetDriveName
Этот метод отделит имя диска от строки пути / имени файла.
Синтаксис:
GetDriveName (дорожка)
12345 | Имя дополнительного диска ()Dim MyFSO как новый объект FileSystemObject, Pth как строкуPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetDriveName (Pth)Конец подписки |
Это вернет "C:"
GetExtensionName
Это вернет суффикс файла по указанному пути.
Синтаксис:
GetExtensionName (дорожка)
12345 | Sub ExtensionName ()Dim MyFSO как новый объект FileSystemObject, Pth как строкуPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetExtensionName (Pth)Конец подписки |
Это вернет «txt».
Если файл не указан, будет возвращена пустая строка.
Получить файл
Этот метод возвращает файловый объект, который содержит различную информацию о самом файле.
Синтаксис:
Получить файл (filespec)
123456 | Дополнительная информация о файле ()Dim MyFSO как новый объект FileSystemObject, Pth как строка, Fn как файлPth = "C: \ temp \ testfile.txt"Установите Fn = MyFSO.GetFile (Pth)MsgBox Fn.DateCreatedКонец подписки |
Это вернет дату и время создания указанного файла. Если файл не указан или файл не существует, вы получите ошибку «файл не найден».
12345 | Sub FileName ()Dim MyFSO как новый объект FileSystemObject, Pth как строкуPth = "C: \ temp \ testfile.txt"MsgBox MyFSO.GetFileName (Pth)Конец подписки |
Это вернет "testfile.txt".
GetFolder
Это создает объект папки для базовой папки по указанному пути. Путь должен содержать только имена папок. Не следует указывать имена файлов, иначе произойдет ошибка.
Синтаксис:
GetFolder (folderpec)
123456 | Sub FolderInfo ()Dim MyFSO как новый объект FileSystemObject, Pth как строка, Fo как папкаPth = "C: \ temp"Установите Fo = MyFSO.GetFolder (Pth)MsgBox Fo.DateCreatedКонец подписки |
Объект папки содержит различную информацию, к которой можно получить доступ. В этом случае он возвращает дату создания папки.
Вы также можете использовать этот метод для получения всех имен файлов в данной папке:
12345678 | Подфайлы ()Dim MyFSO как новый объект FileSystemObject, Pth как строка, Fo как папка, Fn как файлPth = "C: \ temp"Установите Fo = MyFSO.GetFolder (Pth)Для каждого Fn в Fo.FilesMsgBox Fn.NameСледующий FnКонец подписки |
Этот код будет перебирать папку «Temp» и отображать каждое найденное имя файла.
GetParentFolderName
Этот метод вернет имя папки на следующем уровне иерархии папок.
Синтаксис:
GetParentFolderName (дорожка)
12345 | Имя подпапки ()Dim MyFSO как новый объект FileSystemObject, Pth как строка, Fo как папкаPth = "C: \ users \ richard"MsgBox MyFSO.GetParentFolderName (Pth)Конец подписки |
Это вернет «Пользователи», поскольку это «родительский элемент» для папки «richard».
Программирование на VBA | Генератор кода действительно работает для вас!
Использование методов "Create"
С помощью FSO вы можете создать новую папку и путь, а также текстовый файл.
Создать папку
Вы можете указать новый путь к создаваемой папке. Опасность этого в том, что если папка уже существует, то произойдет ошибка. Вы можете использовать метод FolderExists, чтобы этого не произошло.
Синтаксис:
Создать папку(имя папки)
1234567 | Sub CreateNewFolder ()Dim MyFSO как новый объект FileSystemObject, Pth как строкуPth = "C: \ temp \ MyFolder"Если MyFSO.FolderExists (Pth) = False, тоMyFSO.CreateFolder (Pth)Конец, еслиКонец подписки |
Этот код создаст новую папку с именем «MyFolder» по существующему пути «C: \ temp».
CreateTextFile
Этот метод позволяет вам создать простой текстовый файл и писать прямо в него.
Синтаксис:
CreateTextFile (имя файла, [ перезаписывать, [ юникод ]])
1234567 | Подложка CreateTextFile ()Dim MyFSO как новый объект FileSystemObject, Pth как строкуPth = "C: \ temp \ Myfile.txt"Установите Fn = MyFSO.CreateTextFile (Pth, True)Fn. Напишите «Добавить сюда мой собственный текст» & vbLf & «Это вторая строка»Fn.CloseКонец подписки |
Этот код создает текстовый файл с именем «Myfile.txt» в папке «Temp» диска «C:», а затем записывает в него две строки текста.
Обратите внимание, что символ перевода строки присоединяется к записываемой строке.
Если путь, по которому вы пишете, не существует, произойдет ошибка. Вы можете использовать метод FolderExists, чтобы проверить это перед созданием файла.
Существует необязательный параметр для перезаписи существующего файла, если это необходимо - это может быть True или False. По умолчанию установлено True.
Использование методов "копирования"
Вы можете использовать эти методы для копирования файла или папки в другое место.
Программирование на VBA | Генератор кода действительно работает для вас!
Копировать файл
Этот метод скопирует файл из одной папки в другую. Обратите внимание, что копирование не удастся, если в целевом расположении установлен атрибут только для чтения.
Синтаксис:
Копировать файл источник, место назначения, [ перезаписывать ]
1234 | Sub CopyFile ()Dim MyFSO как новый объект FileSystemObjectMyFSO.CopyFile "C: \ temp \ *. Txt", "C: \ temp \ myfolder \", TrueКонец подписки |
Этот код скопирует все текстовые (txt) файлы в «C: \ temp» в «C: \ temp \ myfolder \», при необходимости перезаписав файл. Значение по умолчанию для перезаписи - True.
Вы можете использовать подстановочный знак звездочки (*) для имен файлов, но вы не можете использовать подстановочный знак (?) Для представления отдельных символов.
CopyFolder
Вы можете использовать этот метод для копирования всей папки из одного места в другое.
Синтаксис:
CopyFolder источник, место назначения, [ перезаписывать ]
1234 | Sub CopyFolder ()Dim MyFSO как новый объект FileSystemObjectMyFSO.CopyFolder "C: \ temp \ *", "C: \ users \ richard \"Конец подписки |
Этот код копирует все папки и файлы ниже «C: \ temp» в «C: \ users \ richard». Новая созданная папка будет называться «C: \ users \ richard \ myfolder», поскольку в «C: \ temp» была папка с именем «myfolder».
При использовании этого метода есть четыре возможных исхода:
- Если место назначения не существует, исходная папка и ее содержимое копируются.
- Если место назначения уже существует, возникает ошибка.
- Если местом назначения является папка, то исходная папка и ее содержимое будут скопированы. Ошибка возникнет, если для параметра «Перезапись» задано значение «Ложь» и в месте назначения уже есть копия файла.
- Если в качестве места назначения задано только чтение, произойдет ошибка, если для перезаписи задано значение false.
Этот метод останавливается при первой обнаруженной ошибке. Откат всех действий, которые были выполнены до возникновения ошибки, не происходит.
Использование методов "перемещения"
Эти методы можно использовать для перемещения файлов или папок в другие места. Это то же самое, что вырезать из одного места и вставить в другое. Обратите внимание, что если файл, который нужно переместить, открыт, метод Move завершится ошибкой.
MoveFile
Этот метод используется для перемещения определенного файла в другое место. Подстановочные знаки разрешены в последнем компоненте пути источника.
Синтаксис:
MoveFile источник, место назначения
1234 | Подменю MoveAFile ()Dim MyFSO как новый объект FileSystemObjectMyFSO.MoveFile "C: \ temp \ *", "C: \ temp \ myfolder"Конец подписки |
Этот код перемещает все файлы из папки «C: \ temp» в папку «C: \ temp \ myfolder».
Папки источника и назначения должны существовать, поскольку папка назначения не создается автоматически.
Этот метод останавливается при первой обнаруженной ошибке. Откат всех действий, которые были выполнены до возникновения ошибки, не происходит.
Программирование на VBA | Генератор кода действительно работает для вас!
MoveFolder
Этот метод перемещает определенную папку из одного места в другое.
Синтаксис:
MoveFolder (источник, место назначения)
1234 | Sub MoveAFolder ()Dim MyFSO как новый объект FileSystemObjectMyFSO.MoveFolder "C: \ temp \ myfolder", "C: \ temp \ mydestination"Конец подписки |
Этот код перемещает папку «myfolder» и ее содержимое в папку «mydestination». «Myfolder» эффективно удаляется, и «mydestination» создается вместе с содержимым из «myfolder».
Если папка назначения уже существует, возникает ошибка.
Использование методов «удаления»
Эти методы используются для удаления файлов или папок. Их необходимо использовать с осторожностью, поскольку в случае каких-либо ошибок нет методов отката или отмены.
Удалить файл
При этом удаляются отдельные файлы или группа файлов с использованием подстановочных знаков.
Синтаксис:
Удалить файл filespec, [ сила ]
1234 | Sub DeleteFiles ()Dim MyFSO как новый объект FileSystemObjectMyFSO.DeleteFile "C: \ temp \ *"Конец подписки |
Этот код удалит все файлы в папке «C: \ temp».
Параметр Force является необязательным и имеет значение True или False. Если установлено значение True, файлы, доступные только для чтения, будут удалены. По умолчанию - False.
DeleteFolder
Этот метод удаляет указанную папку и ее содержимое.
Синтаксис:
DeleteFolder folderpec, [ сила ]
1234 | Sub DeleteFolders ()Dim MyFSO как новый объект FileSystemObjectMyFSO.DeleteFolder "C: \ temp \ MyDestination"Конец подписки |
Этот код удалит папку «MyDestination» и все файлы в этой папке. Папка «temp» останется.
Параметр Force является необязательным и имеет значение True или False. Если установлено значение True, то папки, доступные только для чтения, будут удалены. По умолчанию - False.
Подстановочные знаки могут использоваться в последнем компоненте пути. Если папка не найдена, произойдет ошибка.
Этот метод останавливается при первой обнаруженной ошибке. Откат всех действий, которые были выполнены до возникновения ошибки, не происходит.
Программирование на VBA | Генератор кода действительно работает для вас!
Другие методы в FSO
OpenAsTextStream.
Этот метод открывает указанный файл как объект Text Stream и позволяет читать или записывать в него. Преимущество этого метода в том, что он может открывать файлы любого типа и извлекать доступный текст.
Синтаксис:
OpenAsTextStream ([ iomode, [ формат ]])
Параметр «iomode» разрешает только чтение (1), чтение / запись (2) и добавление (8). Параметр чтения / записи перезаписывает файл.
Для параметра «формат» задано значение -2 для системы по умолчанию, -1 для открытия файла в формате Unicode и 0 для открытия файла в формате ASCII (американский стандартный код для обмена информацией).
1234567891011 | Sub TextStream ()Dim MyFSO как новый объект FileSystemObjectУстановите f = MyFSO.GetFile ("C: \ temp \ myfile.txt")Установите ts = f.OpenAsTextStream (2)т.с. напишите «Мой новый текст»ts.CloseУстановите ts = f.OpenAsTextStream (1)s = ts.ReadLineMsgBox sts.CloseКонец подписки |
Этот код получает существующий текстовый файл и создает его как объект с помощью метода GetFile. Затем он открывает текстовый поток как чтение / запись (2) и записывает строку текста. Затем файл закрывается и повторно открывается как read (1), и из него читается строка, которая затем отображается как окно сообщения.
Обратите внимание, что строка чтения должна быть помещена в переменную, прежде чем ее можно будет отобразить в окне сообщения.
BuildPath
Этот метод добавит имя папки или файла в конец существующего пути к папке. Это создает только текстовую строку и не создает новую папку.
Синтаксис:
BuildPath (дорожка, имя)
12345 | Sub BuildPth ()Dim MyFSO как новый объект FileSystemObjectnp = MyFSO.BuildPath ("C: \ temp", "ANewFolder")MsgBox npКонец подписки |
Будет отображена «C: \ temp \ ANewFolder». Однако, если вы действительно хотите использовать эту папку, вам необходимо использовать метод CreateFolder.
OpenTextFile
Этот метод позволяет открывать файлы, читать или записывать их в соответствии с заданными параметрами. Он работает аналогично методу OpenAsTextStream.
Синтаксис:
OpenTextFile (имя файла, [ iomode, [ Создайте, [ формат ]]])
Параметр iomode позволяет использовать ForReading, ForWriting и ForAppending. Параметр ForWriting перезаписывает файл.
Параметр «create» - это логическое значение. Истина означает, что будет создан новый файл, если указанное имя файла не существует. Значение false означает, что файл не будет создан, если имя файла не будет найдено. По умолчанию - False.
Параметр «формат» может иметь значение TristateFalse, TristateMixed, TristateTrue и TristateUseDefault в зависимости от того, является ли файл ASCII или Unicode.
1234567 | Подложка OpenTxtFile ()Dim MyFSO как новый объект FileSystemObjectУстановите ts = MyFSO.OpenTextFile ("C: \ temp \ myfile.txt", ForReading, False, TristateUseDefault)s = ts.ReadLineMsgBox sts.CloseКонец подписки |
Этот код будет читать строку из текстового файла «myfile.txt».
Преимущество метода OpenTextFile перед методом OpenAsTextStreamMethod заключается в том, что у него есть раскрывающиеся списки для параметров, которые более значимы, чем попытки запомнить соответствующие числовые значения для различных вариантов параметров.
Программирование на VBA | Генератор кода действительно работает для вас!
Свойства ФСО
Диски
Это свойство содержит набор доступных дисков на вашем компьютере.
1234567 | Sub Drv ()Dim MyFSO как новый объект FileSystemObject, d как дискУстановите Dr = MyFSO.Drives.Для каждого d In DrMsgBox d.DriveLetterСледующий дКонец подписки |
Этот код вернет каждую букву диска, доступную на вашем компьютере.
Имя
Это возвращает имя указанного файла или папки.
123456789 | Sub NameExample ()Dim MyFSO как новый объект FileSystemObjectУстановите f = MyFSO.GetFile ("C: \ temp \ myfile.txt")i = f.Name & "на диске" & UCase (f.Drive) & vbCrLfi = i & "Создано:" & f.DateCreated & vbCrLfi = i & "Последний доступ:" & f.DateLastAccessed & vbCrLfi = i & "Последнее изменение:" & f.DateLastModifiedMsgBox iКонец подписки |
Этот код даст имя файла и информацию о нем с помощью свойства Drive.
Дорожка
Свойство Path отделяет путь от спецификации файла.
123456789 | Sub PathExample ()Dim 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 iКонец подписки |
Этот пример работает так же, как пример Name, за исключением того, что теперь он предоставляет путь к файлу.
Программирование на VBA | Генератор кода действительно работает для вас!
Размер
Свойство Size даст размер папки или файла.
12345 | Sub FSize ()Dim MyFSO как новый объект FileSystemObjectУстановите f = MyFSO.GetFolder ("C: \ temp \")MsgBox F. РазмерКонец подписки |
Этот код выше вернет размер папки «C: \ temp \».
12345 | Sub FSize ()Dim MyFSO как новый объект FileSystemObjectУстановите f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox F. РазмерКонец подписки |
Этот код выше вернет размер файла myfile.txt.
Тип
Свойство type вернет текст для типа файла или папки.
12345 | Sub FType ()Dim MyFSO как новый объект FileSystemObjectУстановите f = MyFSO.GetFolder ("C: \ temp \")MsgBox f.TypeКонец подписки |
Этот код выше вернет текст «Папка с файлами».
12345 | Sub FType ()Dim MyFSO как новый объект FileSystemObjectУстановите f = MyFSO.GetFile ("C: \ temp \ myfile.txt")MsgBox f.TypeКонец подписки |
Этот код выше вернет текст «Текстовый документ».
Обратите внимание на использование «GetFolder» и «GetFile» в каждом примере.