はじめに
日々の業務でExcelファイルや関連資料を管理していると、「作業フォルダを丸ごとバックアップしたい」と感じることはありませんか? 手作業でのコピーは簡単ですが、毎回となると手間がかかり、ミスも発生しやすくなります。
そんな時、VBAの**FileSystemObject(FSO)**を活用すれば、フォルダの複製をボタン一つで自動化できます。
この記事では、VBAを使って指定したフォルダを丸ごとコピーし、バックアップを作成する具体的な方法を、コードの解説付きで丁寧にご紹介します。VBA初心者の方でも分かりやすいように説明しますので、ぜひ最後までご覧ください。
FileSystemObject(FSO)とは?
FileSystemObject(FSO)は、VBAでファイルやフォルダを操作するための機能です。FSOを使うと、VBAから以下のような処理を簡単に行うことができます。
- フォルダやファイルの作成、削除、コピー、移動
- フォルダやファイルの存在確認
- ファイル情報の取得(名前、サイズ、更新日時など)
手作業で行っていたファイル整理をプログラムで自動化できるため、業務効率を大幅に向上させることが可能です。
フォルダを丸ごとコピーするVBAサンプルコード
ここでは、Excelファイルと同じ階層にある「作業データ」というフォルダを、「作業データ_Backup_(実行した日付)」という名前でコピーする処理を作成します。
完成コード
Sub CopyFolderWithTimestamp()
'== 変数を定義します ==
Dim objFSO As Object
Dim sourceFolderPath As String
Dim destinationFolderPath As String
'== FileSystemObjectを生成します ==
Set objFSO = CreateObject("Scripting.FileSystemObject")
'== コピー元とコピー先のパスを設定します ==
' コピー元のフォルダパス(このExcelファイルがある場所の「作業データ」フォルダ)
sourceFolderPath = ThisWorkbook.Path & "¥作業データ"
' コピー先のフォルダパス(元のフォルダ名に"_Backup_yyyymmdd"を追加)
destinationFolderPath = sourceFolderPath & "_Backup_" & Format(Date, "yyyymmdd")
'== フォルダが存在するか確認してからコピーを実行します ==
If objFSO.FolderExists(sourceFolderPath) = False Then
MsgBox "コピー元のフォルダが見つかりません。" & vbCrLf & sourceFolderPath, vbExclamation
Exit Sub
End If
If objFSO.FolderExists(destinationFolderPath) Then
MsgBox "既に本日のバックアップフォルダが存在します。" & vbCrLf & destinationFolderPath, vbInformation
Else
'== フォルダをコピーします ==
objFSO.CopyFolder sourceFolderPath, destinationFolderPath
MsgBox "バックアップフォルダを作成しました。" & vbCrLf & destinationFolderPath, vbInformation
End If
'== オブジェクトを解放します ==
Set objFSO = Nothing
End Sub
コードの解説
上記のコードがどのような処理を行っているのか、一つずつ詳しく見ていきましょう。
Dim objFSO As Object
FileSystemObjectを格納するための変数objFSO
を宣言しています。Dim sourceFolderPath As String, destinationFolderPath As String
コピー元とコピー先のフォルダパスを格納するための文字列型の変数sourceFolderPath
とdestinationFolderPath
を宣言しています。Set objFSO = CreateObject("Scripting.FileSystemObject")
CreateObject
関数を使ってFileSystemObjectのインスタンスを生成し、変数objFSO
にセットしています。これにより、FSOの機能が使えるようになります。sourceFolderPath = ThisWorkbook.Path & "¥作業データ"
コピー元のフォルダパスを指定しています。ThisWorkbook.Path
: このVBAコードが書かれているExcelファイルが保存されている場所のパスを取得します。& "¥作業データ"
: 取得したパスに、対象となるフォルダ名「作業データ」を連結しています。
destinationFolderPath = sourceFolderPath & "_Backup_" & Format(Date, "yyyymmdd")
コピー先のフォルダパスを生成しています。sourceFolderPath
: 「作業データ」フォルダのパスです。& "_Backup_"
: バックアップフォルダであることを示す文字列です。& Format(Date, "yyyymmdd")
:Date
で今日の日付を取得し、Format
関数で「20250814」のような “年4桁月2桁日2桁” の形式に変換しています。これにより、いつのバックアップかが一目で分かります。
If objFSO.FolderExists(...) Then ... Else ... End If
FolderExists
メソッドを使って、コピー元やコピー先のフォルダが既に存在するかどうかを確認しています。これにより、「コピー元のフォルダが存在しない」といったエラーや、「誤って上書きしてしまう」といった事故を防ぐことができます。objFSO.CopyFolder sourceFolderPath, destinationFolderPath
この行が、実際にフォルダをコピーする命令です。- 第1引数 (
sourceFolderPath
): コピー元のフォルダパスを指定します。 - 第2引数 (
destinationFolderPath
): コピー先のフォルダパスを指定します。 - (オプション)第3引数:
True
を指定すると、コピー先に同名フォルダが存在する場合に上書きします。今回は事前の存在チェックで処理を分けているため、指定は省略しています。
- 第1引数 (
Set objFSO = Nothing
最後に、使い終わったオブジェクトを解放しています。これはVBAの作法として覚えておくと良いでしょう。
まとめ
今回は、VBAのFileSystemObject(FSO)機能を使って、フォルダを丸ごと複製する方法をご紹介しました。
日付を使ってバックアップフォルダ名を生成することで、日々の履歴管理も簡単になります。このコードを応用すれば、定期的なバックアップ作業を完全に自動化することも夢ではありません。
ぜひ、ご自身の業務に合わせてカスタマイズし、作業の効率化にお役立てください。