複数の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
: 未保存のブックに対して、ファイル名と場所を指定して新規保存を行います。
まとめ
開いている全ブックを賢く一括保存するロジックは、以下の通りです。
For Each
ループで、Workbooks
コレクション内の全ブックを巡回する。- ループの中で、各ブックの**
.Path
プロパティが空かどうか**をチェックする。 .Path
が空でなければ(保存済みなら)、**.Save
**で上書き保存する。.Path
が空であれば(未保存なら)、**.SaveAs
**で指定の場所に新規保存する。
このパターンを使えば、作業の終わりに複数のファイルを一つずつ保存する手間から解放され、業務の効率化に繋がります。