Excel VBAでブックを別ファイルで名前を付けて保存をする方法!

Excel VBAでブックを別ファイルで名前を付けて保存をする方法!
日々の集計をマクロで自動化していると、「保存」のところでつまずくことがあります。

そんな時に困ることは、

・毎回「名前を付けて保存」を手で操作している
・元のブックは残したまま、コピーだけ別ファイルに保存したい
・ファイル形式を変えたらマクロが消えてしまった

ですね。

VBAには保存のためのメソッドが3つあり、用途がはっきり分かれています。

この違いを知らないまま使うと、「元のブックが上書きされてしまった」「マクロが動かなくなった」という事故につながります。

今回はそんなお悩みを解決する、

・SaveとSaveAsとSaveCopyAsの違い
・別ファイルに名前を付けて保存する方法
・元のブックを残してコピーを保存する方法
・上書き確認を消す・保存先を選ばせる
・ファイル形式(拡張子)の指定と注意点

についてまとめます!

POINT
・上書き保存は Save、別名で保存は SaveAs、コピーを作るのは SaveCopyAs
・SaveAs は開いているブック自体の名前が変わる(マクロも新しいブックで続行)
・元のブックを残したいなら SaveCopyAs を使う
・上書き確認を消すのは Application.DisplayAlerts = False
・マクロ有効ブックを .xlsx で保存するとマクロが失われるので、FileFormat を必ず指定する

完成イメージ

マクロを実行すると、開いているブックの名前が新しいファイル名に変わります。

SaveAs実行後のExcel(タイトルバーが新しいファイル名になっている)
上の画像は、sample_VBA保存元.xlsm を SaveAs で 2026年売上_別名保存.xlsm として保存した直後の状態です。

タイトルバーが新しいファイル名になっているのが分かりますね。

これが「名前を付けて保存」の動きです。

まずは元のブックを用意する

今回は、こちらの売上データを使います。

元のブック(sample_VBA保存元.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実行後の保存ログ(実際の実行結果)
上のような結果がログとして残るようにしておくと、後から確認できてカンタンですね。

ここが落とし穴!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実行後のログ(ブック名が変わっていない)

実行前と実行後でブック名が同じであることが、そのまま証拠になります。

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
POINT
・DisplayAlerts = False は保存の直前に入れる
・保存が終わったら必ず 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

実行すると、フォルダの中身が一覧になってシートに書き出されます。

VBAで一覧化したフォルダの中身(実測)
列 内容 分かること
ファイル名 f.Name どのファイルがあるか
更新日時 f.DateLastModified どれが最新か
サイズ(KB) f.Size 0KBなら壊れている可能性
種類 GetExtensionName .xlsm / .xlsx の区別
マクロ 拡張子から判定 マクロが残っているか

どのファイルがどうやってできたか

実際に保存先へ書き出されたファイルです。

ファイル できかた 元のブックへの影響
sample_VBA保存元.xlsm 最初に用意した元ブック —
2026年売上_別名保存.xlsm SaveAs で作成 元は閉じられる
営業1課_売上控え.xlsx SaveCopyAs で作成 まったく影響なし
sample_控えブック.xlsm 検証用のブック —
POINT
・CreateObject(“Scripting.FileSystemObject”) でフォルダの中身を読み取れます
・~$ で始まるファイルはExcelの一時ファイル(ブックを開いている間だけ作られる)なので除外します
・DateLastModified と Size も取れるので、バックアップの管理にそのまま使えます
・一覧を毎回シートに書き出せば、ファイルが増えても迷わなくなります

手作業とVBAの比較

作業 エクスプローラーで確認 VBAで一覧化
ファイル名の確認 開いて目視 シートに自動で並ぶ
更新日時の比較 表示列を切り替える 日時で並べ替えできる
マクロの有無 拡張子を1つずつ見る 列で判定できる
毎回の手間 毎回おなじ操作 マクロ1回で完了

保存のマクロと組み合わせれば、バックアップを作って一覧に記録するところまで自動化できます。

タカヒロ

タカヒロ
「別名保存」と「コピー保存」は、名前が似ているのに動きが正反対です。元のファイルを残したいなら SaveCopyAs、と覚えてしまうのが早いですよ。

さいごに

今回は、Excel VBAでブックを別ファイルに名前を付けて保存する方法をまとめました。

1. 上書き保存は Save、別名保存は SaveAs
2. 元のブックを残すなら SaveCopyAs
3. 上書き確認を止めるのは Application.DisplayAlerts = False(戻し忘れ注意)
4. 保存先を選ばせるなら GetSaveAsFilename(False判定を忘れずに)
5. マクロを残すなら .xlsm(52) を指定する

保存のメソッドは、「元のブックをどうしたいか」で選べば迷いません。

バックアップを自動で取れるようになると、日々の集計作業がぐっと安心して運用できますね。

「元のファイルは残したい」というときは、この手順をぜひ試してみてください。

最後までお読みいただきありがとうございました。



この記事の関連キーワード

こちらの記事の関連キーワード一覧です。クリックするとキーワードに関連する記事一覧が閲覧できます。






コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA ImageChange Image