複数のブックを開いて作業するマクロの最後に、Excelアプリケーションそのものを終了させたい場合があります。しかし、編集された未保存のブックが一つでもあると、Excelはブックごとに「変更を保存しますか?」という確認メッセージを表示し、マクロがそこで停止してしまいます。
この記事では、ブックの.Saved
プロパティを利用して、この確認メッセージをすべて抑制し、開いているすべてのブックの変更を破棄してExcelを強制的に終了させるという、強力なテクニックを解説します。
核心となる .Saved プロパティ
このテクニックの鍵となるのが、Workbook
オブジェクトが持つ.Saved
というプロパティです。これは、ブックの「保存状態」を示すTrue
/False
のフラグです。
ブック.Saved = False
: ブックに変更が加えられ、まだ保存されていない状態。ブック.Saved = True
: ブックが保存された直後で、変更がない状態。
通常、このプロパティはExcelが自動で管理しますが、VBAではこの値を意図的に書き換えることが可能です。
VBAでブック.Saved = True
と設定すると、たとえそのブックに未保存の変更があったとしても、Excelに「このブックは既に保存済みで、変更はない」と錯覚させることができます。 これを利用して、Excel終了時の保存確認を回避します。
完成したVBAコード
以下が、ユーザーに最終確認を取った上で、すべてのブックの変更を破棄してExcelを終了するVBAコードです。
Sub ForceQuitWithoutSaving()
' 変数を宣言します
Dim userResponse As VbMsgBoxResult
Dim wb As Workbook
' --- 1. ユーザーに最終確認 ---
' 変更が破棄される危険な操作のため、確認を挟むのが安全です
userResponse = MsgBox("すべての変更を保存せずにExcelを完全に終了しますか?" & vbCrLf & _
"(この操作は元に戻せません)", _
vbOKCancel + vbExclamation, _
"終了確認")
' 「OK」が押された場合のみ処理を続行
If userResponse = vbOK Then
' --- 2. すべての開いているブックの「保存済み」フラグをTrueにする ---
For Each wb In Workbooks
' Excelに「このブックは変更がない」と認識させる(実際には保存しない)
wb.Saved = True
Next wb
' --- 3. Excelアプリケーションを終了 ---
Application.Quit
End If
End Sub
コードのポイント解説
① ユーザーへの確認 (MsgBox)
userResponse = MsgBox("...", vbOKCancel + vbExclamation, "終了確認")
未保存の変更をすべて破棄するのは、潜在的に危険な操作です。そのため、vbOKCancel
と警告アイコンvbExclamation
を指定したMsgBox
で、本当に実行して良いかをユーザーに確認するステップを入れています。これは、安全なマクロを設計する上で非常に重要です。
② 全ブックをループして .Saved = True に設定
For Each wb In Workbooks
wb.Saved = True
Next wb
For Each
ループを使い、現在開かれているすべてのブック(Workbooks
コレクション)に対して処理を行います。 ループの中でwb.Saved = True
を実行することで、すべてのブックが「保存済み」の状態であるとExcelに認識させます。このコードは実際にファイルを保存するわけではなく、あくまでExcel内部のフラグを変更するだけという点がポイントです。
③ Excelの終了 (Application.Quit)
Application.Quit
Application.Quit
は、Excelアプリケーション自体を終了させる命令です。通常であれば、この命令の際に未保存のブックがあれば確認メッセージが表示されますが、直前のステップですべてのブックの.Saved
フラグをTrue
にしているため、Excelは「確認の必要なし」と判断し、メッセージを表示することなく即座に終了します。
まとめ
Excelを問答無用で終了させる手順は、以下の通りです。
- (推奨)
MsgBox
で、変更が破棄されることをユーザーに警告し、同意を得る。 For Each
ループで、開いているすべてのブックを巡回する。- ループの中で、各ブックの**
.Saved
プロパティをTrue
に**書き換える。 - **
Application.Quit
**を実行する。
この方法は、一時的なブックを大量に開く処理の後始末など、特定のシナリオで非常に強力ですが、すべての未保存の変更が失われるという点を十分に理解し、慎重に利用してください。