【Excel VBA】開いているすべてのExcelブックを一括で上書き保存する方法

複数のExcelファイルを開いて同時に作業していると、最後に一つずつ保存を確認するのが面倒に感じることがあります。特に、新規作成しただけの未保存のブック(”Book1″など)が混じっていると、それぞれに保存場所を指定する必要があり、手間がかかります。

VBAを使えば、開いているすべてのブックをループ処理し、保存済みのブックは上書き保存、未保存のブックは指定したフォルダに自動で保存するという便利なマクロを作成できます。


目次

完成したVBAコード

以下が、マクロブック自身を除く、開いているすべてのブックを保存するVBAコードです。未保存のブックは、マクロブックと同じ階層に自動作成される「TempSave」フォルダ内に保存されます。

Sub SaveAllOpenWorkbooks()

    ' 変数を宣言します
    Dim wb As Workbook
    Dim tempFolderPath As String
    
    ' --- 1. 新規ブックの一時保存先フォルダを準備 ---
    ' このマクロブックと同じ場所に「TempSave」という名前のフォルダを用意
    tempFolderPath = ThisWorkbook.Path & "\TempSave\"
    ' Dir関数でフォルダの存在を確認し、なければMkDirで作成
    If Dir(tempFolderPath, vbDirectory) = "" Then
        MkDir tempFolderPath
    End If

    ' --- 2. 開いているすべてのブックをループ処理 ---
    For Each wb In Workbooks
    
        ' このマクロが書かれているブック自体は処理の対象外とする
        If wb.Name = ThisWorkbook.Name Then
            ' 何もせず、次のブックへ
            
        ' 保存履歴のあるブックの場合 (.Pathが空でない)
        ElseIf wb.Path <> "" Then
            wb.Save ' 通常の上書き保存を実行
            
        ' 新規作成された未保存のブックの場合 (.Pathが空)
        Else
            wb.SaveAs Filename:=tempFolderPath & wb.Name ' 一時フォルダに新規保存
            
        End If
        
    Next wb
    
    MsgBox "マクロブックを除く、すべての開いているブックを保存しました。"
    
End Sub

コードのポイント解説

① 一時保存用フォルダの作成 (MkDir)

tempFolderPath = ThisWorkbook.Path & "\TempSave\"
If Dir(tempFolderPath, vbDirectory) = "" Then
    MkDir tempFolderPath
End If

新規ブック(”Book1″など)は保存場所が未定のため、.Saveメソッドでは保存できません。そこで、一時的な保存先としてTempSaveというフォルダを用意しています。

Dir関数でフォルダの存在をチェックし、もし存在しなければMkDirステートメントで新しいフォルダを作成します。これにより、マクロがエラーで止まるのを防いでいます。

② Workbooksコレクションのループ

For Each wb In Workbooks

Workbooksは、現在Excelアプリケーションで開かれているすべてのブックの集まり(コレクション)です。For Eachループを使うことで、開いているブックを一つずつ順番に取り出し、変数wbに格納して処理を実行できます。

③ 保存済みか未保存かの判定 (.Path)

ElseIf wb.Path <> "" Then

このコードの核心部分です。Workbookオブジェクトの.Pathプロパティは、そのブックが保存されているフォルダのパスを返します。

  • 一度でも保存されたことがあるブック: .Pathはフォルダのパス(例: C:\Users\User\Documents)を返します。
  • 新規作成されてから一度も保存されていないブック: .Pathは空の文字列("")を返します。

この違いを利用して、ブックが保存済みか未保存かを判定し、処理を分岐させています。

④ .Save と .SaveAs の使い分け

判定結果に基づき、2つの異なる保存メソッドを使い分けています。

  • wb.Save: 保存済みのブックに対して、単純な上書き保存を行います。
  • wb.SaveAs: 未保存のブックに対して、ファイル名と場所を指定して新規保存を行います。

まとめ

開いている全ブックを賢く一括保存するロジックは、以下の通りです。

  1. For Eachループで、Workbooksコレクション内の全ブックを巡回する。
  2. ループの中で、各ブックの**.Pathプロパティが空かどうか**をチェックする。
  3. .Pathが空でなければ(保存済みなら)、**.Save**で上書き保存する。
  4. .Pathが空であれば(未保存なら)、**.SaveAs**で指定の場所に新規保存する。

このパターンを使えば、作業の終わりに複数のファイルを一つずつ保存する手間から解放され、業務の効率化に繋がります。

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

この記事を書いた人

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

目次