この記事で解決できる悩み
✅ FileSystemObjectの使い方が分からない
✅ ファイルのコピー・移動・削除を自動化したい
✅ フォルダ内のファイル一覧を取得したい
✅ サブフォルダを含めた再帰処理がしたい
✅ テキストファイルの読み書きを効率化したい
✅ 参照設定とCreateObjectの違いが分からない
この記事を読むと…
- FileSystemObjectの基本から応用まで完璧に理解できる
- 実例コード25個でファイル・フォルダ操作を習得
- サブフォルダを含む再帰処理が実装できる
- TextStreamでテキストファイル操作が自在にできる
- 実務で使えるファイル管理テンプレートを取得できる
FileSystemObjectとは?3分で基本を理解
FileSystemObjectの役割
**FileSystemObject(FSO)**は、ファイルとフォルダを操作するための外部ライブラリです。
VBAの組み込み関数(Dir、Kill、MkDirなど)よりも機能が豊富で使いやすいのが特徴です。
Dir関数との比較
| 項目 | FileSystemObject | Dir関数・VBA組み込み |
|---|---|---|
| ファイル存在確認 | fso.FileExists(path) | Dir(path) <> "" |
| ファイルコピー | fso.CopyFile src, dst | FileCopy文(機能が少ない) |
| ファイル削除 | fso.DeleteFile(path) | Kill文 |
| フォルダ作成 | fso.CreateFolder(path) | MkDir文 |
| ファイル属性取得 | file.Size, .DateCreated | GetAttr関数 |
| サブフォルダ列挙 | folder.SubFolders | Dir再帰(複雑) |
| 使いやすさ | ✅ 直感的・高機能 | ❌ 機能が限定的 |
FileSystemObjectでできること
ファイル操作:
- ファイルの存在確認
- ファイルのコピー・移動・削除
- ファイル名・拡張子の取得
- ファイルサイズ・更新日時の取得
- テキストファイルの読み書き
フォルダ操作:
- フォルダの存在確認
- フォルダの作成・削除・移動
- フォルダ内のファイル一覧取得
- サブフォルダの再帰処理
FileSystemObjectの作成方法【参照設定 vs CreateObject】
2つの作成方法
| 方法 | メリット | デメリット |
|---|---|---|
| 参照設定 | インテリセンスが効く・処理が速い | 環境依存・参照設定が必要 |
| CreateObject | 環境非依存・配布が容易 | インテリセンスが効かない・やや遅い |
方法1: 参照設定を使う(早期バインディング)
手順:
- VBEで「ツール」→「参照設定」
- 「Microsoft Scripting Runtime」にチェック
- 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 |
| GetFile | Fileオブジェクト取得 | 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 |
| GetFolder | Folderオブジェクト取得 | 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のモード
| モード | 値 | 説明 |
|---|---|---|
| ForReading | 1 | 読み取り専用 |
| ForWriting | 2 | 書き込み(上書き) |
| ForAppending | 8 | 追記 |
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. 以下を確認してください。
- ファイルが開いている: 他のプログラムで使用中
- 読み取り専用属性:
DeleteFileの第2引数をTrueに - 権限不足: 管理者権限で実行
'読み取り専用も削除
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選

コメント