Excel VBAで保存して閉じる方法をお探しですね。
広告
Excel VBAでファイルを保存して閉じる方法【上書き・名前を付けて保存】
Excel VBAでブックを自動処理するとき、最後に必ず考えなきゃいけないのが「保存して閉じる」処理です。
上書き保存だけでいいのか、別名で保存したいのか、保存確認のメッセージを出さずに閉じたいのか――目的によって、使うメソッドや書き方が変わってきます。
この記事では、Excel VBAでファイルを上書き保存・名前を付けて保存して閉じる方法を、初心者でも迷わないように基本から実務での注意点まで整理して解説します。
1. ファイルを上書き保存する基本は「Saveメソッド」
Excel VBAで既存のブックを上書き保存したいときは、Workbookオブジェクトの`Save`メソッドを使います。
`Save`は、今開いているブックの内容を、同じファイル名・同じ場所に保存するためのメソッドです。
手作業でExcelの「上書き保存」ボタンを押すのと同じような処理だと思ってください。
よく使う書き方は、どのブックを保存したいかによって変わります。
– マクロが書かれているブックを保存する → `ThisWorkbook.Save`
– 今アクティブになっているブックを保存する → `ActiveWorkbook.Save`
– ブック名を指定して保存する → `Workbooks(“Book1.xlsx”).Save`
特に`ThisWorkbook`と`ActiveWorkbook`は混同しやすいので注意が必要です。
`ThisWorkbook`は「マクロが保存されているブック」、`ActiveWorkbook`は「今操作対象になっているブック」を指します。
“`vba
Sub 上書き保存する()
‘マクロが書かれているブックを上書き保存
ThisWorkbook.Save
‘今アクティブなブックを上書き保存
ActiveWorkbook.Save
‘ブック名を指定して上書き保存
Workbooks(“Book1.xlsx”).Save
End Sub
“`
実務では、間違ったブックを保存しないように、できるだけWorkbook型の変数に対象ブックを入れてから処理するのがおすすめです。
たとえば、ファイルを開いた直後に`Set wb = Workbooks.Open(…)`としておけば、その後は`wb.Save`のように明確に対象を指定できます。
画面上で別のブックがアクティブになっても処理対象がブレないので、マクロの安全性が高まります。
“`vba
Sub 対象ブックを開いて上書き保存する()
Dim wb As Workbook
Set wb = Workbooks.Open(“C:\Excel\sample.xlsx”)
‘ここに編集処理を書く
wb.Worksheets(1).Range(“A1”).Value = “更新済み”
‘対象ブックを上書き保存
wb.Save
End Sub
“`
2. 上書き保存して閉じるなら「Close」メソッドの「SaveChanges」を使う
ブックを保存してから閉じたい場合は、`Close`メソッドを使います。
`Workbook.Close SaveChanges:=True`と書くと、ブックに変更がある場合は保存してから閉じてくれます。
逆に、`SaveChanges:=False`を指定すると、変更があっても保存せずに閉じます。
保存するかどうかを明示できるので、確認メッセージを出さずに処理を終えたいマクロでよく使われます。
“`vba
Sub 上書き保存して閉じる()
Dim wb As Workbook
Set wb = Workbooks.Open(“C:\Excel\sample.xlsx”)
‘編集処理
wb.Worksheets(1).Range(“A1”).Value = Now
‘変更を保存して閉じる
wb.Close SaveChanges:=True
End Sub
“`
`Close SaveChanges:=True`は便利ですが、「必ずSaveメソッドと同じ意味で上書き保存される」と単純に考えると失敗することがあります。
たとえば、新規作成したブックのように保存先がまだ決まっていない場合、保存先を聞かれる動作になることがあります。
また、読み取り専用で開かれているブックでは、同じファイルへ上書き保存できないため、名前を付けて保存する流れになったり、処理が止まったりする可能性があります。
そのため、確実に上書き保存して閉じたい場合は、対象ブックが既存ファイルとして保存済みか、読み取り専用じゃないかを確認してから処理するのが安全です。
読み取り専用かどうかは`ReadOnly`プロパティで判定できます。
読み取り専用のまま編集処理を進めると、最後の保存段階で問題に気づくことになるので、ブックを開いた直後にチェックするのが実務的です。
“`vba
Sub 読み取り専用を確認して保存終了する()
Dim wb As Workbook
Set wb = Workbooks.Open(“C:\Excel\sample.xlsx”)
If wb.ReadOnly Then
MsgBox “対象ファイルが読み取り専用のため、処理を中止します。
”
wb.Close SaveChanges:=False
Exit Sub
End If
‘編集処理
wb.Worksheets(1).Range(“A1”).Value = “更新”
wb.Close SaveChanges:=True
End Sub
“`
なお、変更の有無にかかわらず保存処理を明確に実行したい場合は、`wb.Save`を実行してから`wb.Close SaveChanges:=False`で閉じる書き方もあります。
すでに保存済みなので、閉じるときに改めて保存する必要がなく、処理の意図が読み取りやすくなります。
チームで保守するマクロでは、「保存」と「閉じる」を分けて書いた方が、後から見た人にも動作が伝わりやすいです。
3. 名前を付けて保存して閉じる場合は「SaveAs」メソッドを使う
Excel VBAでファイルを別名保存したい場合は、`SaveAs`メソッドを使います。
`Save`が既存ファイルへの上書き保存なのに対し、`SaveAs`は保存先のパスやファイル名、ファイル形式を指定して保存するメソッドです。
日次レポートを「売上_20260512.xlsx」のように日付付きで保存する場合や、テンプレートをコピーして別ファイルとして保存する場合に使います。
基本形は`Workbook.SaveAs Filename:=”保存先のフルパス”`です。
保存先は、できるだけドライブ名から始まるフルパスで指定することをおすすめします。
ファイル名だけを指定すると、カレントフォルダーと呼ばれる今の作業フォルダーに保存されるため、想定外の場所にファイルが作られることがあります。
“`vba
Sub 名前を付けて保存する()
Dim wb As Workbook
Dim savePath As String
Set wb = Workbooks.Open(“C:\Excel\template.xlsx”)
savePath = “C:\Excel\output\report.xlsx”
‘別名で保存
wb.SaveAs Filename:=savePath
‘保存後に閉じる
wb.Close SaveChanges:=False
End Sub
“`
マクロ有効ブックとして保存する場合は、拡張子だけでなく`FileFormat`も指定すると安全です。
たとえば`.xlsm`で保存するなら`xlOpenXMLWorkbookMacroEnabled`、通常の`.xlsx`で保存するなら`xlOpenXMLWorkbook`を使います。
拡張子とファイル形式が合っていないと、警告が出たり、ファイルを開くときに問題が発生したりすることがあります。
“`vba
Sub マクロ有効ブックとして名前を付けて保存する()
Dim wb As Workbook
Dim savePath As String
Set wb = ThisWorkbook
savePath = “C:\Excel\output\macro_sample.xlsm”
wb.SaveAs Filename:=savePath, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled
wb.Close SaveChanges:=False
End Sub
“`
名前を付けて保存した後に`Close SaveChanges:=False`としているのは、すでに`SaveAs`で保存が完了しているからです。
ここで`SaveChanges:=True`としても大きな問題はありませんが、保存済みのブックを閉じるだけなら`False`の方が意図が明確です。
一方、`SaveAs`の後にさらにセルを更新する処理がある場合は、その変更を保存するために`Save`を実行するか、`Close SaveChanges:=True`を指定する必要があります。
4. 警告メッセージを抑制する方法と実務での注意点
既に同じ名前のファイルがある場所へ`SaveAs`で保存しようとすると、通常は「上書きしますか?」という確認メッセージが表示されます。
手動操作なら確認できるので問題ありませんが、自動処理のマクロではメッセージが出た時点で処理が止まってしまいます。
こんなときは、`Application.DisplayAlerts = False`を使うことで、Excelの確認メッセージを一時的に非表示にできます。
“`vba
Sub 確認メッセージなしで上書き保存する()
Dim wb As Workbook
Dim savePath As String
On Error GoTo ErrHandler
Set wb = ThisWorkbook
savePath = “C:\Excel\output\report.xlsx”
Application.DisplayAlerts = False
wb.SaveAs Filename:=savePath, _
FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = True
MsgBox “保存が完了しました。
”
Exit Sub
ErrHandler:
Application.DisplayAlerts = True
MsgBox “保存中にエラーが発生しました。
”
End Sub
“`
`DisplayAlerts`を使うときに最も重要なのは、処理の最後で必ず`True`に戻すことです。
`False`のままマクロが終了すると、その後のExcel操作でも警告が表示されず、意図しない上書きや削除に気づきにくくなります。
エラーが起きた場合でも元に戻せるように、上記のようにエラー処理を入れておくと安全です。
また、保存して閉じる処理では、対象ブックの指定を曖昧にしないことも大切です。
`ActiveWorkbook`は便利ですが、処理中に別ブックが前面に出ると対象が変わる可能性があります。
業務用マクロでは、`Dim wb As Workbook`で変数を用意して、開いたブックや保存したいブックを明示的に代入してから、`wb.Save`、`wb.SaveAs`、`wb.Close`のように書く方が安定します。
最後に、上書き保存・名前を付けて保存・閉じる処理は、目的に応じて使い分けると整理しやすくなります。
– 既存ファイルをそのまま更新する → `Save`
– 保存しながら閉じる → `Close SaveChanges:=True`
– 別名や別形式で保存する → `SaveAs`
バックアップ目的で「開いているブック自体はそのままにして、コピーだけ保存したい」場合は、`SaveCopyAs`という別の方法もあります。
保存処理はデータを直接変更する重要な操作なので、まずはテスト用ファイルで動作を確認してから本番ファイルに適用するのが安全です。
この記事を参考に、目的に合った保存方法を選んで、安心してマクロを作ってみてください。
広告
