自動で保存して終了・保存せずに終了

中級VBA

はじめに

 Excelでは終了する際に「このファイルの変更内容を保存しますか?」のメッセージが出る事があります。
 常に変更を保存して終了したい場合は、ThisWorkbookBeforeCloseイベントで Saveメソッド(上書き保存)を実行します。
 また、常に変更を保存しないで終了したい場合は、SavedプロパティをTrueにします。

自動で保存して終了

 プログラムコードは、ThisWorkbookモジュールに記述します。

 ThisWorkbookモジュールを選択して上のプルダウンリストから、WorkbookBeforeCloseを選択するとイベントプロシージャが記述されます。

' ThisWorkbook モジュールに記述します。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Me.Save
End Sub

 下線の、Me.Save を記述すればOKです。Me はここでは、ThisWorkbook を指しています。
 ThisWorkbookSaveメソッドで上書き保存されます。
 ブックはメッセージを出さずに常に上書き保存されて終了します。

自動で保存せずに終了

 ブックを保存せずに終了する場合は、ThisWorkbookSaved プロパティTrue に設定してしまえば、ブックは保存したものとして判断され、そのまま(保存せずに)終了します。

' ThisWorkbook モジュールに記述します。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
     '変更を保存しない
     Me.Saved = True
End Sub

※ Saveは上書きするメソッド。Savedは保存状態を示すプロパティです。似ているので注意してください。

BeforeCloseイベントの使い方

 Workbook_BeforeCloseプロシージャは、ブックが閉じられる直前に実行されるイベントプロシージャです。
 引数の Cancel は、ブックを閉じる場合はFalse。閉じない場合は、Trueを指定します。
 初期値はFalseになります。

 もし、閉じるか閉じないか確認するメッセージを出す場合は、以下のようにします。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If MsgBox("ブックを閉じますか?", vbYesNo, "確認") = vbNo Then
        Cancel = True
    End If
End Sub

 ブックを閉じる際に、以下のようなメッセージボックスが出て、「いいえ」を選択するとブックは閉じなくなります。

ブックを保存しないで終了する事を確認する

 最後に、上記を組み合わせて、ブックが変更されている場合に変更せずに終了してよいか確認メッセージを出すプログラムを書いてみます。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    If Me.Saved = False Then
        If MsgBox("変更を保存せずに閉じますか?", vbYesNo, "確認") = vbNo Then
            Cancel = True
        Else
            '変更を保存しない
            Me.Saved = True
        End If
    Else
        'MsgBox "保存されていますので、そのまま終了します。"
    End If
    
End Sub

 このプログラムでは、変更が保存されていない場合、「変更を保存せずに閉じますか?」とメッセージボックスを出します。
 「いいえ」を押した場合は、終了をキャンセルします。
 このため、変更を保存したい場合はユーザーが終了前に「保存」を行わなければならなくなります。

まとめ

 ブックを閉じる時自動で上書き保存したり、変更を保存せずに終了させるプログラムは、ThisWorkbook モジュールで BeforeClose イベントに記述するだけで簡単に書く事ができました。
 
 終了の際に自動で上書き保存するプログラムは、保存し忘れる場合によく使われます。
 一方、変更を保存しないで終了するプログラムは一過性で内容を変更したくない場合などに良く使われます。

 尚、今回は触れませんでしたが、標準モジュールに書く、Auto_Closeというプロシージャもあります。
 Auto_Closeは、BeforeCloseと同じような動作をするのですが、以前のバージョンとの互換性を保つために残されているプロシージャなので説明は省略します。

タイトルとURLをコピーしました