VBAでファイルを保存するには、上書き保存の Save・名前をつけて保存の SaveAs・コピーを保存する SaveCopyAs の3つを使い分けます。用途に合った方法を選ぶことで、確認ダイアログを出さずに自動保存したり、日付入りのファイル名で連番保存したりできます。
この記事では、次の内容を順番に解説します。
- Save・SaveAs・SaveCopyAsの使い分け
- SaveAsで保存形式(xlsx・xlsm・csv・pdf)を指定する方法
- 日付やセルの値をファイル名に使う方法
- 確認ダイアログを出さずに保存する方法
- ThisWorkbookとActiveWorkbookの違い
3つの保存方法を比較するには?
VBAの保存メソッドは用途によって使い分けます。
| メソッド | 動作 | 使いどころ |
|---|---|---|
Save | 現在のファイルをそのまま上書き保存 | マクロ実行後に毎回保存したいとき |
SaveAs | 別のファイル名・形式で保存(元ファイルは置き換わる) | 請求書・日報など新しいファイルとして保存したいとき |
SaveCopyAs | コピーを別名で保存(元ファイルはそのまま残る) | バックアップを自動作成したいとき |
上書き保存するには?
現在開いているブックをそのまま上書き保存するには Save メソッドを使います。
' アクティブなブックを上書き保存
ActiveWorkbook.Save
' マクロが書かれているブック自身を上書き保存(推奨)
ThisWorkbook.Save
ActiveWorkbookとThisWorkbookの違い:
ActiveWorkbook:現在画面に表示されているブックを指します。別のブックをアクティブにした状態で実行すると、意図しないブックが保存される可能性があります。ThisWorkbook:マクロが書かれているブック自身を指します。どのブックがアクティブでも必ず同じブックを保存するため、意図しない保存事故を防げます。
マクロ自身のブックを保存する場合は ThisWorkbook.Save を使う方が安全です。
名前をつけて保存するには?
別のファイル名や場所に保存するには SaveAs メソッドを使います。
' 基本の書き方
ActiveWorkbook.SaveAs Filename:="C:¥Users¥yamada¥Documents¥請求書¥ファイル1.xlsx"
パスの考え方:「Cドライブ → Users → yamada → Documents → 請求書フォルダ → ファイル1.xlsx」という階層を ¥ でつないで表記します。VBAでは ¥ を使います。
マクロファイルと同じフォルダに保存したい場合は ThisWorkbook.Path で保存先パスを取得できるので、パスをハードコードせずに済みます。
' マクロファイルと同じフォルダに保存する
Dim savePath As String
savePath = ThisWorkbook.Path & "¥請求書_出力.xlsx"
ActiveWorkbook.SaveAs Filename:=savePath
保存形式を指定するには?
SaveAs では FileFormat 引数で保存形式を指定できます。拡張子だけでなく FileFormat も合わせて指定するのが確実です。
| 保存形式 | FileFormat定数 | 使いどころ |
|---|---|---|
| .xlsx(マクロなし) | xlOpenXMLWorkbook | 通常のExcelファイルとして共有するとき |
| .xlsm(マクロあり) | xlOpenXMLWorkbookMacroEnabled | マクロを含めて保存するとき |
| .csv | xlCSV | データだけを他システムに渡すとき |
| ※ExportAsFixedFormatを使用 | 見た目をそのまま固定して共有するとき |
' xlsxとして保存(マクロなし)
ActiveWorkbook.SaveAs Filename:="C:¥出力¥報告書.xlsx", _
FileFormat:=xlOpenXMLWorkbook
' csvとして保存
ActiveWorkbook.SaveAs Filename:="C:¥出力¥データ.csv", _
FileFormat:=xlCSV
' PDFとして保存(SaveAsではなくExportAsFixedFormatを使う)
ActiveWorkbook.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:="C:¥出力¥報告書.pdf"
日付やセルの値をファイル名に使うには?
実務では「今日の日付」や「セルに入力された取引先名」をファイル名に組み込むことが多いです。
' 今日の日付をファイル名に入れる(例:報告書_20250601.xlsx)
Dim fileName As String
fileName = "報告書_" & Format(Date, "yyyymmdd") & ".xlsx"
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "¥" & fileName, _
FileFormat:=xlOpenXMLWorkbook
' A1セルの取引先名をファイル名に使う(例:請求書_株式会社ABC.xlsx)
Dim clientName As String
clientName = ThisWorkbook.Sheets("請求書").Range("A1").Value
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "¥請求書_" & clientName & ".xlsx", _
FileFormat:=xlOpenXMLWorkbook
注意:ファイル名に使えない文字(\ / : * ? " < > |)がセルに入っている場合はエラーになります。Replace関数であらかじめ除去しておくと安全です。
' ファイル名に使えない文字を除去する
Dim clientName As String
clientName = ThisWorkbook.Sheets("請求書").Range("A1").Value
clientName = Replace(clientName, "/", "")
clientName = Replace(clientName, "\", "")
clientName = Replace(clientName, ":", "")
clientName = Replace(clientName, "*", "")
clientName = Replace(clientName, "?", "")
clientName = Replace(clientName, """", "")
clientName = Replace(clientName, "<", "")
clientName = Replace(clientName, ">", "")
clientName = Replace(clientName, "|", "")
確認ダイアログを出さずに保存するには?
上書き保存時に「既存のファイルを置き換えますか?」という確認ダイアログが表示されることがあります。自動処理の中でダイアログが出ると止まってしまうため、次のコードで抑制できます。
' 確認ダイアログを出さずに保存する
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:="C:¥出力¥報告書.xlsx", _
FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = True ' ← 必ず元に戻す
注意:DisplayAlerts = False にしたあとは必ず True に戻してください。戻さないとその後のすべての警告・確認ダイアログが表示されなくなります。
バックアップを自動作成するには?
SaveCopyAs は元ファイルを変更せずに、コピーだけを別名で保存します。作業中のファイルを上書きせずにバックアップを残したいときに便利です。
' 今日の日付付きバックアップを作成する
Dim backupPath As String
backupPath = ThisWorkbook.Path & "¥backup_" & Format(Date, "yyyymmdd") & ".xlsm"
ThisWorkbook.SaveCopyAs Filename:=backupPath
SaveAs との違いは、実行後も元のブック(ThisWorkbook)が保存されたままで、VBAの編集対象も元のブックのままという点です。
まとめ
- 上書き保存(
Save):現在のブックをそのまま保存。ThisWorkbook.Saveが安全。 - 名前をつけて保存(
SaveAs):別のファイル名・形式で保存。FileFormatを合わせて指定する。 - コピー保存(
SaveCopyAs):元ファイルを変えずにコピーだけ保存。バックアップに最適。 - 日付・セル値のファイル名:
Format(Date, "yyyymmdd")やセルの値を&でつなげて使う。 - ダイアログ抑制:
DisplayAlerts = Falseで抑制できるが、処理後は必ずTrueに戻す。
よくある質問
SaveAsを実行するとブック名が変わってしまいます。元のブックのまま使いたいのですが?
SaveAs は「名前をつけて保存」なので、実行後はそのブック自体が新しいファイル名に変わります。元のファイルをそのまま維持しつつコピーだけ保存したい場合は SaveCopyAs を使いましょう。
xlsxで保存しようとすると「マクロは保存されません」と警告が出ます
xlsx形式はマクロを含められないため、VBAが入ったブックをxlsxで保存しようとするとこの警告が出ます。Application.DisplayAlerts = False で抑制できますが、マクロ自体は保存されないことに注意してください。マクロごと保存したい場合は .xlsm 形式(xlOpenXMLWorkbookMacroEnabled)を使います。
ThisWorkbook.Pathが空になることがあります。なぜですか?
ブックを一度も保存していない(新規作成のまま)状態では ThisWorkbook.Path が空文字になります。パスを使う前に If ThisWorkbook.Path = "" Then で確認し、未保存の場合は先に保存するよう処理を分けましょう。
CSVで保存するとシートが1枚しか保存されません。なぜですか?
CSV形式はシートを1枚しか持てない形式のため、アクティブシート(または最初のシート)だけが保存されます。複数シートを個別のCSVに保存したい場合は、各シートをアクティブにしてループしながら保存するコードが必要です。
保存先のフォルダが存在しない場合はどうなりますか?
保存先フォルダが存在しないとエラーになります。MkDir 関数でフォルダを事前に作成するか、Dir 関数でフォルダの存在を確認してから保存するのが安全です。
' フォルダがなければ作成してから保存する
Dim folderPath As String
folderPath = "C:¥出力¥請求書"
If Dir(folderPath, vbDirectory) = "" Then
MkDir folderPath
End If
ActiveWorkbook.SaveAs Filename:=folderPath & "¥請求書.xlsx", _
FileFormat:=xlOpenXMLWorkbook
動画で学びたい方へ
「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。
VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。



