完成イメージ(Before / After)
Before(手入力で日付を付ける)

| A | B | |
|---|---|---|
| 1 | ファイル名 | 問題 |
| 2 | 検査報告_20260418.xlsx | 手入力で日付を間違える |
| 3 | 検査報告_20260417.xlsx | 昨日の日付を付けてしまった |
| 4 | 検査報告_0416.xlsx | 命名ルールがバラバラ |
After(VBAで自動保存)

| A | B | |
|---|---|---|
| 1 | ファイル名 | 結果 |
| 2 | 検査報告_20260416.xlsm | 自動保存済み |
| 3 | 検査報告_20260417.xlsm | 自動保存済み |
| 4 | 検査報告_20260418.xlsm | 自動保存済み |
ボタン1つで今日の日付が正確に入る。命名ルールが統一される。
どんな場面で使う?
- 品質管理: 毎日の検査レポートを「検査報告_日付.xlsx」で日付付き保存する
- 事務: 月次報告書を「月次報告_2026年3月_営業部.xlsx」のように部署名+年月で保存する
- 経理: 請求書や見積書をPDF保存するとき、取引先名+日付をファイル名に自動で付ける
- どんな職種でも: 「ファイル名に日付を手入力している」なら、この自動化が使える
—
実行前の準備
Excelをマクロ有効ブック(.xlsm)で保存する
- Excelを開く(新規でも既存でもOK)
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存
.xlsx のままだとマクロは保存できない。必ず .xlsm にすること。
保存先フォルダを確認する
保存先のフォルダが存在しない場合、SaveAsはエラーになる。エクスプローラーで保存先フォルダが存在することを確認しておくこと。
パスの確認方法:エクスプローラーでフォルダを開き、アドレスバーをクリックするとパスが表示される。それをコピーして使う。
—
手順(コピペ → 実行まで約5分)
ステップ1:VBEを開いてコードを貼り付ける
- Alt + F11 でVBE(コードを書く画面)を開く
- メニュー「挿入」→「標準モジュール」
- 下の「コード(基本版)」「コード(応用版)」「コード(実務版)」のいずれかをコピーしてコードウィンドウに貼り付ける
一般的にはAlt + F11で開けるが、企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。ボタンからワンクリックで実行したい場合は マクロをボタン1つで実行する方法 を参照。
ステップ2:保存先パスを書き換える
コード内の savePath を、自分の保存先フォルダのパスに書き換える。
パスの末尾に \ を忘れないこと。
ステップ3:マクロを実行する
- Alt + F8 を押す
- マクロ名を選択して「実行」
- 保存先フォルダにファイルが作成されたことを確認する
—
コード(基本版)– 日付をファイル名に付けて保存
まずはこれだけで動く。Format(Date, "yyyymmdd") で今日の日付を取得し、SaveAs でファイル名に日付を付けて保存する。参照設定は不要。
'============================================================
' ■ 日付をファイル名に付けて保存(基本版)
' → Format(Date, "yyyymmdd") で今日の日付を取得
' → ThisWorkbook.SaveAs で名前を付けて保存
' → 参照設定不要。VBA標準関数のみ
'============================================================
Sub SaveWithDate()
'--- ★書き換えポイント ---
Dim savePath As String
savePath = "C:\Users\(ユーザー名)\Desktop\報告書\" '← 保存先フォルダ(末尾に\)
Dim baseName As String
baseName = "報告書" '← ファイル名のベース部分
'--- ★ここまで ---
'--- 今日の日付を yyyymmdd 形式で取得
Dim dateStr As String
dateStr = Format(Date, "yyyymmdd")
'--- ファイル名を組み立て
Dim fullPath As String
fullPath = savePath & baseName & "_" & dateStr & ".xlsm"
'--- 保存先フォルダの存在チェック
If Dir(savePath, vbDirectory) = "" Then
MsgBox "保存先フォルダが見つかりません:" & savePath, vbExclamation
Exit Sub
End If
'--- 同名ファイルの上書き防止チェック
If Dir(fullPath) <> "" Then
MsgBox "同名ファイルが既に存在します:" & vbCrLf & fullPath & vbCrLf & vbCrLf & _
"上書きしたくない場合はファイル名を変更してください。", vbExclamation
Exit Sub
End If
'--- 名前を付けて保存
ThisWorkbook.SaveAs Filename:=fullPath, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled
MsgBox "保存しました:" & vbCrLf & fullPath, vbInformation
End Sub
書き換えポイント
| 変数 | 説明 | 初期値 |
|---|---|---|
savePath |
保存先フォルダ(末尾に \) |
"C:\Users\(ユーザー名)\Desktop\報告書\" |
baseName |
ファイル名のベース部分 | "報告書" |
コードの流れ
- Format(Date, “yyyymmdd”): 今日の日付を「20260314」形式の文字列に変換する
- ファイル名の組み立て:
baseName & "_" & dateStr & ".xlsm"で「報告書_20260314.xlsm」を生成 - Dir() で保存先フォルダの存在チェック: フォルダがなければエラーメッセージを出して終了
- Dir() で同名ファイルチェック: 同名ファイルがあれば警告して終了(上書き防止)
- SaveAs で保存:
FileFormat:=xlOpenXMLWorkbookMacroEnabledで .xlsm 形式として保存
ポイント:
Date関数は今日の日付を返す。Now関数を使えば日時(年月日+時分秒)を取得できるFileFormatをxlOpenXMLWorkbookMacroEnabled(52)にすると .xlsm で保存される。.xlsx で保存したい場合はxlOpenXMLWorkbook(51)に変更するが、マクロは保存されないので注意- SaveAs 実行後、ブック名が新しいファイル名に変わる。元のファイルはそのまま残る
Format関数の日付書式パターン
| 書式 | 出力例 | 用途 |
|---|---|---|
"yyyymmdd" |
20260314 | 最も一般的。ファイル名向き |
"yyyy-mm-dd" |
2026-03-14 | 区切り付き(ファイル名では注意が必要) |
"yyyymm" |
202603 | 月次レポート向き |
"yyyy年mm月dd日" |
2026年03月14日 | 日本語表記 |
"yyyymmdd_hhmmss" |
20260314_153045 | 日時付き(Now関数と組み合わせ) |
※ ファイル名に : / は使えないため、"yyyy/mm/dd" や "hh:mm:ss" はファイル名には使わないこと。
—
コード(応用版)– セル値をファイル名に付けて保存 / 連番付き保存
パターン1:セル値をファイル名にする
Sheet1のA1セルの値をファイル名に使って保存する。たとえばA1に「営業部」と入力されていれば「営業部_20260314.xlsm」で保存される。
'============================================================
' ■ セル値+日付でファイル名を付けて保存(応用版)
' → Sheet1のA1セルの値をファイル名に使用
' → ファイル名に使えない文字を自動除去
'============================================================
Sub SaveWithCellValue()
'--- ★書き換えポイント ---
Dim savePath As String
savePath = "C:\Users\(ユーザー名)\Desktop\報告書\" '← 保存先フォルダ
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1") '← セル値を取得するシート
Dim cellValue As String
cellValue = ws.Range("A1").Value '← ファイル名に使うセル
'--- ★ここまで ---
'--- セル値の空欄チェック
If cellValue = "" Then
MsgBox "A1セルが空欄です。ファイル名に使う値を入力してください。", vbExclamation
Exit Sub
End If
'--- ファイル名に使えない文字を除去
Dim invalidChars As Variant
invalidChars = Array("\", "/", ":", "*", "?", """", "<", ">", "|")
Dim ch As Variant
For Each ch In invalidChars
cellValue = Replace(cellValue, ch, "")
Next ch
'--- 今日の日付を取得
Dim dateStr As String
dateStr = Format(Date, "yyyymmdd")
'--- ファイル名を組み立て
Dim fullPath As String
fullPath = savePath & cellValue & "_" & dateStr & ".xlsm"
'--- 保存先フォルダの存在チェック
If Dir(savePath, vbDirectory) = "" Then
MsgBox "保存先フォルダが見つかりません:" & savePath, vbExclamation
Exit Sub
End If
'--- 同名ファイルの上書き防止チェック
If Dir(fullPath) <> "" Then
MsgBox "同名ファイルが既に存在します:" & vbCrLf & fullPath, vbExclamation
Exit Sub
End If
'--- 名前を付けて保存
ThisWorkbook.SaveAs Filename:=fullPath, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled
MsgBox "保存しました:" & vbCrLf & fullPath, vbInformation
End Sub
ポイント:
- セル値にファイル名に使えない文字(
\ / : * ? " < > |)が含まれている場合、Replace関数で自動除去する - セルが空欄のまま実行するとファイル名がおかしくなるため、空欄チェックを入れている
- ファイル名を一括変更したい場合は ファイル名を一括変更(リネーム)する方法 も参照
パターン2:連番付きで保存する
保存先フォルダ内の既存ファイル数を数えて、自動で連番(001、002、003…)を付けて保存する。
'============================================================
' ■ 連番付きで保存(応用版)
' → 保存先フォルダ内のファイル数を数えて連番を付与
' → Format(num, "000") で3桁0埋め
'============================================================
Sub SaveWithSerialNumber()
'--- ★書き換えポイント ---
Dim savePath As String
savePath = "C:\Users\(ユーザー名)\Desktop\報告書\" '← 保存先フォルダ
Dim baseName As String
baseName = "報告書" '← ファイル名のベース部分
Dim ext As String
ext = ".xlsm" '← 拡張子
'--- ★ここまで ---
'--- 保存先フォルダの存在チェック
If Dir(savePath, vbDirectory) = "" Then
MsgBox "保存先フォルダが見つかりません:" & savePath, vbExclamation
Exit Sub
End If
'--- 連番を決定(既存ファイル数 + 1)
Dim num As Long
num = 0
Dim f As String
f = Dir(savePath & baseName & "_*" & ext)
Do While f <> ""
num = num + 1
f = Dir()
Loop
num = num + 1
'--- ファイル名を組み立て(例:報告書_001.xlsm)
Dim fullPath As String
fullPath = savePath & baseName & "_" & Format(num, "000") & ext
'--- 同名ファイルの上書き防止チェック
If Dir(fullPath) <> "" Then
MsgBox "同名ファイルが既に存在します:" & vbCrLf & fullPath, vbExclamation
Exit Sub
End If
'--- 名前を付けて保存
ThisWorkbook.SaveAs Filename:=fullPath, _
FileFormat:=xlOpenXMLWorkbookMacroEnabled
MsgBox "保存しました:" & vbCrLf & fullPath, vbInformation
End Sub
ポイント:
Dir(savePath & baseName & "_*" & ext)でパターンに一致するファイルを列挙し、件数+1で次の連番を決定するFormat(num, "000")で3桁の0埋め(001, 002, 003…)にする- ファイルを途中で削除した場合、連番が飛ぶ可能性がある。厳密な連番管理が必要な場合は、セルに最終番号を保持する方法もある
—
コード(実務版)– 日次レポートの自動保存
日付+部署名(セル値)を組み合わせてファイル名を生成し、確認ダイアログ付きで保存する。日次レポートや月次報告を毎回同じルールで保存したい場合に使える。
以前、日次レポートを毎日手動で保存していた。ファイル名は「日次報告_営業部_20260314.xlsm」のように部署名と日付を入れるルールだったが、入力を間違えて「日時報告」になっていたり、部署名を忘れて「日次報告_20260314」になっていたり。月末に集計しようとしたら、ファイル名がバラバラで検索にも引っかからなかった。このマクロを使い始めてからは、命名ルールが完全に統一された。
'============================================================
' ■ 日次レポートの自動保存(実務版)
' → 日付+セル値(部署名)でファイル名を自動生成
' → 保存先フォルダの存在チェック
' → 同名ファイルの上書き防止
' → 確認ダイアログ付き
' → 保存形式選択可能(.xlsm / .xlsx)
'============================================================
Sub SaveDailyReport()
'--- ★書き換えポイント ---
Dim savePath As String
savePath = "C:\Users\(ユーザー名)\Desktop\日次レポート\" '← 保存先フォルダ
Dim baseName As String
baseName = "日次報告" '← ファイル名のベース部分
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1") '← 部署名を入力するシート
Dim deptCell As String
deptCell = "A1" '← 部署名が入力されているセル
Dim saveAsMacro As Boolean
saveAsMacro = True '← True: .xlsm / False: .xlsx
'--- ★ここまで ---
'--- 部署名(セル値)を取得
Dim deptName As String
deptName = ws.Range(deptCell).Value
If deptName = "" Then
MsgBox deptCell & "セルが空欄です。" & vbCrLf & _
"部署名を入力してからマクロを実行してください。", vbExclamation
Exit Sub
End If
'--- ファイル名に使えない文字を除去
Dim invalidChars As Variant
invalidChars = Array("\", "/", ":", "*", "?", """", "<", ">", "|")
Dim ch As Variant
For Each ch In invalidChars
deptName = Replace(deptName, ch, "")
Next ch
'--- 今日の日付を取得
Dim dateStr As String
dateStr = Format(Date, "yyyymmdd")
'--- 拡張子とファイル形式を決定
Dim ext As String
Dim fileFormat As Long
If saveAsMacro Then
ext = ".xlsm"
fileFormat = 52 ' xlOpenXMLWorkbookMacroEnabled
Else
ext = ".xlsx"
fileFormat = 51 ' xlOpenXMLWorkbook
End If
'--- ファイル名を組み立て(例:日次報告_営業部_20260314.xlsm)
Dim fullPath As String
fullPath = savePath & baseName & "_" & deptName & "_" & dateStr & ext
'--- 保存先フォルダの存在チェック
If Dir(savePath, vbDirectory) = "" Then
MsgBox "保存先フォルダが見つかりません:" & savePath & vbCrLf & vbCrLf & _
"フォルダを作成してから実行してください。", vbExclamation
Exit Sub
End If
'--- 同名ファイルの上書き防止チェック
If Dir(fullPath) <> "" Then
If MsgBox("同名ファイルが既に存在します:" & vbCrLf & fullPath & vbCrLf & vbCrLf & _
"上書きしますか?", vbYesNo + vbExclamation) = vbNo Then
Exit Sub
End If
End If
'--- 確認ダイアログ
Dim msg As String
msg = "以下の内容で保存します。" & vbCrLf & vbCrLf & _
"ファイル名:" & baseName & "_" & deptName & "_" & dateStr & ext & vbCrLf & _
"保存先:" & savePath & vbCrLf & _
"形式:" & IIf(saveAsMacro, ".xlsm(マクロ有効)", ".xlsx(マクロなし)") & vbCrLf & vbCrLf & _
"保存しますか?"
If MsgBox(msg, vbYesNo + vbInformation) = vbNo Then
Exit Sub
End If
'--- 名前を付けて保存
On Error GoTo ErrHandler
Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=fullPath, FileFormat:=fileFormat
Application.DisplayAlerts = True
MsgBox "保存しました:" & vbCrLf & fullPath, vbInformation
Exit Sub
ErrHandler:
Application.DisplayAlerts = True
MsgBox "保存中にエラーが発生しました:" & vbCrLf & Err.Description, vbExclamation
End Sub
書き換えポイント
| 変数 | 説明 | 初期値 |
|---|---|---|
savePath |
保存先フォルダ(末尾に \) |
"C:\Users\(ユーザー名)\Desktop\日次レポート\" |
baseName |
ファイル名のベース部分 | "日次報告" |
ws / deptCell |
部署名が入力されているシートとセル | "Sheet1" / "A1" |
saveAsMacro |
True: .xlsm / False: .xlsx | True |
コードの流れ
- セル値(部署名)の取得: Sheet1のA1セルから部署名を読み取る
- 空欄チェック+不正文字の除去: セルが空ならエラー、ファイル名に使えない文字はReplace
- 日付の取得:
Format(Date, "yyyymmdd")で今日の日付を文字列にする - 保存形式の決定:
saveAsMacroの設定で .xlsm/.xlsx と対応する FileFormat 定数を選択 - ファイル名の組み立て:
baseName & "_" & deptName & "_" & dateStr & extで「日次報告_営業部_20260314.xlsm」を生成 - 保存先フォルダの存在チェック: フォルダがなければエラーメッセージ。フォルダの自動作成は フォルダを自動作成して振り分ける方法 を参照
- 同名ファイルの上書き確認: 同名ファイルがあればYes/Noで上書きを確認
- 確認ダイアログ: ファイル名・保存先・形式を表示して最終確認
- SaveAs で保存:
Application.DisplayAlerts = Falseで上書き確認を抑制(直前の手動確認で代替)。エラー発生時はErrHandlerで必ずTrueに戻す
ポイント:
Application.DisplayAlerts = Falseは直前の手動確認ダイアログと同名ファイルチェックで安全を確保した上で使用している。エラーハンドリング(On Error GoTo ErrHandler)で、エラー発生時も必ずTrueに戻す- 保存先フォルダが存在しない場合のフォルダ自動作成は フォルダを自動作成して振り分ける方法 を参照
- PDF形式で保存したい場合は
ExportAsFixedFormatメソッドを使う。詳しくは ExcelファイルをPDFに一括変換する方法 を参照 - 保存後のバックアップは 指定フォルダのファイルを自動バックアップする方法 を参照
—
よくある落とし穴5選
1. 保存先フォルダが存在しなくてエラー
原因: savePath に指定したフォルダが存在しない。SaveAsはフォルダを自動作成しない。
対策: Dir(savePath, vbDirectory) で保存先フォルダの存在を確認してからSaveAsを実行する。フォルダを自動で作りたい場合は フォルダを自動作成して振り分ける方法 を参照。
2. .xlsm なのにマクロが保存されない
原因: FileFormat に xlOpenXMLWorkbook(51、.xlsx用)を指定してしまった。.xlsxはマクロを含まない形式なので、マクロが消える。
対策: .xlsm で保存する場合は FileFormat:=xlOpenXMLWorkbookMacroEnabled(52)を指定する。拡張子とFileFormat定数の対応を確認すること。
| 拡張子 | FileFormat定数 | 値 |
|---|---|---|
| .xlsm | xlOpenXMLWorkbookMacroEnabled | 52 |
| .xlsx | xlOpenXMLWorkbook | 51 |
| .csv | xlCSV | 6 |
| .xls | xlExcel8 | 56 |
3. ファイル名に「:」「/」が含まれてエラー
原因: Format(Date, "yyyy/mm/dd") のようにファイル名に使えない文字を含む書式を使った。Format(Now, "hh:mm:ss") の : も同様。
対策: ファイル名に使えない文字は \ / : * ? " < > | の9種類。日付の区切りには _ や - を使うか、区切りなしの "yyyymmdd" を使う。
4. 同名ファイルが無警告で上書きされた
原因: Application.DisplayAlerts = False の状態でSaveAsを実行し、既存の同名ファイルが上書きされた。
対策: SaveAs前に Dir(fullPath) で同名ファイルの存在をチェックする。この記事のコードではすべてのバージョンにチェックを組み込んでいる。
5. セル値が空欄でファイル名がおかしくなる
原因: セル値をファイル名に使う際に、セルが空欄のまま実行した。結果「報告書__20260314.xlsm」のように _ が連続する。
対策: セル値を取得した直後に If cellValue = "" Then で空欄チェックを行い、空欄ならMsgBoxで通知して処理を中止する。
VBAでSaveAs時にエラー1004が出るときの対処法
「名前を付けて保存でエラーが出る」という場合、原因はファイル名にWindowsで使えない文字(/ \ : * ? " < > |)が含まれていることだ。セル値をファイル名に使う場合は、Replace関数で禁止文字を除去してから保存すれば解決する。
VBAで日付付きファイル名が意図しない形式になるときの対処法
「ファイル名が'20260314'ではなく'3/14/2026'になってしまう」という場合、原因はFormat関数を使わずにDate関数の戻り値をそのまま文字列に結合していることだ。Format(Date, "yyyymmdd") で明示的に形式を指定すれば、OSの日付設定に依存せず確実に「20260314」形式になる。
---
FAQ
Q1: SaveAs後に元のファイルはどうなる?
元のファイルはそのまま残る。SaveAsは「名前を付けて保存」なので、元ファイルは変更されない。ただし、SaveAs実行後はVBAが動いているブックの名前が新しいファイル名に変わる点に注意。
Q2: .xlsx(マクロなし)で保存したい場合は?
FileFormat:=xlOpenXMLWorkbook(51)を指定する。ただしマクロは保存されない。マクロ付きブックを .xlsx で保存すると、次にそのファイルを開いたときにマクロは含まれていない。マクロを残したい場合は .xlsm(52)を使うこと。
Q3: PDF形式で保存したい場合は?
SaveAsではなく ExportAsFixedFormat メソッドを使う。詳しくは ExcelファイルをPDFに一括変換する方法 を参照。
Q4: ファイル名に時刻も含めたい場合は?
Format(Now, "yyyymmdd_hhmmss") を使う。Now 関数は現在の日時を返すので、「20260314_153045」のようなファイル名になる。同じ日に複数回保存する場合に、ファイル名の重複を避けられる。
Q5: 既存ファイルを上書き保存したい場合は?
同名ファイルチェックのIf文を削除するか、実務版のように上書き確認ダイアログを使う。Application.DisplayAlerts = False で上書き確認を抑制する場合は、必ず処理後に True に戻すこと。
---
まとめ
この記事で、VBAを使って日付やセル値をファイル名に付けて自動保存できるようになった。
- 基本版:
Format(Date, "yyyymmdd")で日付をファイル名に付けてSaveAs - 応用版: セル値をファイル名に使用 / 連番付きで保存
- 実務版: 日付+部署名で日次レポートを自動保存(確認ダイアログ付き)
重要:SaveAsは同名ファイルを上書きする可能性がある。必ず同名チェックを入れること。
関連記事
- ファイル名を後から一括変更したい場合は ファイル名を一括変更(リネーム)する方法 を参照
- 保存後のバックアップを自動化したい場合は 指定フォルダのファイルを自動バックアップする方法 を参照
---
次にやりたくなること
- ExcelファイルをPDFに一括変換する方法: 日付付きで保存したExcelをPDFにも変換したい場合に便利
- フォルダを自動作成して振り分ける方法: 保存先フォルダの自動作成や、保存後のファイル整理をしたい場合に使える
- 指定フォルダのファイルを自動バックアップする方法: 日付付き保存と組み合わせて、日次バックアップを自動化したい場合に
- ファイル名を一括変更(リネーム)する方法: 過去に保存したファイルの命名規則を後から一括で揃えたい場合に
- マクロをボタン1つで実行する方法: 保存マクロをシート上のボタンに割り当てて、ワンクリック保存を実現したい場合に
---
もっとカスタマイズしたい場合
「部署ごとにフォルダを分けて保存したい」「連番を自動採番したい」「テンプレートから差し込みで複数ファイルを一括保存したい」「定期的に自動実行したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。
相談時に以下の情報があるとスムーズです:
- Excel のバージョン / OS
- 保存先フォルダの構成
- ファイル名の命名ルール(例:日付+部署名+連番)
- 保存形式(.xlsm / .xlsx / .pdf / .csv)
- 保存頻度(毎日 / 毎週 / 毎月)


コメント