【VBA】FSOでフォルダを丸ごと複製する方法|バックアップ作成を自動化しよう

目次

はじめに

日々の業務で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

コードの解説

上記のコードがどのような処理を行っているのか、一つずつ詳しく見ていきましょう。

  1. Dim objFSO As Object FileSystemObjectを格納するための変数 objFSO を宣言しています。
  2. Dim sourceFolderPath As String, destinationFolderPath As String コピー元とコピー先のフォルダパスを格納するための文字列型の変数 sourceFolderPathdestinationFolderPath を宣言しています。
  3. Set objFSO = CreateObject("Scripting.FileSystemObject") CreateObject関数を使ってFileSystemObjectのインスタンスを生成し、変数 objFSO にセットしています。これにより、FSOの機能が使えるようになります。
  4. sourceFolderPath = ThisWorkbook.Path & "¥作業データ" コピー元のフォルダパスを指定しています。
    • ThisWorkbook.Path: このVBAコードが書かれているExcelファイルが保存されている場所のパスを取得します。
    • & "¥作業データ": 取得したパスに、対象となるフォルダ名「作業データ」を連結しています。
  5. destinationFolderPath = sourceFolderPath & "_Backup_" & Format(Date, "yyyymmdd") コピー先のフォルダパスを生成しています。
    • sourceFolderPath: 「作業データ」フォルダのパスです。
    • & "_Backup_": バックアップフォルダであることを示す文字列です。
    • & Format(Date, "yyyymmdd"): Dateで今日の日付を取得し、Format関数で「20250814」のような “年4桁月2桁日2桁” の形式に変換しています。これにより、いつのバックアップかが一目で分かります。
  6. If objFSO.FolderExists(...) Then ... Else ... End If FolderExistsメソッドを使って、コピー元やコピー先のフォルダが既に存在するかどうかを確認しています。これにより、「コピー元のフォルダが存在しない」といったエラーや、「誤って上書きしてしまう」といった事故を防ぐことができます。
  7. objFSO.CopyFolder sourceFolderPath, destinationFolderPath この行が、実際にフォルダをコピーする命令です。
    • 第1引数 (sourceFolderPath): コピー元のフォルダパスを指定します。
    • 第2引数 (destinationFolderPath): コピー先のフォルダパスを指定します。
    • (オプション)第3引数: True を指定すると、コピー先に同名フォルダが存在する場合に上書きします。今回は事前の存在チェックで処理を分けているため、指定は省略しています。
  8. Set objFSO = Nothing 最後に、使い終わったオブジェクトを解放しています。これはVBAの作法として覚えておくと良いでしょう。

まとめ

今回は、VBAのFileSystemObject(FSO)機能を使って、フォルダを丸ごと複製する方法をご紹介しました。

日付を使ってバックアップフォルダ名を生成することで、日々の履歴管理も簡単になります。このコードを応用すれば、定期的なバックアップ作業を完全に自動化することも夢ではありません。

ぜひ、ご自身の業務に合わせてカスタマイズし、作業の効率化にお役立てください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次