VBA 高機能なファイルやフォルダーの操作(FileSystemObject(FSO))

🔧 FileSystemObject(FSO)の概要

FileSystemObject は、Microsoft が提供する Scripting ライブラリに属しており、以下のような操作が可能です:

  • ファイルやフォルダの作成・削除・移動・コピー
  • ファイルの読み書き
  • ファイルやフォルダの存在確認
  • サイズや作成日・更新日などの属性取得
  • フォルダやファイルの列挙(再帰検索含む)

✅ 使用前準備:参照設定

VBAエディタで以下を設定すると補完や型チェックが使えて便利です:

  • メニュー → ツール参照設定
  • Microsoft Scripting Runtime」にチェック

※チェックしなくても動作は可能(CreateObjectで動的生成する場合)


📌 基本的な使い方

① FileSystemObject の生成

vbコピーする編集するDim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

※参照設定をした場合は、以下でもOK:

Dim fso As FileSystemObject
Set fso = New FileSystemObject

② ファイルやフォルダーの存在確認

If fso.FileExists("C:\test.txt") Then
MsgBox "ファイルは存在します"
End If

If fso.FolderExists("C:\MyFolder") Then
MsgBox "フォルダーは存在します"
End If

③ ファイル・フォルダの作成

fso.CreateFolder "C:\NewFolder"
fso.CreateTextFile "C:\NewFolder\sample.txt", True
  • 第2引数(True)は既存時の上書き許可

④ ファイル・フォルダの削除

fso.DeleteFile "C:\NewFolder\sample.txt", True
fso.DeleteFolder "C:\NewFolder", True
  • 第2引数(True)は読み取り専用属性の削除許可

⑤ ファイル情報の取得

Dim file As Object
Set file = fso.GetFile("C:\test.txt")

MsgBox "ファイルサイズ: " & file.Size & " バイト"
MsgBox "作成日: " & file.DateCreated
MsgBox "最終更新日: " & file.DateLastModified

⑥ フォルダ内のファイル列挙

Dim folder As Object
Dim file As Object

Set folder = fso.GetFolder("C:\MyFolder")

For Each file In folder.Files
Debug.Print file.Name & " - " & file.Size & " バイト"
Next

⑦ サブフォルダーを含めた再帰検索

Sub ListFilesRecursive(ByVal path As String)
Dim folder As Object, subfolder As Object, file As Object
Set folder = fso.GetFolder(path)

For Each file In folder.Files
Debug.Print folder.Path & "\" & file.Name
Next

For Each subfolder In folder.SubFolders
ListFilesRecursive subfolder.Path
Next
End Sub

呼び出し例:

ListFilesRecursive "C:\MyFolder"

⑧ ファイルのコピー・移動

fso.CopyFile "C:\source.txt", "D:\backup\source.txt", True
fso.MoveFolder "C:\data", "D:\archive"
  • 第3引数(True)は、コピー時に上書きを許可

⑨ ファイルの読み書き

テキストファイルへの書き込み

Dim ts As Object
Set ts = fso.CreateTextFile("C:\log.txt", True)
ts.WriteLine "ログを書き込みました"
ts.Close

読み込み

Dim textStream As Object
Set textStream = fso.OpenTextFile("C:\log.txt", 1) ' 1 = ForReading

Do Until textStream.AtEndOfStream
Debug.Print textStream.ReadLine
Loop

textStream.Close

🧠 FileSystemObject vs Dir の違い

機能DirFileSystemObject
存在確認
ファイル情報取得×(ほぼ不可)○(サイズ・日付など)
複数ファイル列挙○(ワイルドカード)○(柔軟、再帰も可)
フォルダー操作
ファイル読み書き×
柔軟性・拡張性低い非常に高い

⚠️ 注意点とベストプラクティス

注意点内容
参照設定なしでも使えるCreateObject("Scripting.FileSystemObject") を使えば動的に生成可能
読み取り専用ファイル削除・上書き時には第2引数で許可が必要
ファイルが開かれている場合削除や移動に失敗する可能性あり
エラー処理存在確認や削除前に FileExists / FolderExists を使うべき
パスの末尾の「\」処理GetAbsolutePathName を使うと安全

🧪 応用例:ファイルをバックアップフォルダに移動

Sub BackupLogFiles()
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")

Dim srcFolder As Object, file As Object
Set srcFolder = fso.GetFolder("C:\Logs")

For Each file In srcFolder.Files
If fso.GetExtensionName(file.Name) = "log" Then
fso.MoveFile file.Path, "D:\Backup\" & file.Name
End If
Next
End Sub

📚 まとめ

機能説明
高機能で柔軟ファイル/フォルダーの詳細操作・属性取得が可能
読み書き操作も対応TextStreamを通じてファイルに読み書きできる
再帰処理やサブフォルダ対応GetFolderSubFolders を使って深い階層までアクセス可能
安全なファイル操作Exists 系の関数でエラーを防ぎやすい
Dir より拡張性が高いシンプルな用途は Dir、本格的な処理は FSO が適している
タイトルとURLをコピーしました