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

Использование 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» в каждом примере.

Вы поможете развитию сайта, поделившись страницей с друзьями

wave wave wave wave wave