日々の集計をマクロで自動化していると、「保存」のところでつまずくことがあります。
そんな時に困ることは、
・元のブックは残したまま、コピーだけ別ファイルに保存したい
・ファイル形式を変えたらマクロが消えてしまった
ですね。
VBAには保存のためのメソッドが3つあり、用途がはっきり分かれています。
この違いを知らないまま使うと、「元のブックが上書きされてしまった」「マクロが動かなくなった」という事故につながります。
今回はそんなお悩みを解決する、
・別ファイルに名前を付けて保存する方法
・元のブックを残してコピーを保存する方法
・上書き確認を消す・保存先を選ばせる
・ファイル形式(拡張子)の指定と注意点
についてまとめます!
・SaveAs は開いているブック自体の名前が変わる(マクロも新しいブックで続行)
・元のブックを残したいなら SaveCopyAs を使う
・上書き確認を消すのは Application.DisplayAlerts = False
・マクロ有効ブックを .xlsx で保存するとマクロが失われるので、FileFormat を必ず指定する
完成イメージ
マクロを実行すると、開いているブックの名前が新しいファイル名に変わります。

上の画像は、sample_VBA保存元.xlsm を SaveAs で 2026年売上_別名保存.xlsm として保存した直後の状態です。
タイトルバーが新しいファイル名になっているのが分かりますね。
これが「名前を付けて保存」の動きです。
もくじ
まずは元のブックを用意する
今回は、こちらの売上データを使います。
・ファイル: sample_VBA保存元.xlsm(マクロ有効ブック)
・シート: 売上データ(A1:D11)
・合計: 2,519,900円
> マクロ有効ブック(.xlsm)を使うのがポイントです。拡張子の違いがトラブルの原因になるため、後ほど詳しく解説します。
Save・SaveAs・SaveCopyAsの違い
VBAの保存メソッドは3つ。この違いを押さえるのが一番大事です。
| メソッド | 動き | 元のブック | 主な用途 |
|---|---|---|---|
| Save | 上書き保存 | そのまま | 作業中の内容を保存 |
| SaveAs | 名前を付けて保存 | 名前が変わる | 別名で保存して以降はそちらで作業 |
| SaveCopyAs | コピーを作成 | まったく変わらない | バックアップ・控えの作成 |
「元のブックを残したいかどうか」で選びます。
| やりたいこと | 使うメソッド |
|---|---|
| マクロで作った集計を、その名前のまま保存したい | Save |
| 日付入りの別名で保存し、翌日も同じマクロを回したい | SaveCopyAs |
| 「名前を付けて保存」の動きをそのまま自動化したい | SaveAs |
STEP1. SaveAsで名前を付けて保存する
基本の形です。
Sub 名前を付けて保存()
Dim newPath As String
newPath = ThisWorkbook.Path & "\2026年売上_別名保存.xlsm"
Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=newPath, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled
Application.DisplayAlerts = True
MsgBox "保存しました:" & ThisWorkbook.FullName
End Sub
実行すると、ブックの名前と保存先が変わります。
| 項目 | 内容 | 結果 |
|---|---|---|
| 実行したメソッド | ThisWorkbook.SaveAs | 成功 |
| 新しいファイル名 | 2026年売上_別名保存.xlsm | — |
| ファイル形式 | xlOpenXMLWorkbookMacroEnabled (52) | .xlsm |
| 元のブック | sample_VBA保存元.xlsm | 閉じられる |
| ActiveWorkbook.Name | 2026年売上_別名保存.xlsm | — |

上のような結果がログとして残るようにしておくと、後から確認できてカンタンですね。
ここが落とし穴!SaveAsは「元のブック」も変わる
ThisWorkbook.SaveAs を実行すると、元のブックは閉じられ、新しいブックが開いた状態になります。
つまり、マクロは新しいブックで続けて動きます。
「元のブックはそのまま残るはず」と思っていると、思わぬところで上書きしてしまうので注意してください。
「元ファイルは絶対に触りたくない」という場合は、次の SaveCopyAs を使います。
STEP2. 元のブックを残してコピーを保存する(SaveCopyAs)
いちばん安全で、実務でよく使う形です。
Sub コピーを保存する()
Dim copyPath As String
copyPath = ThisWorkbook.Path & "\営業1課_売上控え.xlsx"
ThisWorkbook.SaveCopyAs copyPath
MsgBox "コピーを作成しました。" & vbCrLf & _
"元のブックはそのままです:" & ThisWorkbook.Name
End Sub
実行しても、ブック名は変わりません。
| 項目 | 内容 | 結果 |
|---|---|---|
| 実行したメソッド | ThisWorkbook.SaveCopyAs | 成功 |
| 作成されたコピー | 営業1課_売上控え.xlsx | — |
| コピーの形式 | .xlsx(元はマクロ有効のまま) | — |
| 実行前のブック名 | sample_控えブック.xlsm | — |
| 実行後のブック名 | sample_控えブック.xlsm | 名前は変わらない |
| 元のブックの状態 | 開いたまま・マクロもそのまま | SaveAsとの違い |
実行前と実行後でブック名が同じであることが、そのまま証拠になります。
SaveCopyAsの便利なところ
| # | メリット |
|---|---|
| 1 | 元のブックを開いたまま 控え(バックアップ) を作れる |
| 2 | 実行後も マクロが動き続ける(元のブックが変わらないため) |
| 3 | 日付入りのファイル名にすれば、毎日の自動バックアップが作れる |
| 4 | コピー側を .xlsx にしても、元のマクロ有効ブックは無傷 |
特に③は便利で、次のように書くと日付ごとの控えが自動で残ります。
Sub 日付つきバックアップ()
Dim p As String
p = ThisWorkbook.Path & "\backup\" & _
ThisWorkbook.NameWithoutExtension & "_" & Format(Date, "yyyymmdd") & ".xlsm"
If Dir(ThisWorkbook.Path & "\backup", vbDirectory) = "" Then
MkDir ThisWorkbook.Path & "\backup"
End If
ThisWorkbook.SaveCopyAs p
MsgBox "バックアップを作成しました:" & vbCrLf & p
End Sub
MkDir でフォルダの存在を確認してから作っているので、初回でもエラーになりません。
STEP3. 上書き確認を出さない(DisplayAlerts)
同じ名前のファイルがあると、Excelは「上書きしますか?」と確認してきます。
マクロで自動処理しているときにこの確認が出ると、処理が止まってしまいます。
Sub 確認なしで保存()
Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\上書き保存テスト.xlsm", _
FileFormat:=xlOpenXMLWorkbookMacroEnabled
Application.DisplayAlerts = True
End Sub
・保存が終わったら必ず True に戻す
・戻し忘れると、以降の「削除していいですか?」などの確認も出なくなる
・エラー時も戻るように、エラー処理とセットで書くのが安全
エラーが起きても必ず元に戻すには、次のように書きます。
Sub 安全に確認を止める()
On Error GoTo CleanUp
Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\控え.xlsm", _
FileFormat:=xlOpenXMLWorkbookMacroEnabled
CleanUp:
Application.DisplayAlerts = True
If Err.Number <> 0 Then
MsgBox "保存できませんでした:" & Err.Description, vbExclamation
End If
End Sub
STEP4. 保存先をダイアログで選ばせる(GetSaveAsFilename)
「保存先は人によって変えたい」という場合は、名前を付けて保存のダイアログを表示できます。
Sub 保存先を選んで保存()
Dim f As Variant
f = Application.GetSaveAsFilename( _
InitialFileName:="売上_" & Format(Date, "yyyymmdd"), _
FileFilter:="Excel ブック (*.xlsx), *.xlsx, " & _
"マクロ有効ブック (*.xlsm), *.xlsm")
If f = False Then Exit Sub
Application.DisplayAlerts = False
ThisWorkbook.SaveAs f
Application.DisplayAlerts = True
End Sub
キャンセルされたときは False が返るので、If f = False Then Exit Sub で処理を止めます。
ここを忘れると、キャンセルしたのに保存処理へ進んでエラーになります。
| 引数 | 意味 | 例 |
|---|---|---|
| InitialFileName | 最初に入っているファイル名 | “売上_20261011” |
| FileFilter | 選べる形式の表示 | “Excel ブック (*.xlsx), *.xlsx” |
| Title | ダイアログのタイトル | “名前を付けて保存” |
STEP5. ファイル形式(拡張子)を指定する
SaveAs は拡張子から形式を判断しますが、あいまいなときは FileFormat で明示するのが安全です。
| 定数 | 値 | 拡張子 | マクロ |
|---|---|---|---|
| xlOpenXMLWorkbook | 51 | .xlsx | 不可 |
| xlOpenXMLWorkbookMacroEnabled | 52 | .xlsm | 保持 |
| xlExcel8 | 56 | .xls | 保持 |
| xlCSV | 6 | .csv | 不可 |
注意!マクロ有効ブックを .xlsx で保存するとマクロが消える
いちばん多い事故です。
' × これは危険:マクロが失われる
ThisWorkbook.SaveAs "C:\temp\売上.xlsx"
' ○ マクロを残すなら .xlsm にする
ThisWorkbook.SaveAs "C:\temp\売上.xlsm", xlOpenXMLWorkbookMacroEnabled
マクロ有効ブック(.xlsm)を .xlsx で保存すると、VBプロジェクト(マクロ)は保存されません。
DisplayAlerts = False にしていると警告も出ないため、気づかないままマクロが消えます。
> 保存したファイルで「マクロが動かない」となったら、まず拡張子を確認してください。
トラブルシュート
実際にやってみて出たエラーをまとめました。
| 症状 | 原因 | 対処 |
|---|---|---|
| 「ファイルにアクセスできません」と出る | 保存先のフォルダが存在しない/権限がない | MkDir でフォルダを作る。書き込み可能な場所にする |
| 実行時エラー 1004 | 同じ名前のブックを開いたまま保存した | 別の名前にする。または先に閉じる |
| 保存したのにマクロが動かない | .xlsx で保存してマクロが失われた | .xlsm(52)で保存する |
| 元のブックが上書きされた | SaveAs を使った | 元を残すなら SaveCopyAs を使う |
| 保存のたびに確認が出て止まる | 上書き確認がオン | Application.DisplayAlerts = False |
| 保存先が選べずキャンセルでエラー | False の判定が無い | If f = False Then Exit Sub を入れる |
よくある間違い
| 間違い | 起きること | 正しい書き方 |
|---|---|---|
| SaveAsで元のブックが残ると思っている | 元ファイルが閉じられる | 残したいなら SaveCopyAs |
| 拡張子を書かずに保存する | 意図しない形式になる | FileFormat を指定する |
| DisplayAlertsを戻し忘れる | 以降の確認が出なくなる | 保存後に True に戻す |
| パスの区切りを / にする | 正しく保存されない | 日本語環境では \ を使う |
| SaveCopyAsの後に保存したつもりになる | 元のブックが未保存のまま | 元も保存するなら Save も呼ぶ |
エク短流:VBAでフォルダの中身を一覧化する
保存したファイルが増えてくると、「どれが最新か」「どのファイルにマクロがあるか」を確認するのも手間になります。
そんなときは、保存先フォルダの中身をVBAで一覧化してしまいましょう。
Sub 保存先のファイル一覧を作る()
Dim fso As Object, fld As Object, f As Object, i As Long
Set fso = CreateObject("Scripting.FileSystemObject")
Set fld = fso.GetFolder(ThisWorkbook.Path)
With ActiveSheet
.Range("A1:E1").Value = ("ファイル名", "更新日時", "サイズ(KB)", "種類", "マクロ")
i = 2
For Each f In fld.Files
If f.Name Like "*.xls*" And Left(f.Name, 2) <> "~$" Then
.Cells(i, 1).Value = f.Name
.Cells(i, 2).Value = f.DateLastModified
.Cells(i, 3).Value = Round(f.Size / 1024, 1)
.Cells(i, 4).Value = "." & fso.GetExtensionName(f.Name)
.Cells(i, 5).Value = IIf(fso.GetExtensionName(f.Name) = "xlsm", "あり", "なし")
i = i + 1
End If
Next f
.Range("B2:B" & i).NumberFormat = "yyyy/m/d hh:mm"
.Columns("A:E").AutoFit
End With
MsgBox (i - 2) & "件のファイルを一覧にしました"
End Sub
実行すると、フォルダの中身が一覧になってシートに書き出されます。
| 列 | 内容 | 分かること |
|---|---|---|
| ファイル名 | f.Name | どのファイルがあるか |
| 更新日時 | f.DateLastModified | どれが最新か |
| サイズ(KB) | f.Size | 0KBなら壊れている可能性 |
| 種類 | GetExtensionName | .xlsm / .xlsx の区別 |
| マクロ | 拡張子から判定 | マクロが残っているか |
どのファイルがどうやってできたか
実際に保存先へ書き出されたファイルです。
| ファイル | できかた | 元のブックへの影響 |
|---|---|---|
| sample_VBA保存元.xlsm | 最初に用意した元ブック | — |
| 2026年売上_別名保存.xlsm | SaveAs で作成 | 元は閉じられる |
| 営業1課_売上控え.xlsx | SaveCopyAs で作成 | まったく影響なし |
| sample_控えブック.xlsm | 検証用のブック | — |
・~$ で始まるファイルはExcelの一時ファイル(ブックを開いている間だけ作られる)なので除外します
・DateLastModified と Size も取れるので、バックアップの管理にそのまま使えます
・一覧を毎回シートに書き出せば、ファイルが増えても迷わなくなります
手作業とVBAの比較
| 作業 | エクスプローラーで確認 | VBAで一覧化 |
|---|---|---|
| ファイル名の確認 | 開いて目視 | シートに自動で並ぶ |
| 更新日時の比較 | 表示列を切り替える | 日時で並べ替えできる |
| マクロの有無 | 拡張子を1つずつ見る | 列で判定できる |
| 毎回の手間 | 毎回おなじ操作 | マクロ1回で完了 |
保存のマクロと組み合わせれば、バックアップを作って一覧に記録するところまで自動化できます。
さいごに
今回は、Excel VBAでブックを別ファイルに名前を付けて保存する方法をまとめました。
2. 元のブックを残すなら SaveCopyAs
3. 上書き確認を止めるのは Application.DisplayAlerts = False(戻し忘れ注意)
4. 保存先を選ばせるなら GetSaveAsFilename(False判定を忘れずに)
5. マクロを残すなら .xlsm(52) を指定する
保存のメソッドは、「元のブックをどうしたいか」で選べば迷いません。
バックアップを自動で取れるようになると、日々の集計作業がぐっと安心して運用できますね。
「元のファイルは残したい」というときは、この手順をぜひ試してみてください。
最後までお読みいただきありがとうございました。






コメントを残す