ワークブックを保存せずに閉じる
VBA で別の Excel ファイルからデータを取得する場合、Workbooks.Openメソッドでファイルを開き、処理が終わったら閉じるのが一般的です。
参照するだけであれば、保存する必要はありません。不要な上書き保存は、意図しないデータ変更をそのまま確定させてしまう原因にもなります。
このページでは、VBA でワークブックを保存せずに閉じる方法を解説します。
結論:Close メソッドに SaveChanges:=False を指定する
Workbook.CloseメソッドのSaveChanges引数にFalseを指定すると、変更内容を破棄して保存せずに閉じることができます。
Workbook.Close SaveChanges:=False
SaveChangesを省略した場合、ブックに未保存の変更があると「変更内容を保存しますか?」という確認ダイアログが表示され、マクロが止まってしまいます。自動処理ではSaveChangesを明示的に指定しましょう。
| SaveChanges の値 | 動作 |
|---|---|
False | 保存せずに閉じる |
True | 保存してから閉じる(新規ブックは保存先を確認) |
| 省略 | 未保存の変更があれば確認ダイアログが表示 |
サンプルコード
アクティブなワークブックを保存せず閉じる
ActiveWorkbook.Close SaveChanges:=False
ActiveWorkbookは、マクロ実行時点で前面にあるブックを指します。マクロ自身を含むブックを閉じたい場合はThisWorkbookを使います。意図しないブックを閉じないよう、できるだけ次の「特定のブックを指定する方法」を使いましょう。
特定の Excel ファイルを保存せず閉じる
Dim wb As Workbook
Set wb = Workbooks.Open("C:\data\Book1.xlsx", ReadOnly:=True)
' ...必要な処理...
wb.Close SaveChanges:=False
Workbooks.Openで開いた時点で変数に格納しておけば、閉じる対象を取り違える心配がありません。参照するだけならReadOnly:=Trueで開くと、誤って上書きするリスクも下げられます。
開いているブックのうち、マクロ自身以外を閉じる
Dim i As Long
For i = Workbooks.Count To 1 Step -1
If Not Workbooks(i) Is ThisWorkbook Then
Workbooks(i).Close SaveChanges:=False
End If
Next i
For EachでWorkbooksを回しながら閉じると、コレクションの要素数が変化するため、後ろから順に処理する方が安全です。また、ThisWorkbookを閉じるとマクロが途中で終了するため、除外しています。
変更内容は破棄され、元に戻せません。 他のブックに未保存の作業がないことを確認してから実行してください。
補足:確認ダイアログを出す方法・出さない方法
SaveChanges:=Falseを使わず、ブックのSavedプロパティをTrueにして「保存済み」とみなす方法もあります。
wb.Saved = True
wb.Close
また、Application.DisplayAlerts = Falseで確認ダイアログ自体を抑止する方法もありますが、他のアラートも全て無効になるため、処理後にTrueへ戻す必要があります。ブックを閉じるだけならSaveChanges:=Falseが最もシンプルです。
活用例
- マクロ処理中に一時的に開いた、参照専用のブックを閉じる
- マクロで生成した一時ファイルを残さず終了する
- テスト用のブックを、編集内容を残さず何度も開き直す