和風スパゲティのレシピ

日本語でコーディングするExcelVBA

ブックを保存せずに閉じる - Workbook.Close

ブックを保存せずに閉じるコードを解説します。

Closeメソッドの引数SaveChangesをFalseに指定する

大きく3種類の方法がありますが、まずは最も短く書ける方法がこちらです。

Workbooks("○○.xlsx").Close False

 
WorkbookオブジェクトのCloseメソッドは、
第1引数SaveChangesをFalseにすることで
「ブックを保存せずに閉じる」を実行できます。
 

Workbooks("○○.xlsx").Close SaveChanges:=False

丁寧に書くならばこちらのコードになりますが、
CloseメソッドはSaveChanges以外の引数をほぼ使いませんので、
引数の名前はあってもなくてもそんなに可読性が変わりません。

どちらで書くかはお好みでどうぞ。


閉じるブックの指定には、もちろん変数を使うこともできます。

Set 参照ブック = Workbooks("○○.xlsx")

~~~参照ブックを読み取るマクロ~~~

参照ブック.Close False

 
また、ブックではなくシートを変数にしている場合には、

Set 参照シート = Workbooks("○○.xlsx").Worksheets("商品マスタ")

~~~参照シートを読み取るマクロ~~~

参照シート.Parent.Close False

と、「Parent」メソッドを使うことで、
指定シートの親ブックを取得してCloseすることができます。


VBAの主役はワークシートであり、
親であるブックはマクロの開始/終了時の「Open/Close/Save」でしか登場しないことが多いです。

このときParentを知っているとコードがスッキリしますので、
知らなかった方はこの機会に覚えてしまいましょう。

DisplayAlertsをOFFにしてから閉じる

ブックを保存せず閉じる方法は上記のほか2種類あります。
そのうち1つがこちら。

Application.DisplayAlerts = False
Workbooks("○○.xlsx").Close
Application.DisplayAlerts = True

 
Closeメソッドは「SaveChanges」を指定しない場合、

  • 未編集であればそのまま閉じる
  • 編集があれば「○○の変更内容を保存しますか?」と聞く

と、手で「×」ボタンを押したときと同じ動きをします。


このときに表示される「保存しますか?」ダイアログは、
Application.DisplayAlerts = False によって非表示にすることができ、
この場合は保存もされません。

この性質を利用して「保存せず終了」をすることができます。


終わったらすみやかにApplication.DisplayAlerts = True にして、
警告表示をONに戻しておきましょう。


ちなみに勘違いしやすいポイントなのですが、

Workbooks(ブック名).Close False

と、SaveChanges引数を「False」と明示した場合は、
この「保存しますか?」ダイアログは出ません。


CloseメソッドのSaveChanges引数は、

  1. Trueなら保存して閉じる
  2. Falseなら保存しないで閉じる
  3. 省略した場合はユーザーに聞く

という仕様のパラメータです。


Boolean型の引数のため、「省略時はFalseが渡る」みたいな誤認をしやすいのですが、
今回の様に2値のBoolean引数が「True/False/省略」の3パターンに分岐することがたまにあります。

心の片隅にでも置いておいてください。

使い分け

さてここまでで紹介した

Workbooks(ブック名).Close False
Application.DisplayAlerts = False
Workbooks(ブック名).Close
Application.DisplayAlerts = True

この2つの違いですが、「保存しますか?」以外の警告ウィンドウが表示されるかどうかが違います。

大きい範囲をコピーしたままブックを閉じたときの、
「クリップボードに大きな情報があります~~」
などが、出る可能性のある警告ウィンドウですね。


DisplayAlertsはあまり気軽にOFFにするべきではないのですが、
保存しないで閉じる=更新は行わないファイルの話ですし、
軽微な警告は無視して実行してほしいことも多いでしょう。

  • 「マクロが変なメッセージで止まってた」を発生させたくないならDisplayAlerts法。
  • しっかり警告を拾いたいとき、1行でさっと書きたいときはClose False法

みたいな使い分けでいい気がします。
そこまで差はありませんので、お好みでどうぞ。

保存済フラグ(Savedプロパティ)をTrueにしてから閉じる

最後に第3の方法ですが、

参照ブック.Saved = True
参照ブック.Close

と、「Savedプロパティ=保存済判定」をTrueにして、
たとえ編集されていたとしても「未編集」にしてから閉じる
方法もあります。

「保存しますか?」ウィンドウはファイルが編集済みの場合にのみ表示されるため、
これでもウィンドウを開かずにブックを閉じることができます。


こちらはトリッキーな書き方で、
今回はわざわざこの方法をとる必要はありません。

マクロで変更したことにしたくない
(=このあと手で閉じるときにも「保存しますか?」ウィンドウを出したくない)
時にたまに使いますので、余裕があれば覚えてみてください。

おまけ:汎用関数にする

今回のコードはたいして長くないですが、

Sub ブックを保存せず閉じる(wb As Workbook)
    Application.DisplayAlerts = False
    wb.Close
    Application.DisplayAlerts = True
End Sub

という関数を作っておけば、

Call ブックを保存せず閉じる(参照ブック)

と1行でDisplayAlerts法を使えるようになります。


今回は「.Close False」で1行で書けるのであまり必要ないかもしれませんが、
1行で書く方法が存在しない

Sub シートを削除する(ws As Workbook)
    Application.DisplayAlerts = False
    ws.Delete
    Application.DisplayAlerts = True
End Sub

こちらは結構重宝します。


関数と聞くと難しい印象を受ける方もいるかもしれませんが、
今回の様に
「Application.DisplayAlerts = Trueを書くのが面倒」
くらいの目的で使ってもいいものです。

気軽に作ってみてください。


なお、せっかく関数にするならひとつ機能として、

Sub ブックを保存せず閉じる(wb As Workbook)
    If wb Is Thisworkbook Then Call Err.Raise(666, , "マクロファイル閉じようとしてますよ(^ω^)")

    Application.DisplayAlerts = False
    wb.Close
    Application.DisplayAlerts = True
End Sub

このように「閉じるブックが自分自身だったら実行させない」コードを追加するのも面白いです。
 

ブックを閉じるマクロをたくさん書いているとたまに変数を取り違えてしまい、
書いているマクロブック自身を保存せず閉じてしまうことがあります。

特にParentで閉じるブックを指定するときにやらかす印象ですね。


このIf文に救われて肝を冷やすことが年に数回ありますので、
結構大事な防波堤かもしれません。


こういうフールプルーフを仕込めるのも関数のいいところですので、
気が向いたら作ってみてください。