ブックを閉じる


ブックを閉じるには、WorkbookオブジェクトのCloseメソッドを使います。次のコードは、すでに開いている Book1.xlsx を閉じます。

Sub Sample1()
    Workbooks("Book1.xlsx").Close
End Sub

Windowsの「フォルダオプション」で、[登録されている拡張子は表示しない]がオンになっていると、エクスプローラでファイルの拡張子が表示されません。

このとき、Excelで開いているブックも、タイトルバーに拡張子が表示されなくなります。

【拡張子を表示する設定のとき】

【拡張子を表示しない設定のとき】

拡張子を表示する設定のとき、Workbooks("Book1").Closeのように拡張子を指定しないと、エラーになります。

つまり、こういうことです。

拡張子を ("Book1").Close ("Book1.xlsx").Close
表示する設定 失敗(エラー) 成功
表示しない設定 成功 成功

[フォルダオプション]はWindowsの設定です。Excelのマクロを実行するとき、そのWindowsでどんな設定がされているか分かりませんので、ブックを閉じるCloseメソッドでは、ブック名に拡張子をつけるのが安全です。

ただし、希なケースですが、まだ保存していないブックを閉じるときは、拡張子をつけてはいけません。Excelで新規ブックを開くと、ブックには「Book1」「Book2」など便宜的な名前が付けられます。このブックは、まだ保存していないのですから、どんな形式のブックで保存されるかが未定です。つまり、拡張子も確定していません。なので、まだ保存していないブックを閉じるときは、

Sub Sample1()
    Workbooks("Book1").Close
End Sub

のように、拡張子を指定しません。

ブックを保存するか?

すでに保存されているブックを開き、何かの編集を行い、その変更をまだ保存していと、ブックと閉じようとしたとき、次のような確認メッセージが表示されます。

この確認メッセージを表示したくないときは、次のようにします。

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

ApplicationオブジェクトのDisplayAlertsプロパティは、Excelの確認メッセージを表示するかどうかを制御します。Falseを設定すると、確認メッセージが表示されなくなります。このとき、ブックに行った編集は保存されません。なので、「変更は保存する」&「メッセージは出さない」でしたら、次のようにCloseメソッドの前に上書き保存してやります。

Sub Sample3()
    Application.DisplayAlerts = False
    Workbooks("Book1.xlsx").Save
    Workbooks("Book1.xlsx").Close
    Application.DisplayAlerts = True
End Sub

でも待ってください。Saveメソッドで変更を保存すれば、そもそも「保存しますか?」メッセージは表示されなくなります。つまり、「変更は保存する」&「メッセージは出さない」は、次のコードで済みます。

Sub Sample4()
    Workbooks("Book1.xlsx").Save
    Workbooks("Book1.xlsx").Close
End Sub

「変更を保存しない」&「メッセージを出さない」でしたら、上記Sample2ですね。

ブックが変更されたか?

Excelでブックを開いてから、そのブックに何らかの変更が行われたかどうかは、WorkbookオブジェクトのSavedプロパティで分かります。変更が行われていると、SavedプロパティはTrueを返します。

Sub Sample5()
    If ActiveWorkbook.Saved Then
        MsgBox "変更は保存されています"
    Else
        MsgBox "変更は保存されていません"
    End If
End Sub

「変更されたかどうか」は見た目ではありません。たとえば、セルに何かのデータを入力して、その後[元に戻す]などで元の状態に戻したとしても、Excel的には「変更された」と認識されます。

実は、先の「保存しますか?」メッセージは、SavedプロパティがFalseのときに表示されます。したがって、何らかの変更を行ったブックを、確認メッセージを出さないで閉じるには、次のようにする手もあります。

Sub Sample6()
    ActiveWorkbook.Saved = True
    ActiveWorkbook.Close
End Sub

もちろん、この場合、変更は保存されません。