VBAでブックを閉じる(.Close
)際に、もしそのブックに未保存の変更があると、Excelは「変更を保存しますか?」という確認メッセージを表示します。これによりマクロの実行が一時停止し、ユーザーの応答を待つ状態になってしまいます。これでは完全な自動化はできません。
この記事では、.Close
メソッドの**SaveChanges
引数**を使い、この確認メッセージを完全に抑制し、**変更を自動で「保存する」または「破棄する」**方法を解説します。
Workbook.Close の SaveChanges引数
ブックを閉じるClose
メソッドには、SaveChanges
という非常に重要な引数があります。この引数にTrue
かFalse
を指定することで、保存の動作をコントロールできます。
SaveChanges の値 | 動作 |
True | 変更を自動で上書き保存して、メッセージなしで閉じます。 |
False | 変更を自動で破棄して、メッセージなしで閉じます。 |
省略 | ユーザーに**「変更を保存しますか?」の確認メッセージを表示**します。(マクロが一時停止) |
Google スプレッドシートにエクスポート
完成したVBAコード
① 変更を「保存して」メッセージなしで閉じる
このコードは、ブックに加えた変更を自動で上書き保存し、確認メッセージなしでブックを閉じます。
Sub SaveAndCloseBook()
Dim targetBook As Workbook
Set targetBook = ActiveWorkbook
' 変更を保存して閉じる
' 注意: まだ一度も保存されていない新規ブックの場合、「名前を付けて保存」ダイアログが表示されます
targetBook.Close SaveChanges:=True
End Sub
② 変更を「破棄して」メッセージなしで閉じる
このコードは、ブックに加えた変更をすべて破棄し、確認メッセージなしでブックを閉じます。
Sub DiscardAndCloseBook()
Dim targetBook As Workbook
Set targetBook = ActiveWorkbook
' 変更を破棄して閉じる
targetBook.Close SaveChanges:=False
End Sub
【応用】未保存ブックを考慮した堅牢なコード
SaveChanges:=True
は便利ですが、新規作成してから一度も保存していないブック(”Book1″など)に対して使うと、「名前を付けて保存」のダイアログが表示されてしまい、結局マクロが止まってしまいます。
これを避けるため、「ブックが一度でも保存されたことがあるか」で処理を分岐させるのが、より安全で確実な方法です。
コードと解説
Sub SmartCloseBook()
Dim bookToClose As Workbook
Set bookToClose = ActiveWorkbook
' ブックの保存履歴を.Pathプロパティの有無で判断
If bookToClose.Path <> "" Then
' 保存履歴のあるブック → 変更を保存して閉じる
bookToClose.Close SaveChanges:=True
MsgBox "変更を保存してブックを閉じました。"
Else
' 新規ブック("Book1"など)→ 変更を破棄して閉じる
bookToClose.Close SaveChanges:=False
MsgBox "新規ブックへの変更は破棄して閉じました。"
End If
End Sub
If bookToClose.Path <> "" Then
:.Path
プロパティは、ブックが保存されているフォルダのパスを返します。一度も保存されていないブックでは、このプロパティは空の文字列(""
)になります。これを利用して、ブックが新規ブックか既存のブックかを判断しています。
まとめ
確認メッセージなしでブックを閉じるには、.Close
メソッドのSaveChanges
引数を使い分けます。
- 変更を保存して閉じたい場合:
myBook.Close SaveChanges:=True
- 変更を破棄して閉じたい場合:
myBook.Close SaveChanges:=False
- 新規ブックも考慮して安全に処理したい場合:
.Path
プロパティで保存済みかを確認し、処理を分岐させる。
このSaveChanges
引数をマスターすることで、ファイルの開閉を伴うVBA処理を、完全に自動化してスムーズに実行できるようになります。