ブックを閉じるには、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
もちろん、この場合、変更は保存されません。