🔧 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 の違い
機能 | Dir | FileSystemObject |
---|---|---|
存在確認 | ○ | ○ |
ファイル情報取得 | ×(ほぼ不可) | ○(サイズ・日付など) |
複数ファイル列挙 | ○(ワイルドカード) | ○(柔軟、再帰も可) |
フォルダー操作 | △ | ◎ |
ファイル読み書き | × | ○ |
柔軟性・拡張性 | 低い | 非常に高い |
⚠️ 注意点とベストプラクティス
注意点 | 内容 |
---|---|
参照設定なしでも使える | 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 を通じてファイルに読み書きできる |
再帰処理やサブフォルダ対応 | GetFolder と SubFolders を使って深い階層までアクセス可能 |
安全なファイル操作 | Exists 系の関数でエラーを防ぎやすい |
Dir より拡張性が高い | シンプルな用途は Dir 、本格的な処理は FSO が適している |