【Excel VBA】すべてのブックの変更を保存せずにExcelを終了する方法

複数のブックを開いて作業するマクロの最後に、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を問答無用で終了させる手順は、以下の通りです。

  1. (推奨)MsgBoxで、変更が破棄されることをユーザーに警告し、同意を得る
  2. For Eachループで、開いているすべてのブックを巡回する。
  3. ループの中で、各ブックの**.SavedプロパティをTrueに**書き換える。
  4. **Application.Quit**を実行する。

この方法は、一時的なブックを大量に開く処理の後始末など、特定のシナリオで非常に強力ですが、すべての未保存の変更が失われるという点を十分に理解し、慎重に利用してください。

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

この記事を書いた人

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

目次