皆さん、こんにちは!Excel VBA講師の〇〇です。この連載では、皆さんのExcel業務を劇的に効率化する、実用的なマクロの作り方をステップバイステップで解説していきます。第6回となる今回は、多くのビジネスシーンで必要とされる「ファイル操作」に焦点を当て、その基本から応用までを4回に分けてじっくりと学んでいきましょう。
### なぜファイル操作マクロが重要なのか?
Excelを使った業務では、データの集計や分析だけでなく、他のファイルとの連携が不可欠な場面が数多くあります。例えば、
* 定期的に更新される集計表を作成するために、複数のExcelファイルからデータを集めたい。
* 特定のフォルダにあるCSVファイルを一括で取り込み、整形したい。
* 処理済みのデータを別フォルダにバックアップしたい。
* 複数のExcelファイルをまとめてPDFに変換したい。
* 特定の条件を満たすファイルだけを検索・コピーしたい。
これらの作業を毎回手作業で行うのは、時間もかかりますし、ヒューマンエラーのリスクも高まります。ファイル操作のマクロを使いこなせば、これらの煩雑な作業を自動化し、大幅な時間短縮とミスの削減を実現できます。まさに、業務効率化の強力な武器となるのです。
### ファイル操作の基本:FileSystemObjectとは?
Excel VBAでファイルやフォルダを操作する際に、最も強力で便利なオブジェクトが `FileSystemObject` です。このオブジェクトを使うことで、ファイルの作成、コピー、移動、削除、フォルダの作成、検索など、多岐にわたるファイル操作をプログラムから実行できるようになります。
`FileSystemObject` を利用するには、まずVBAエディタの「ツール」メニューから「参照設定」を選択し、「Microsoft Scripting Runtime」にチェックを入れてOKをクリックする必要があります。

※実際には画像は表示されませんが、参照設定の手順をイメージしてください。
参照設定が完了したら、VBAコード内で `FileSystemObject` を宣言し、インスタンスを作成します。
Sub FileSystemObject_Example()
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ ここにファイル操作のコードを記述します
Set fso = Nothing ‘ オブジェクトの解放
End Sub
`CreateObject` 関数を使って `Scripting.FileSystemObject` を呼び出すことで、ファイル操作のための様々なメソッドやプロパティを持つオブジェクトが生成されます。
### よく使うFileSystemObjectのメソッドとプロパティ
`FileSystemObject` には、ファイル操作のための非常に多くのメソッドやプロパティがありますが、ここでは特に実務で頻繁に利用されるものをいくつかご紹介します。
#### 1. ファイルやフォルダの存在確認
* `fso.FileExists(filepath)`: 指定したパスにファイルが存在するかどうかを判定します。`True` または `False` を返します。
* `fso.FolderExists(folderpath)`: 指定したパスにフォルダが存在するかどうかを判定します。`True` または `False` を返します。
これらのメソッドは、ファイルやフォルダを操作する前に、その存在を確認するために非常に役立ちます。例えば、コピー先のフォルダが存在しない場合にエラーになるのを防ぐために、事前にチェックすることができます。
Sub CheckFileAndFolder()
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim targetFile As String
targetFile = “C:\Users\YourUser\Documents\sample.xlsx” ‘ 確認したいファイルのパス
Dim targetFolder As String
targetFolder = “C:\Users\YourUser\Documents\Backup” ‘ 確認したいフォルダのパス
If fso.FileExists(targetFile) Then
MsgBox targetFile & ” は存在します。”, vbInformation
Else
MsgBox targetFile & ” は存在しません。”, vbExclamation
End If
If fso.FolderExists(targetFolder) Then
MsgBox targetFolder & ” は存在します。”, vbInformation
Else
MsgBox targetFolder & ” は存在しません。”, vbExclamation
End If
Set fso = Nothing
End Sub
#### 2. ファイルのコピー、移動、削除
* `fso.CopyFile Source, Destination, Overwrite`: ファイルをコピーします。`Source` はコピー元のファイルパス、`Destination` はコピー先のパスです。`Overwrite` に `True` を指定すると、コピー先に同名ファイルが存在する場合に上書きします。
* `fso.MoveFile Source, Destination`: ファイルを移動します。`Source` は移動元のファイルパス、`Destination` は移動先のパスです。
* `fso.DeleteFile FilePath, Force`: ファイルを削除します。`FilePath` は削除したいファイルのパスです。`Force` に `True` を指定すると、読み取り専用ファイルなども強制的に削除します。
これらのメソッドは、バックアップ作業や、不要なファイルの整理などに活用できます。
Sub FileOperations()
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim sourceFilePath As String
sourceFilePath = “C:\Data\Report.xlsx” ‘ コピー元ファイル
Dim destinationFolder As String
destinationFolder = “C:\Backup\” ‘ コピー先フォルダ
Dim destinationFilePath As String
destinationFilePath = destinationFolder & “Report_” & Format(Date, “yyyymmdd”) & “.xlsx” ‘ 連番付きファイル名
‘ コピー先フォルダが存在しなければ作成する
If Not fso.FolderExists(destinationFolder) Then
fso.CreateFolder destinationFolder
MsgBox “フォルダを作成しました: ” & destinationFolder, vbInformation
End If
‘ ファイルをコピーする (上書きを許可)
If fso.FileExists(sourceFilePath) Then
fso.CopyFile sourceFilePath, destinationFilePath, True
MsgBox “ファイルをコピーしました: ” & destinationFilePath, vbInformation
Else
MsgBox sourceFilePath & ” が見つかりません。”, vbExclamation
Exit Sub
End If
‘ コピーしたファイルを削除する (例として)
‘ fso.DeleteFile destinationFilePath, False
‘ MsgBox “ファイルを削除しました: ” & destinationFilePath, vbInformation
Set fso = Nothing
End Sub
#### 3. フォルダの作成、削除
* `fso.CreateFolder Folderpath`: 指定したパスにフォルダを作成します。
* `fso.DeleteFolder Folderpath, Force`: 指定したフォルダとその中身をすべて削除します。`Force` に `True` を指定すると、読み取り専用ファイルなども強制的に削除します。
フォルダ操作は、データの整理や一時的な作業領域の確保に役立ちます。
Sub FolderOperations()
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim newFolderName As String
newFolderName = “C:\Temp\MyNewFolder\”
‘ フォルダを作成する
If Not fso.FolderExists(newFolderName) Then
fso.CreateFolder newFolderName
MsgBox “フォルダを作成しました: ” & newFolderName, vbInformation
Else
MsgBox “フォルダは既に存在します: ” & newFolderName, vbInformation
End If
‘ フォルダを削除する (例として)
‘ If fso.FolderExists(newFolderName) Then
‘ fso.DeleteFolder newFolderName, False
‘ MsgBox “フォルダを削除しました: ” & newFolderName, vbInformation
‘ End If
Set fso = Nothing
End Sub
### フォルダ内のファイルを操作する:GetFolderとFilesコレクション
特定のフォルダ内にあるファイルすべてに対して何らかの処理を行いたい場合、`FileSystemObject` の `GetFolder` メソッドでフォルダオブジェクトを取得し、その `Files` コレクションをループ処理するのが一般的です。
`Files` コレクションは、フォルダ内の各ファイルを表す `File` オブジェクトの集まりです。このコレクションを `For Each` ループで回すことで、フォルダ内のすべてのファイルにアクセスできます。
Sub ProcessFilesInFolder()
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim targetFolder As String
targetFolder = “C:\Reports\” ‘ 対象フォルダのパス
Dim folder As Object
Dim file As Object
‘ 対象フォルダが存在するか確認
If Not fso.FolderExists(targetFolder) Then
MsgBox “指定されたフォルダが見つかりません: ” & targetFolder, vbExclamation
Exit Sub
End If
‘ フォルダオブジェクトを取得
Set folder = fso.GetFolder(targetFolder)
‘ フォルダ内のファイルをループ処理
If folder.Files.Count > 0 Then
For Each file In folder.Files
‘ ここで各ファイルに対して処理を実行
‘ 例: ファイル名を表示する
Debug.Print “ファイル名: ” & file.Name
‘ 例: ファイルの最終更新日時を表示する
Debug.Print “最終更新日時: ” & file.DateLastModified
‘ 例: 特定の拡張子のファイルだけを処理する
‘ If LCase(fso.GetExtensionName(file.Name)) = “txt” Then
‘ MsgBox “テキストファイルを見つけました: ” & file.Name
‘ End If
‘ 例: ファイルを別のフォルダにコピーする
‘ fso.CopyFile file.Path, “C:\Archive\” & file.Name, True
Next file
Else
MsgBox “フォルダ内にファイルがありません。”, vbInformation
End If
Set folder = Nothing
Set fso = Nothing
End Sub
このコードでは、`Debug.Print` を使ってイミディエイトウィンドウにファイル名と最終更新日時を表示しています。コメントアウトされている部分を参考に、ファイル名や拡張子で条件分岐させたり、ファイルをコピーしたりと、様々な処理を記述できます。
### まとめと次回予告
今回は、Excel VBAでのファイル操作の基本となる `FileSystemObject` の使い方、そしてファイルやフォルダの存在確認、コピー、移動、削除、フォルダ作成といった基本的な操作について解説しました。さらに、フォルダ内のファイルをループ処理する方法もご紹介しました。
これらの基本的な操作をマスターすれば、単調なファイル整理作業や、複数のファイルにまたがるデータ集計作業などを自動化できる可能性が大きく広がります。
次回(第6回 2/4)では、さらに実践的なファイル操作として、「特定のファイルを開く・閉じる」「ファイル名を変更する」「ファイルの内容を読み書きする」といった、より高度なテクニックに挑戦していきます。
ぜひ、今回ご紹介したコードを実際に試してみて、ファイル操作の便利さを実感してみてください。ご質問や「こんなマクロを作りたい!」といったご要望がありましたら、お気軽にコメント欄で教えてくださいね。
それでは、次回もお楽しみに!
