Использование VBA FileSystemObject (FSO) в Excel - простой обзор и примеры

Когда мы используем VBA в Excel, в основном это делается для автоматизации наших задач.

Это также означает, что большую часть времени мы работаем с ячейками и диапазонами, листами, книгами и другими объектами, которые являются частью приложения Excel.

Но VBA намного мощнее, и его также можно использовать для работы с материалами вне Excel.

В этом руководстве я покажу вам, как использовать VBA FileSystemObject (FSO) для работы с файлами и папками в вашей системе или на сетевых дисках.

Что такое VBA FileSystemObject (FSO)?

FileSystemObject (FSO) позволяет получить доступ к файловой системе вашего компьютера. Используя его, вы можете получить доступ и изменить файлы / папки / каталоги в вашей компьютерной системе.

Например, ниже приведены некоторые из вещей, которые вы можете делать с помощью FileSystemObject в Excel VBA:

  • Проверьте, существует ли файл или папка.
  • Создавайте или переименовывайте папки / файлы.
  • Получите список всех имен файлов (или имен подпапок) в папке.
  • Скопируйте файлы из одной папки в другую.

Надеюсь, вы уловили идею.

Я расскажу обо всех вышеперечисленных примерах (а также о многом другом) позже в этом уроке.

Хотя некоторые из вещей, упомянутых выше, также могут быть выполнены с использованием традиционных функций VBA (таких как функция DIR) и методов, это приведет к созданию более длинных и сложных кодов. FileSystemObject упрощает работу с файлами и папками, сохраняя при этом чистый и короткий код.

Примечание. FSO можно использовать только в Excel 2000 и более поздних версиях.

К каким объектам можно получить доступ через FileSystemObject?

Как я упоминал выше, вы можете получать доступ и изменять файлы и папки с помощью FileSystemObject в VBA.

Ниже приведена таблица, в которой показаны наиболее важные объекты, к которым вы можете получить доступ и изменить с помощью FSO:

Объект Описание
Привод Drive Object позволяет вам получить информацию о диске, например, существует он или нет, его имя пути, тип диска (съемный или фиксированный), его размер и т. Д.
Папка Объект папки позволяет создавать или изменять папки в вашей системе. Например, с помощью этого объекта можно создавать, удалять, переименовывать, копировать папки.
Файл File Object позволяет вам работать с файлами в вашей системе. Например, с помощью этого объекта вы можете создавать, открывать, копировать, перемещать и удалять файлы.
TextStream Объект TextStream позволяет создавать или читать текстовые файлы.

У каждого из вышеперечисленных объектов есть методы, которые вы можете использовать для работы с ними.

Чтобы дать вам пример, если вы хотите удалить папку, вы будете использовать метод DeleteFolder объекта Folder. Точно так же, если вы хотите скопировать файл, вы будете использовать метод CopyFile объекта File.

Не волнуйтесь, если это кажется непонятным или непонятным. Вы получите гораздо лучшее понимание, когда рассмотрите примеры, которые я рассмотрел в этом руководстве.

Просто для справки я рассмотрел все методы FileSystemObject (для каждого объекта) в конце этого руководства.

Включение FileSystemObject в Excel VBA

FileSystemObject по умолчанию недоступен в Excel VBA.

Поскольку мы имеем дело с файлами и папками, находящимися за пределами приложения Excel, нам необходимо сначала создать ссылку на библиотеку, которая содержит эти объекты (диски, файлы, папки).

Теперь есть два способа начать использовать FileSystemObject в Excel VBA:

  1. Установка ссылки на библиотеку времени выполнения сценариев Microsoft (Scrrun.dll)
  2. Создание объекта для ссылки на библиотеку из самого кода

Хотя оба этих метода работают (и я покажу вам, как это сделать дальше), я рекомендую использовать первый метод.

Примечание. Когда вы включаете FileSystemObject, вы можете получить доступ ко всем объектам в нем. Сюда входят FileSystemObject, Drive, Files, Folders и т. Д. В этом руководстве я буду уделять основное внимание объекту FileSystemObject.

Установка ссылки на библиотеку времени выполнения сценариев Microsoft

Создавая ссылку на библиотеку времени выполнения сценариев, вы разрешаете Excel VBA доступ ко всем свойствам и методам файлов и папок. Как только это будет сделано, вы можете обратиться к объекту файлов / папок / дисков из Excel VBA (точно так же, как вы можете ссылаться на ячейки, рабочие листы или книги).

Ниже приведены шаги по созданию ссылки на библиотеку времени выполнения сценариев Microsoft:

  1. В редакторе VB нажмите Инструменты.
  2. Щелкните Ссылки.
  3. В открывшемся диалоговом окне «Ссылки» прокрутите доступные ссылки и установите флажок «Microsoft Scripting Runtime».
  4. Щелкните ОК.

Вышеупомянутые шаги теперь позволят вам ссылаться на объекты FSO из Excel VBA.

Создание экземпляра FileSystemObject в коде

После того, как вы установили ссылку на библиотеку Scripting FileSystemObject, вам необходимо создать экземпляр объекта FSO в вашем коде.

Как только он будет создан, вы можете использовать его в VBA.

Ниже приведен код, который устанавливает объектную переменную MyFSO как объект FileSystemObject:

Sub CreatingFSO () Dim MyFSO As FileSystemObject Set MyFSO = New FileSystemObject End Sub

В этом коде сначала я объявил переменную MyFSO как объект типа FileSystemObject. Это возможно только потому, что я создал ссылку на библиотеку времени выполнения сценариев Microsoft. Если ссылка не создана, это приведет к ошибке (поскольку Excel не распознает, что означает FileSystemObject).

Во второй строке происходят две вещи:

  1. Ключевое слово NEW создает экземпляр FileSystemObject. Это означает, что теперь я могу использовать все методы FileSystemObject для работы с файлами и папками. Если вы не создадите этот экземпляр, вы не сможете получить доступ к методам FSO.
  2. Ключевое слово SET устанавливает для объекта MyFSO этот новый экземпляр FileSystemObject. Это позволяет мне использовать этот объект для доступа к файлам и папкам. Например, если мне нужно создать папку, я могу использовать метод MyFSO.CreateFolder.

Если хотите, вы также можете объединить два приведенных выше оператора в один, как показано ниже:

Sub CreatingFSO () Dim MyFSO As New FileSystemObject End Sub

Большим преимуществом использования этого метода (который заключается в установке ссылки на библиотеку времени выполнения сценариев Microsoft) является то, что при использовании объектов FSO в своем коде вы сможете использовать функцию IntelliSense, которая показывает методы и свойства, связанные с объект (как показано ниже).

Это невозможно, если вы создаете ссылку из кода (рассматривается далее).

Создание объекта из кода

Другой способ создать ссылку на FSO - сделать это из кода. В этом методе вам не нужно создавать ссылку (как это было сделано в предыдущем методе).

Когда вы пишете код, вы можете создать объект внутри кода и обратиться к Scripting.FileSystemObject.

Приведенный ниже код создает объект FSO, а затем делает его типом FileSystemObject.

Sub FSODemo () Dim FSO As Object Set FSO = CreateObject ("Scripting.FileSystemObject") End Sub

Хотя это может показаться более удобным, большим недостатком использования этого метода является то, что он не будет отображать IntelliSense при работе с объектами в FSO. Для меня это огромный минус, и я всегда рекомендую использовать предыдущий метод включения FSO (который заключается в установке ссылки на «Microsoft Scripting Runtime»).

Примеры объектов VBA FileSystemObject

Теперь давайте углубимся и рассмотрим несколько практических примеров использования FileSystemObject в Excel.

Пример 1. Проверьте, существует ли файл или папка.

Следующий код проверит, существует ли папка с именем «Test» (в указанном месте).

Если папка существует, условие ЕСЛИ истинно, и в окне сообщения отображается сообщение «Папка существует». А если его нет, отображается сообщение «Папка не существует».

Sub CheckFolderExist () Dim MyFSO As FileSystemObject Установите MyFSO = New FileSystemObject, если MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test"), то MsgBox "Папка существует" Else MsgBox "Папка не существует" Конец, если конец Sub

Точно так же вы также можете проверить, существует файл или нет.

Приведенный ниже код проверяет, есть ли в указанной папке файл с именем Test.xlsx.

Sub CheckFileExist () Dim MyFSO As FileSystemObject Установите MyFSO = New FileSystemObject, если MyFSO.FileExists ("C: \ Users \ sumit \ Desktop \ Test \ Test.xlsx"), то MsgBox "Файл существует" Else MsgBox "Файл не существует "End If End Sub

Пример 2: Создание новой папки в указанном месте

Приведенный ниже код создаст папку с именем «Test» на диске C моей системы (вам нужно будет указать путь в вашей системе, где вы хотите создать папку).

Sub CreateFolder () Dim MyFSO As FileSystemObject Установите MyFSO = New FileSystemObject MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test") End Sub

Хотя этот код работает нормально, он покажет ошибку, если папка уже существует.

Приведенный ниже код проверяет, существует ли уже папка, и создает папку, если это не так. Если папка уже существует, отображается сообщение. Чтобы проверить, существует ли папка, я использовал FolderExists метод ФСО.

Sub CreateFolder () Dim MyFSO As FileSystemObject Установите MyFSO = New FileSystemObject, если MyFSO.FolderExists ("C: \ Users \ sumit \ Desktop \ Test") Затем MsgBox "Папка уже существует" Else MyFSO.CreateFolder ("C: \ Users \ sumit \ Desktop \ Test ") End If End Sub

Пример 3: получить список всех файлов в папке

В приведенном ниже коде будут показаны имена всех файлов в указанной папке.

Sub GetFileNames () Dim MyFSO As FileSystemObject Dim MyFile As File Dim MyFolder As Folder Set MyFSO = New Scripting.FileSystemObject Set MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit \ Desktop \ Test") для каждого MyFile в MyFolder.Files Debug.Print MyFile.Name Next MyFile End Sub

Этот код немного сложнее тех, которые мы уже видели.

Как я упоминал выше в этом руководстве, когда вы ссылаетесь на «Microsoft Scripting Runtime Library», вы можете использовать FileSystemObject, а также все другие объекты (такие как файлы и папки).

В приведенном выше коде я использую три объекта - FileSystemObject, File и Folder. Это позволяет мне просматривать каждый файл в указанной папке. Затем я использую свойство name, чтобы получить список всех имен файлов.

Обратите внимание, что я использую Debug.Print, чтобы получить имена всех файлов. Эти имена будут перечислены в непосредственном окне редактора VB.

Пример 4: получить список всех подпапок в папке

В приведенном ниже коде будут указаны имена всех подпапок в указанной папке. Логика точно такая же, как в приведенном выше примере. Вместо файлов в этом коде мы использовали подпапки.

Sub GetSubFolderNames () Dim MyFSO как FileSystemObject Dim MyFile как файл Dim MyFolder как папка Dim MySubFolder как папка Установить MyFSO = New Scripting.FileSystemObject Установить MyFolder = MyFSO.GetFolder ("C: \ Users \ sumit For Each \ Desktop \ Test") В MyFolder.SubFolders Debug.Print MySubFolder.Name Next MySubFolder End Sub

Пример 5: копирование файла из одного места в другое

Приведенный ниже код скопирует файл из папки «Source» и скопирует его в папку «Destination».

Sub CopyFile () Dim MyFSO как FileSystemObject Dim SourceFile как строка Dim DestinationFolder как строка Set MyFSO = New Scripting.FileSystemObject SourceFile = "C: \ Users \ sumit \ Desktop \ Source \ SampleFile.xlsx" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "MyFSO.CopyFile Source: = SourceFile, Destination: = DestinationFolder &" \ SampleFileCopy.xlsx "End Sub

В приведенном выше коде я использовал две переменные - SourceFile и DestinationFolder.

Исходный файл содержит адрес файла, который я хочу скопировать, а переменная DestinationFolder содержит адрес папки, в которую я хочу скопировать файл.

Учтите, что при копировании файла недостаточно указать имя целевой папки. Также необходимо указать имя файла. Вы можете использовать то же имя файла или изменить его. В приведенном выше примере я скопировал файл и назвал его SampleFileCopy.xlsx

Пример 6: копирование всех файлов из одной папки в другую

Приведенный ниже код скопирует все файлы из исходной папки в целевую папку.

Sub CopyAllFiles () Dim MyFSO As FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users \ sumit \ Desktop \ Destination "Установить MyFSO = New Scripting.FileSystemObject Установить MyFolder = MyFSO.GetFolder (SourceFolder) для каждого MyFile в MyFolder.Files MyFSO.CopyFile Источник: = MyFSO.GetFile (MyFile), _ Destination: = DestinationFolder &" "& MyFile.Name, Overwritefiles: = False Next MyFile End Sub

Приведенный выше код скопирует все файлы из исходной папки в целевую папку.

Обратите внимание, что в методе MyFSO.CopyFile я указал для свойства Overwritefiles значение False (по умолчанию это True). Это гарантирует, что если у вас уже есть файл в папке, он не будет скопирован (и вы увидите ошибку). Если вы удалите «Overwritefiles» или установите для него значение True, в случае, если в целевой папке есть файлы с таким же именем, они будут перезаписаны.

Совет профессионала: При копировании файлов всегда есть вероятность перезаписать файлы. В этом случае хорошей идеей будет добавить метку времени вместе с именем. Это гарантирует, что имена всегда будут разными, и вы сможете легко отследить, какие файлы были скопированы и в какое время.

Если вы хотите скопировать файлы только определенного расширения, вы можете сделать это с помощью оператора IF Then, чтобы проверить, является ли расширение xlsx или нет.

Sub CopyExcelFilesOnly () Dim MyFSO As FileSystemObject Dim MyFile As File Dim SourceFolder As String Dim DestinationFolder As String Dim MyFolder As Folder Dim MySubFolder As Folder SourceFolder = "C: \ Users \ sumit \ Desktop \ Source" DestinationFolder = "C: \ Users sumit \ Desktop \ Destination "Установить MyFSO = New Scripting.FileSystemObject Установить MyFolder = MyFSO.GetFolder (SourceFolder) для каждого MyFile в MyFolder.Files Если MyFSO.GetExtensionName (MyFile) =" xlsx "Тогда MyFSO.CopyFile Source: = MyFileFS. (MyFile), _ Destination: = DestinationFolder & "\" & MyFile.Name, Overwritefiles: = False End If Next MyFile End Sub

Методы FileSystemObject (FSO)

Вот методы, которые вы можете использовать для каждого объекта. Это просто для справки, и не стоит особо об этом беспокоиться. Использование некоторых из них было показано в приведенных выше примерах.

Методы FSO Для объекта Описание
DriveExists Привод Проверяет, существует ли диск
GetDrive Привод Возвращает экземпляр приводного объекта на основе указанного пути
GetDriveName Привод Повторно запускает имя диска
BuildPath Папка Создать путь из существующего пути и имени
Копировать файл Папка Копирует файл
GetAbsolutePathName Папка Вернуть каноническое представление пути
GetBaseName Папка Возвращает базовое имя из пути. Например, «D: \ TestFolder \ TestFile.xlsm» вернет TextFile.xlsm.
GetTempName Папка Сгенерировать имя, которое можно использовать для имени временного файла
CopyFolder Папка Копирует папку из одного места в другое
Создать папку Папка Создает новую папку
DeleteFolder Папка Удаляет указанную папку
FolderExists Папка Проверяет, существует ли папка
GetFolder Папка Возвращает экземпляр объекта папки на основе указанного пути
GetParentFolderName Папка Возвращает имя родительской папки на основе указанного пути
GetSpecialFolder Папка Получите расположение различных системных папок.
MoveFolder Папка Перемещает папку из одного места в другое
Удалить файл Файл Удаляет файл
Файл существует Файл Проверяет, существует файл или нет
GetExtensionName Файл Возвращает расширение файла
Получить файл Файл Возвращает экземпляр файлового объекта на основе указанного пути
GetFileName Файл Возвращает имя файла
GetFileVersion Файл Возвращает версию файла
MoveFile Файл Перемещает файл
CreateTextFile Файл Создает текстовый файл
GetStandardStream Файл Получить стандартный поток ввода, вывода или ошибки
OpenTextFile Файл Открыть файл как TextStream
wave wave wave wave wave