【ExcelVBA・マクロ】FileSystemObject完全ガイド【ファイル・フォルダ操作の基本から実務活用まで徹底解説】

FileSystemObject完全ガイド ExcelVBA
スポンサーリンク
スポンサーリンク
  1. この記事で解決できる悩み
  2. この記事を読むと…
  3. FileSystemObjectとは?3分で基本を理解
    1. FileSystemObjectの役割
    2. Dir関数との比較
    3. FileSystemObjectでできること
  4. FileSystemObjectの作成方法【参照設定 vs CreateObject】
    1. 2つの作成方法
    2. 方法1: 参照設定を使う(早期バインディング)
    3. 方法2: CreateObjectを使う(遅延バインディング)
    4. 推奨アプローチ
  5. ファイル操作の基本【存在確認・コピー・移動・削除】
    1. 主要メソッド一覧
    2. 実例1: ファイルの存在確認
    3. 実例2: ファイルのコピー
    4. 実例3: ファイルの移動
    5. 実例4: ファイルの削除
    6. 実例5: ファイル名・拡張子の取得
  6. フォルダ操作の基本【作成・削除・一覧取得】
    1. 主要メソッド一覧
    2. 実例6: フォルダの作成
    3. 実例7: フォルダ内のファイル一覧取得
    4. 実例8: サブフォルダ一覧取得
    5. 実例9: フォルダの削除
  7. サブフォルダを含む再帰処理【完全版】
    1. 再帰処理とは?
    2. 実例10: サブフォルダを含む全ファイル一覧取得
    3. 実例11: 特定の拡張子のファイルのみ取得(再帰)
    4. 実例12: フォルダサイズを計算(再帰)
  8. TextStreamでテキストファイル操作
    1. TextStreamとは?
    2. 実例13: テキストファイルの作成と書き込み
    3. 実例14: テキストファイルの読み込み(全行)
    4. 実例15: テキストファイルの読み込み(1行ずつ)
    5. 実例16: テキストファイルへの追記
    6. OpenTextFileのモード
  9. File・Folderオブジェクトのプロパティ活用
    1. Fileオブジェクトの主要プロパティ
    2. 実例17: ファイル情報の詳細表示
    3. 実例18: 更新日時でファイルをフィルタリング
  10. 実務で使えるテンプレート5選
    1. テンプレート1: 古いファイルの自動削除
    2. テンプレート2: 日付別フォルダにファイルを整理
    3. テンプレート3: バックアップ自動作成
    4. テンプレート4: CSVファイルの一括処理
    5. テンプレート5: エラーログ出力システム
  11. よくある質問(FAQ)7問
    1. Q1. FileSystemObjectとDir関数はどちらを使うべき?
    2. Q2. FileSystemObjectでファイルが削除できない?
    3. Q3. サブフォルダを含めてフォルダを削除できる?
    4. Q4. FileSystemObjectでUTF-8ファイルは読める?
    5. Q5. ファイルサイズが大きいと処理が遅い?
    6. Q6. ネットワークドライブのファイルも操作できる?
    7. Q7. FileSystemObjectで実行中のファイルを取得できる?
  12. まとめ
    1. この記事で学んだこと

この記事で解決できる悩み

✅ FileSystemObjectの使い方が分からない
✅ ファイルのコピー・移動・削除を自動化したい
✅ フォルダ内のファイル一覧を取得したい
✅ サブフォルダを含めた再帰処理がしたい
✅ テキストファイルの読み書きを効率化したい
✅ 参照設定とCreateObjectの違いが分からない


この記事を読むと…

  • FileSystemObjectの基本から応用まで完璧に理解できる
  • 実例コード25個でファイル・フォルダ操作を習得
  • サブフォルダを含む再帰処理が実装できる
  • TextStreamでテキストファイル操作が自在にできる
  • 実務で使えるファイル管理テンプレートを取得できる

FileSystemObjectとは?3分で基本を理解

FileSystemObjectの役割

**FileSystemObject(FSO)**は、ファイルとフォルダを操作するための外部ライブラリです。

VBAの組み込み関数(Dir、Kill、MkDirなど)よりも機能が豊富で使いやすいのが特徴です。


Dir関数との比較

項目FileSystemObjectDir関数・VBA組み込み
ファイル存在確認fso.FileExists(path)Dir(path) <> ""
ファイルコピーfso.CopyFile src, dstFileCopy文(機能が少ない)
ファイル削除fso.DeleteFile(path)Kill文
フォルダ作成fso.CreateFolder(path)MkDir文
ファイル属性取得file.Size, .DateCreatedGetAttr関数
サブフォルダ列挙folder.SubFoldersDir再帰(複雑)
使いやすさ✅ 直感的・高機能❌ 機能が限定的

FileSystemObjectでできること

ファイル操作:

  • ファイルの存在確認
  • ファイルのコピー・移動・削除
  • ファイル名・拡張子の取得
  • ファイルサイズ・更新日時の取得
  • テキストファイルの読み書き

フォルダ操作:

  • フォルダの存在確認
  • フォルダの作成・削除・移動
  • フォルダ内のファイル一覧取得
  • サブフォルダの再帰処理

FileSystemObjectの作成方法【参照設定 vs CreateObject】

2つの作成方法

方法メリットデメリット
参照設定インテリセンスが効く・処理が速い環境依存・参照設定が必要
CreateObject環境非依存・配布が容易インテリセンスが効かない・やや遅い

方法1: 参照設定を使う(早期バインディング)

手順:

  1. VBEで「ツール」→「参照設定」
  2. 「Microsoft Scripting Runtime」にチェック
  3. OK
Sub EarlyBindingExample()
    '特定の型で宣言
    Dim fso As FileSystemObject
    Set fso = New FileSystemObject
    
    'インテリセンスが効く
    Debug.Print fso.FileExists("C:\test.txt")
    
    Set fso = Nothing
End Sub

方法2: CreateObjectを使う(遅延バインディング)

Sub LateBindingExample()
    'Object型で宣言
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '環境依存しない
    Debug.Print fso.FileExists("C:\test.txt")
    
    Set fso = Nothing
End Sub

推奨アプローチ

基本はCreateObjectを推奨します。

'これをテンプレートとして使う
Sub FSOTemplate()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '処理
    
    Set fso = Nothing
End Sub

ファイル操作の基本【存在確認・コピー・移動・削除】

主要メソッド一覧

メソッド説明戻り値
FileExistsファイルの存在確認Boolean
GetFileFileオブジェクト取得File
CopyFileファイルをコピー
MoveFileファイルを移動
DeleteFileファイルを削除
GetFileNameファイル名を取得String
GetBaseName拡張子なしファイル名String
GetExtensionName拡張子を取得String

実例1: ファイルの存在確認

Sub CheckFileExists()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim filePath As String
    filePath = "C:\data.xlsx"
    
    If fso.FileExists(filePath) Then
        Debug.Print "ファイルが存在します: " & filePath
    Else
        Debug.Print "ファイルが見つかりません: " & filePath
    End If
    
    Set fso = Nothing
End Sub

実例2: ファイルのコピー

Sub CopyFileExample()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    On Error GoTo ErrorHandler
    
    Dim sourceFile As String
    Dim destFile As String
    
    sourceFile = "C:\data.xlsx"
    destFile = "C:\Backup\data_backup.xlsx"
    
    'ソースファイルの存在確認
    If Not fso.FileExists(sourceFile) Then
        MsgBox "ソースファイルが見つかりません", vbCritical
        Exit Sub
    End If
    
    'ファイルをコピー(第3引数Trueで上書き)
    fso.CopyFile sourceFile, destFile, True
    
    MsgBox "ファイルをコピーしました" & vbCrLf & destFile, vbInformation
    
    Set fso = Nothing
    Exit Sub
    
ErrorHandler:
    MsgBox "コピー失敗: " & Err.Description, vbCritical
    Set fso = Nothing
End Sub

実例3: ファイルの移動

Sub MoveFileExample()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    On Error GoTo ErrorHandler
    
    Dim sourceFile As String
    Dim destFile As String
    
    sourceFile = "C:\temp\data.txt"
    destFile = "D:\Archive\data.txt"
    
    '移動先フォルダの存在確認
    Dim destFolder As String
    destFolder = fso.GetParentFolderName(destFile)
    
    If Not fso.FolderExists(destFolder) Then
        fso.CreateFolder destFolder
        Debug.Print "移動先フォルダを作成: " & destFolder
    End If
    
    'ファイルを移動
    fso.MoveFile sourceFile, destFile
    
    Debug.Print "ファイルを移動しました: " & destFile
    
    Set fso = Nothing
    Exit Sub
    
ErrorHandler:
    MsgBox "移動失敗: " & Err.Description, vbCritical
    Set fso = Nothing
End Sub

実例4: ファイルの削除

Sub DeleteFileExample()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    On Error GoTo ErrorHandler
    
    Dim filePath As String
    filePath = "C:\temp\old_data.txt"
    
    'ファイルの存在確認
    If fso.FileExists(filePath) Then
        '削除前に確認
        Dim response As VbMsgBoxResult
        response = MsgBox("このファイルを削除しますか?" & vbCrLf & filePath, _
                          vbYesNo + vbQuestion)
        
        If response = vbYes Then
            'ファイルを削除(第2引数Trueで読み取り専用も削除)
            fso.DeleteFile filePath, True
            MsgBox "ファイルを削除しました", vbInformation
        End If
    Else
        MsgBox "ファイルが見つかりません", vbExclamation
    End If
    
    Set fso = Nothing
    Exit Sub
    
ErrorHandler:
    MsgBox "削除失敗: " & Err.Description, vbCritical
    Set fso = Nothing
End Sub

実例5: ファイル名・拡張子の取得

Sub GetFileNameParts()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim fullPath As String
    fullPath = "C:\Documents\Report_2026.xlsx"
    
    '各種情報を取得
    Debug.Print "完全パス: " & fullPath
    Debug.Print "ファイル名: " & fso.GetFileName(fullPath)        '→ Report_2026.xlsx
    Debug.Print "拡張子なし: " & fso.GetBaseName(fullPath)        '→ Report_2026
    Debug.Print "拡張子: " & fso.GetExtensionName(fullPath)       '→ xlsx
    Debug.Print "親フォルダ: " & fso.GetParentFolderName(fullPath) '→ C:\Documents
    
    Set fso = Nothing
End Sub

フォルダ操作の基本【作成・削除・一覧取得】

主要メソッド一覧

メソッド説明戻り値
FolderExistsフォルダの存在確認Boolean
GetFolderFolderオブジェクト取得Folder
CreateFolderフォルダを作成Folder
DeleteFolderフォルダを削除
CopyFolderフォルダをコピー
MoveFolderフォルダを移動

実例6: フォルダの作成

Sub CreateFolderExample()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim folderPath As String
    folderPath = "C:\Reports\2026\January"
    
    'フォルダの存在確認
    If Not fso.FolderExists(folderPath) Then
        '親フォルダがない場合も自動作成
        Dim parentFolder As String
        parentFolder = fso.GetParentFolderName(folderPath)
        
        If Not fso.FolderExists(parentFolder) Then
            fso.CreateFolder parentFolder
            Debug.Print "親フォルダを作成: " & parentFolder
        End If
        
        fso.CreateFolder folderPath
        Debug.Print "フォルダを作成: " & folderPath
    Else
        Debug.Print "フォルダは既に存在します"
    End If
    
    Set fso = Nothing
End Sub

実例7: フォルダ内のファイル一覧取得

Sub ListFilesInFolder()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim folderPath As String
    folderPath = "C:\Reports"
    
    'フォルダの存在確認
    If Not fso.FolderExists(folderPath) Then
        MsgBox "フォルダが見つかりません: " & folderPath, vbCritical
        Exit Sub
    End If
    
    'Folderオブジェクト取得
    Dim folder As Object
    Set folder = fso.GetFolder(folderPath)
    
    'ファイル一覧を取得
    Debug.Print "=== ファイル一覧: " & folderPath & " ==="
    
    Dim file As Object
    For Each file In folder.Files
        Debug.Print "ファイル名: " & file.Name
        Debug.Print "  サイズ: " & Format(file.Size, "#,##0") & " bytes"
        Debug.Print "  作成日: " & file.DateCreated
        Debug.Print "  更新日: " & file.DateLastModified
        Debug.Print "  拡張子: " & fso.GetExtensionName(file.Name)
        Debug.Print "---"
    Next file
    
    Debug.Print "合計ファイル数: " & folder.Files.Count
    
    Set file = Nothing
    Set folder = Nothing
    Set fso = Nothing
End Sub

実例8: サブフォルダ一覧取得

Sub ListSubFolders()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim folderPath As String
    folderPath = "C:\Projects"
    
    If Not fso.FolderExists(folderPath) Then
        MsgBox "フォルダが見つかりません", vbCritical
        Exit Sub
    End If
    
    'Folderオブジェクト取得
    Dim folder As Object
    Set folder = fso.GetFolder(folderPath)
    
    'サブフォルダ一覧を取得
    Debug.Print "=== サブフォルダ一覧: " & folderPath & " ==="
    
    Dim subFolder As Object
    For Each subFolder In folder.SubFolders
        Debug.Print "フォルダ名: " & subFolder.Name
        Debug.Print "  パス: " & subFolder.Path
        Debug.Print "  作成日: " & subFolder.DateCreated
        Debug.Print "  サブフォルダ数: " & subFolder.SubFolders.Count
        Debug.Print "  ファイル数: " & subFolder.Files.Count
        Debug.Print "---"
    Next subFolder
    
    Debug.Print "合計サブフォルダ数: " & folder.SubFolders.Count
    
    Set subFolder = Nothing
    Set folder = Nothing
    Set fso = Nothing
End Sub

実例9: フォルダの削除

Sub DeleteFolderExample()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    On Error GoTo ErrorHandler
    
    Dim folderPath As String
    folderPath = "C:\temp\old_project"
    
    If fso.FolderExists(folderPath) Then
        '削除前に確認
        Dim response As VbMsgBoxResult
        response = MsgBox("このフォルダを削除しますか?" & vbCrLf & _
                          folderPath & vbCrLf & vbCrLf & _
                          "※中のファイルも全て削除されます", _
                          vbYesNo + vbExclamation)
        
        If response = vbYes Then
            'フォルダを削除(第2引数Trueで読み取り専用も削除)
            fso.DeleteFolder folderPath, True
            MsgBox "フォルダを削除しました", vbInformation
        End If
    Else
        MsgBox "フォルダが見つかりません", vbExclamation
    End If
    
    Set fso = Nothing
    Exit Sub
    
ErrorHandler:
    MsgBox "削除失敗: " & Err.Description, vbCritical
    Set fso = Nothing
End Sub

サブフォルダを含む再帰処理【完全版】

再帰処理とは?

再帰処理とは、関数が自分自身を呼び出す処理です。

サブフォルダの中にさらにサブフォルダがある場合、再帰的に全フォルダを探索できます。


実例10: サブフォルダを含む全ファイル一覧取得

Sub ListAllFilesRecursive()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim rootPath As String
    rootPath = "C:\Projects"
    
    If Not fso.FolderExists(rootPath) Then
        MsgBox "フォルダが見つかりません", vbCritical
        Exit Sub
    End If
    
    Debug.Print "=== サブフォルダを含む全ファイル一覧 ==="
    
    '再帰処理を開始
    Call ProcessFolderRecursive(fso, rootPath)
    
    Set fso = Nothing
End Sub

'再帰処理用のサブプロシージャ
Sub ProcessFolderRecursive(fso As Object, folderPath As String)
    Dim folder As Object
    Set folder = fso.GetFolder(folderPath)
    
    '現在のフォルダ内のファイルを処理
    Dim file As Object
    For Each file In folder.Files
        Debug.Print file.Path
    Next file
    
    'サブフォルダを再帰的に処理
    Dim subFolder As Object
    For Each subFolder In folder.SubFolders
        Call ProcessFolderRecursive(fso, subFolder.Path)  '← 自分自身を呼び出す
    Next subFolder
    
    Set file = Nothing
    Set subFolder = Nothing
    Set folder = Nothing
End Sub

実例11: 特定の拡張子のファイルのみ取得(再帰)

Sub FindExcelFilesRecursive()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim rootPath As String
    rootPath = "C:\Documents"
    
    Dim targetExtension As String
    targetExtension = "xlsx"
    
    Debug.Print "=== .xlsx ファイル検索結果 ==="
    
    '再帰処理
    Call FindFilesByExtension(fso, rootPath, targetExtension)
    
    Set fso = Nothing
End Sub

Sub FindFilesByExtension(fso As Object, folderPath As String, extension As String)
    Dim folder As Object
    Set folder = fso.GetFolder(folderPath)
    
    '現在のフォルダ内のファイルをチェック
    Dim file As Object
    For Each file In folder.Files
        If LCase(fso.GetExtensionName(file.Name)) = LCase(extension) Then
            Debug.Print file.Path
        End If
    Next file
    
    'サブフォルダを再帰的に処理
    Dim subFolder As Object
    For Each subFolder In folder.SubFolders
        Call FindFilesByExtension(fso, subFolder.Path, extension)
    Next subFolder
    
    Set file = Nothing
    Set subFolder = Nothing
    Set folder = Nothing
End Sub

実例12: フォルダサイズを計算(再帰)

Function GetFolderSizeRecursive(fso As Object, folderPath As String) As Double
    Dim folder As Object
    Set folder = fso.GetFolder(folderPath)
    
    Dim totalSize As Double
    totalSize = 0
    
    '現在のフォルダ内のファイルサイズを合計
    Dim file As Object
    For Each file In folder.Files
        totalSize = totalSize + file.Size
    Next file
    
    'サブフォルダのサイズを再帰的に合計
    Dim subFolder As Object
    For Each subFolder In folder.SubFolders
        totalSize = totalSize + GetFolderSizeRecursive(fso, subFolder.Path)
    Next subFolder
    
    GetFolderSizeRecursive = totalSize
    
    Set file = Nothing
    Set subFolder = Nothing
    Set folder = Nothing
End Function

'使用例
Sub ShowFolderSize()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim folderPath As String
    folderPath = "C:\Projects"
    
    Dim totalSize As Double
    totalSize = GetFolderSizeRecursive(fso, folderPath)
    
    Debug.Print "フォルダサイズ: " & Format(totalSize / 1024 / 1024, "#,##0.00") & " MB"
    
    Set fso = Nothing
End Sub

TextStreamでテキストファイル操作

TextStreamとは?

TextStreamは、テキストファイルの読み書きを行うオブジェクトです。


実例13: テキストファイルの作成と書き込み

Sub CreateTextFile()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim filePath As String
    filePath = "C:\Logs\log_" & Format(Now, "yyyymmdd") & ".txt"
    
    'TextStreamオブジェクトを作成(第2引数Trueで上書き)
    Dim txtStream As Object
    Set txtStream = fso.CreateTextFile(filePath, True)
    
    '書き込み
    txtStream.WriteLine "=== ログ開始 ==="
    txtStream.WriteLine "日時: " & Now
    txtStream.WriteLine "処理1を実行しました"
    txtStream.WriteLine "処理2を実行しました"
    txtStream.WriteLine "=== ログ終了 ==="
    
    '閉じる
    txtStream.Close
    
    Debug.Print "ログファイルを作成: " & filePath
    
    Set txtStream = Nothing
    Set fso = Nothing
End Sub

実例14: テキストファイルの読み込み(全行)

Sub ReadTextFileAll()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim filePath As String
    filePath = "C:\Logs\log.txt"
    
    If Not fso.FileExists(filePath) Then
        MsgBox "ファイルが見つかりません", vbCritical
        Exit Sub
    End If
    
    'TextStreamを開く(1=読み取りモード)
    Dim txtStream As Object
    Set txtStream = fso.OpenTextFile(filePath, 1)
    
    '全行を一度に読み込み
    Dim allText As String
    allText = txtStream.ReadAll
    
    txtStream.Close
    
    '結果を表示
    Debug.Print "=== ファイル内容 ==="
    Debug.Print allText
    
    Set txtStream = Nothing
    Set fso = Nothing
End Sub

実例15: テキストファイルの読み込み(1行ずつ)

Sub ReadTextFileByLine()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim filePath As String
    filePath = "C:\Data\config.txt"
    
    If Not fso.FileExists(filePath) Then
        MsgBox "ファイルが見つかりません", vbCritical
        Exit Sub
    End If
    
    'TextStreamを開く
    Dim txtStream As Object
    Set txtStream = fso.OpenTextFile(filePath, 1)
    
    Debug.Print "=== 1行ずつ読み込み ==="
    
    Dim lineNumber As Long
    lineNumber = 0
    
    '終端まで繰り返し
    Do Until txtStream.AtEndOfStream
        lineNumber = lineNumber + 1
        Dim line As String
        line = txtStream.ReadLine
        Debug.Print "行" & lineNumber & ": " & line
    Loop
    
    txtStream.Close
    
    Debug.Print "合計行数: " & lineNumber
    
    Set txtStream = Nothing
    Set fso = Nothing
End Sub

実例16: テキストファイルへの追記

Sub AppendToTextFile()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim filePath As String
    filePath = "C:\Logs\application.log"
    
    'TextStreamを開く(8=追記モード、存在しない場合は作成)
    Dim txtStream As Object
    Set txtStream = fso.OpenTextFile(filePath, 8, True)
    
    '追記
    txtStream.WriteLine Now & " - 処理を開始しました"
    txtStream.WriteLine Now & " - データを更新しました"
    txtStream.WriteLine Now & " - 処理を完了しました"
    
    txtStream.Close
    
    Debug.Print "ログを追記しました: " & filePath
    
    Set txtStream = Nothing
    Set fso = Nothing
End Sub

OpenTextFileのモード

モード説明
ForReading1読み取り専用
ForWriting2書き込み(上書き)
ForAppending8追記

File・Folderオブジェクトのプロパティ活用

Fileオブジェクトの主要プロパティ

プロパティ説明
Nameファイル名"data.xlsx"
Path完全パス"C:\Documents\data.xlsx"
Sizeファイルサイズ(bytes)1048576
Typeファイルの種類"Microsoft Excel ワークシート"
DateCreated作成日時#2026/02/11 10:00:00#
DateLastModified更新日時#2026/02/11 15:30:00#
DateLastAccessed最終アクセス日時#2026/02/11 16:00:00#
Attributesファイル属性32(通常ファイル)

実例17: ファイル情報の詳細表示

Sub ShowFileDetails()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim filePath As String
    filePath = "C:\Reports\sales_2026.xlsx"
    
    If Not fso.FileExists(filePath) Then
        MsgBox "ファイルが見つかりません", vbCritical
        Exit Sub
    End If
    
    'Fileオブジェクト取得
    Dim file As Object
    Set file = fso.GetFile(filePath)
    
    '詳細情報を表示
    Debug.Print "=== ファイル詳細情報 ==="
    Debug.Print "ファイル名: " & file.Name
    Debug.Print "完全パス: " & file.Path
    Debug.Print "サイズ: " & Format(file.Size / 1024, "#,##0.00") & " KB"
    Debug.Print "種類: " & file.Type
    Debug.Print "作成日時: " & file.DateCreated
    Debug.Print "更新日時: " & file.DateLastModified
    Debug.Print "アクセス日時: " & file.DateLastAccessed
    Debug.Print "親フォルダ: " & file.ParentFolder.Path
    Debug.Print "拡張子: " & fso.GetExtensionName(file.Name)
    
    '属性情報
    Debug.Print "読み取り専用: " & CBool(file.Attributes And 1)
    Debug.Print "隠しファイル: " & CBool(file.Attributes And 2)
    Debug.Print "システムファイル: " & CBool(file.Attributes And 4)
    Debug.Print "アーカイブ: " & CBool(file.Attributes And 32)
    
    Set file = Nothing
    Set fso = Nothing
End Sub

実例18: 更新日時でファイルをフィルタリング

Sub FilterFilesByDate()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim folderPath As String
    folderPath = "C:\Reports"
    
    '7日以内に更新されたファイルを抽出
    Dim cutoffDate As Date
    cutoffDate = DateAdd("d", -7, Now)
    
    Debug.Print "=== 7日以内に更新されたファイル ==="
    Debug.Print "基準日時: " & cutoffDate
    Debug.Print "---"
    
    Dim folder As Object
    Set folder = fso.GetFolder(folderPath)
    
    Dim file As Object
    For Each file In folder.Files
        If file.DateLastModified >= cutoffDate Then
            Debug.Print "ファイル名: " & file.Name
            Debug.Print "  更新日時: " & file.DateLastModified
            Debug.Print "  サイズ: " & Format(file.Size / 1024, "#,##0.00") & " KB"
            Debug.Print "---"
        End If
    Next file
    
    Set file = Nothing
    Set folder = Nothing
    Set fso = Nothing
End Sub

実務で使えるテンプレート5選

テンプレート1: 古いファイルの自動削除

Sub DeleteOldFiles()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim folderPath As String
    folderPath = "C:\temp"
    
    '30日以上前のファイルを削除
    Dim cutoffDate As Date
    cutoffDate = DateAdd("d", -30, Now)
    
    Dim folder As Object
    Set folder = fso.GetFolder(folderPath)
    
    Dim file As Object
    Dim deleteCount As Long
    deleteCount = 0
    
    For Each file In folder.Files
        If file.DateLastModified < cutoffDate Then
            Debug.Print "削除: " & file.Name & " (" & file.DateLastModified & ")"
            file.Delete
            deleteCount = deleteCount + 1
        End If
    Next file
    
    MsgBox "古いファイルを" & deleteCount & "個削除しました", vbInformation
    
    Set file = Nothing
    Set folder = Nothing
    Set fso = Nothing
End Sub

テンプレート2: 日付別フォルダにファイルを整理

Sub OrganizeFilesByDate()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim sourceFolder As String
    Dim destRootFolder As String
    
    sourceFolder = "C:\Downloads"
    destRootFolder = "C:\Organized"
    
    Dim folder As Object
    Set folder = fso.GetFolder(sourceFolder)
    
    Dim file As Object
    For Each file In folder.Files
        '更新日付からフォルダ名を生成
        Dim dateFolder As String
        dateFolder = destRootFolder & "\" & Format(file.DateLastModified, "yyyy-mm")
        
        'フォルダが存在しない場合は作成
        If Not fso.FolderExists(dateFolder) Then
            fso.CreateFolder dateFolder
            Debug.Print "フォルダ作成: " & dateFolder
        End If
        
        'ファイルを移動
        Dim destPath As String
        destPath = dateFolder & "\" & file.Name
        file.Move destPath
        Debug.Print "移動: " & file.Name & " → " & dateFolder
    Next file
    
    MsgBox "ファイルの整理が完了しました", vbInformation
    
    Set file = Nothing
    Set folder = Nothing
    Set fso = Nothing
End Sub

テンプレート3: バックアップ自動作成

Sub AutoBackup()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    On Error GoTo ErrorHandler
    
    Dim sourceFile As String
    Dim backupFolder As String
    
    sourceFile = ThisWorkbook.FullName
    backupFolder = "C:\Backup\" & Format(Now, "yyyy-mm")
    
    'バックアップフォルダを作成
    If Not fso.FolderExists(backupFolder) Then
        fso.CreateFolder backupFolder
    End If
    
    'バックアップファイル名を生成
    Dim backupFile As String
    backupFile = backupFolder & "\" & _
                 fso.GetBaseName(sourceFile) & "_" & _
                 Format(Now, "yyyymmdd_hhnnss") & "." & _
                 fso.GetExtensionName(sourceFile)
    
    'ファイルをコピー
    fso.CopyFile sourceFile, backupFile
    
    MsgBox "バックアップを作成しました" & vbCrLf & backupFile, vbInformation
    
    Set fso = Nothing
    Exit Sub
    
ErrorHandler:
    MsgBox "バックアップ失敗: " & Err.Description, vbCritical
    Set fso = Nothing
End Sub

テンプレート4: CSVファイルの一括処理

Sub ProcessAllCSVFiles()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Dim folderPath As String
    folderPath = "C:\CSVData"
    
    Dim folder As Object
    Set folder = fso.GetFolder(folderPath)
    
    Dim file As Object
    Dim processCount As Long
    processCount = 0
    
    For Each file In folder.Files
        'CSVファイルのみ処理
        If LCase(fso.GetExtensionName(file.Name)) = "csv" Then
            Debug.Print "処理中: " & file.Name
            
            'ここに各CSVファイルの処理を記述
            Call ProcessSingleCSV(file.Path)
            
            processCount = processCount + 1
        End If
    Next file
    
    MsgBox "CSVファイルを" & processCount & "個処理しました", vbInformation
    
    Set file = Nothing
    Set folder = Nothing
    Set fso = Nothing
End Sub

Sub ProcessSingleCSV(filePath As String)
    'ここに個別のCSV処理を記述
    Debug.Print "  処理実行: " & filePath
End Sub

テンプレート5: エラーログ出力システム

'モジュールレベル変数
Private Const LOG_FOLDER As String = "C:\Logs"
Private Const LOG_FILE_PREFIX As String = "error_"

Sub WriteErrorLog(procName As String, errNumber As Long, errDescription As String)
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    On Error Resume Next
    
    'ログフォルダ作成
    If Not fso.FolderExists(LOG_FOLDER) Then
        fso.CreateFolder LOG_FOLDER
    End If
    
    'ログファイル名(日付別)
    Dim logFile As String
    logFile = LOG_FOLDER & "\" & LOG_FILE_PREFIX & Format(Now, "yyyymmdd") & ".txt"
    
    'ログを追記
    Dim txtStream As Object
    Set txtStream = fso.OpenTextFile(logFile, 8, True)
    
    txtStream.WriteLine String(50, "=")
    txtStream.WriteLine "エラー発生日時: " & Now
    txtStream.WriteLine "プロシージャ名: " & procName
    txtStream.WriteLine "エラー番号: " & errNumber
    txtStream.WriteLine "エラー内容: " & errDescription
    txtStream.WriteLine String(50, "=")
    txtStream.WriteLine ""
    
    txtStream.Close
    
    Set txtStream = Nothing
    Set fso = Nothing
    On Error GoTo 0
End Sub

'使用例
Sub TestWithErrorLog()
    On Error GoTo ErrorHandler
    
    '何らかの処理
    Err.Raise 1001, , "テストエラー"
    
    Exit Sub
    
ErrorHandler:
    Call WriteErrorLog("TestWithErrorLog", Err.Number, Err.Description)
    MsgBox "エラーが発生しました。ログを確認してください。", vbCritical
End Sub

よくある質問(FAQ)7問

Q1. FileSystemObjectとDir関数はどちらを使うべき?

A. 基本的にFileSystemObjectを推奨します。

理由:

  • 機能が豊富(ファイル情報の取得、コピー、移動が簡単)
  • コードが読みやすい
  • サブフォルダの処理が容易

Dir関数を使う場面:

  • 軽量な処理のみ(単純な存在確認)
  • 外部ライブラリを使いたくない場合

Q2. FileSystemObjectでファイルが削除できない?

A. 以下を確認してください。

  1. ファイルが開いている: 他のプログラムで使用中
  2. 読み取り専用属性: DeleteFileの第2引数をTrue
  3. 権限不足: 管理者権限で実行
'読み取り専用も削除
fso.DeleteFile filePath, True

Q3. サブフォルダを含めてフォルダを削除できる?

A. はい、DeleteFolderは中のファイルも全て削除します。

'フォルダを削除(中のファイルも全て削除)
fso.DeleteFolder "C:\temp\old_data", True

注意: 取り返しがつかないので、必ず削除前に確認ダイアログを表示してください。


Q4. FileSystemObjectでUTF-8ファイルは読める?

A. ReadAllやReadLineではUTF-8が正しく読めません。

UTF-8ファイルを読む場合は、ADODB.Streamを使ってください。

'ADODB.Streamを使う
Dim stream As Object
Set stream = CreateObject("ADODB.Stream")

stream.Type = 2  'テキスト
stream.Charset = "UTF-8"
stream.Open
stream.LoadFromFile "C:\data.txt"

Dim text As String
text = stream.ReadText

stream.Close
Set stream = Nothing

Q5. ファイルサイズが大きいと処理が遅い?

A. TextStreamで大きなファイルを一度に読むと遅くなります。

対策:

  • ReadLineで1行ずつ処理
  • Read(文字数)で分割読み込み
'1行ずつ処理(メモリ効率が良い)
Do Until txtStream.AtEndOfStream
    Dim line As String
    line = txtStream.ReadLine
    '処理
Loop

Q6. ネットワークドライブのファイルも操作できる?

A. はい、UNCパス(\\server\share\...)も使えます。

'ネットワークパス
Dim networkPath As String
networkPath = "\\FileServer\SharedFolder\data.xlsx"

If fso.FileExists(networkPath) Then
    Debug.Print "ファイルが存在します"
End If

Q7. FileSystemObjectで実行中のファイルを取得できる?

A. ThisWorkbook.FullNameを使ってください。

Sub GetCurrentFile()
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    '実行中のExcelファイル
    Dim currentFile As Object
    Set currentFile = fso.GetFile(ThisWorkbook.FullName)
    
    Debug.Print "現在のファイル: " & currentFile.Name
    Debug.Print "サイズ: " & currentFile.Size & " bytes"
    
    Set currentFile = Nothing
    Set fso = Nothing
End Sub

まとめ

この記事で学んだこと

  • FileSystemObjectの基本的な使い方
  • ファイル・フォルダの作成・コピー・移動・削除
  • サブフォルダを含む再帰処理
  • TextStreamでテキストファイル操作
  • File・Folderオブジェクトのプロパティ活用
  • 実務で使えるテンプレート5選
スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました