和風スパゲティのレシピ

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

ブックを閉じる - Workbook.Close

ブックを閉じる方法を解説します。

ブックを閉じる場合は、WorkbookオブジェクトのCloseメソッドを使用します。

基本構文

閉じるブック.Close [SaveChanges], [Filename], [RouteWorkbook]

引数はすべて省略可能です。
通常は第1引数のSaveChangesしか使用しません。

実行例

' ブックを上書き保存して閉じる
Workbooks("Book1.xlsx").Close True

' ブックを保存せず閉じる
Workbooks("Book1.xlsx").Close False

' 保存するかをユーザーに確認してから閉じる([×]を押したときと同じ動き)
Workbooks("Book1.xlsx").Close

CloseメソッドはSaveChangesの設定によって、上記の3パターンの動きをします。

Trueの場合は上書き保存をして閉じ、
Flaseの場合は保存をせずに閉じます。

引数を省略した場合は、ブックが未編集ならそのまま閉じ、
編集済みであれば保存するかをユーザーに確認してから閉じます。


True/Falseを指定する引数は省略時はどちらかの動きになることが多いのですが、
こちらは第3の動きになる珍しい引数なのでご注意ください。

注意点

Closeメソッドの構文自体は簡単ですが、
いくつか注意しなければいけない点があります。

Application.DisplayAlertsについて

DisplayAlertsをFalseにして警告を非表示にした場合は、
SaveChangeを省略していても「保存せず閉じる」
ようになります。


逆にSaveChangeにFalseを指定して「保存せず閉じる」場合は、
もちろん保存するかどうかのダイアログは出ませんが、
例えば「クリップボードに大きな情報があります」など、
それ以外の警告が出る可能性があります。


よって「とにかく停止させたくない」マクロの場合は、

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

このコードで「保存せず閉じる」を行った方が安定します。

DisplayAlertsをOFFにしたまま別のコードに移るのは危険なため、
即座にApplication.DisplayAlerts = Trueを実行してください。

読み取り専用ファイルで「保存して閉じる」場合

上書き保存ができない読み取り専用ファイルにおいて

Workbooks("Book1.xlsx").Close True

を実行した場合は、手作業の時と同様、
「名前を付けて保存する」ダイアログが表示されます。


これを判定して対処したい場合は、
ブックが読み取り専用かを調べるReadOnlyプロパティを使います。

If Workbooks("Book1.xlsx").ReadOnly = True Then
    ' 読み取り専用だった時の処理
Else
    Workbooks("Book1.xlsx").Close True
End If

 
ただ、この「読み取り専用だった時の処理」に何か処理を書こうにも、
この時点ではもう上書き保存をすることができませんので、
ここで判定しても時すでに遅しかもしれません。


ReadOnlyの判定はブックを開いた時点でやっておくべきことが多いため、
無駄に処理を進めてしまわないよう注意しておきましょう。

' 開いた時点で読み取り専用か確認する
Workbooks.Open "C:\~~\Book1.xlsx"
If Workbooks("Book1.xlsx").ReadOnly Then
    MsgBox "編集ファイルが読み取り専用のため処理を中断します。"
    Exit Sub
End If

~~~ブックを編集する処理 ' ←読み取り専用のままこれを実施しないで済む

' この上書き保存は必ず成功する
Workbooks("Book1.xlsx").Close True

保存ダイアログをキャンセルした場合

SaveChangeを省略した場合や、読み取り専用時に保存して終了した場合には、
「保存しますか?」ダイアログが表示されます。


このダイアログをユーザーが「キャンセル」した場合、
マクロはエラーで止まらず、ブックも閉じずに次に進みます。


この手の処理はユーザーのキャンセルで「実行時エラー」になることが多いのですが、
Closeメソッドはエラーになりません。

未保存でブックも開いたまま、特に警告なくマクロが終了しますのでご注意ください。

その他の引数

Filename

この引数にはファイルパスが指定でき、
指定した場合は「別名で保存して閉じる」ことができます。

' ブックを別名で保存して閉じる
Workbooks("Book1.xlsx").Close True, "C:\Users\○○\Desktop\新しいブック名.xlsm"

 
しかしこの引数は「未編集なら保存しない」という仕様なので、
そのブックが作られるとは限らないという不安定さがあります。


よって別名で保存して閉じるのであれば、
ストレートにSaveAsメソッドでブックを保存し、
その後Closeメソッドを実行した方が安定します。


また「編集があった時のみ別名で保存する」処理をやりたい場合も、
Workbook.Savedプロパティで編集があったかを判定し、
False時にSaveAsメソッドを実行した方が、
しっかりと意図をコードに記述することができます。


さらに注意点として、第1引数SaveChangeを省略した場合は、
「保存しますか?」ダイアログを表示してユーザーに確認するのに、
どちらを選んでも何も保存されない
という困った挙動になります。


以上よりわざわざ使用する必要がない引数と思いますが、
何らかの理由で使用する場合は、上記の挙動にご注意ください。

RouteWorkbook

Trueにするとブックの回覧機能を使用する引数ですが、
これは古い機能のため、現在のExcelでは無視されます。

昔のExcelには、メールを回す順番を決めておくと、
次の人にメールを送ってくれる機能があったようですね。