【VBA】日付やセル値でファイル名を付けて自動保存する方法(コピペOK)

VBA
  1. 完成イメージ(Before / After)
    1. どんな場面で使う?
  2. 実行前の準備
    1. Excelをマクロ有効ブック(.xlsm)で保存する
    2. 保存先フォルダを確認する
  3. 手順(コピペ → 実行まで約5分)
    1. ステップ1:VBEを開いてコードを貼り付ける
    2. ステップ2:保存先パスを書き換える
    3. ステップ3:マクロを実行する
  4. コード(基本版)– 日付をファイル名に付けて保存
    1. 書き換えポイント
    2. コードの流れ
    3. Format関数の日付書式パターン
  5. コード(応用版)– セル値をファイル名に付けて保存 / 連番付き保存
    1. パターン1:セル値をファイル名にする
    2. パターン2:連番付きで保存する
  6. コード(実務版)– 日次レポートの自動保存
    1. 書き換えポイント
    2. コードの流れ
  7. よくある落とし穴5選
    1. 1. 保存先フォルダが存在しなくてエラー
    2. 2. .xlsm なのにマクロが保存されない
    3. 3. ファイル名に「:」「/」が含まれてエラー
    4. 4. 同名ファイルが無警告で上書きされた
    5. 5. セル値が空欄でファイル名がおかしくなる
    6. VBAでSaveAs時にエラー1004が出るときの対処法
    7. VBAで日付付きファイル名が意図しない形式になるときの対処法
  8. FAQ
    1. Q1: SaveAs後に元のファイルはどうなる?
    2. Q2: .xlsx(マクロなし)で保存したい場合は?
    3. Q3: PDF形式で保存したい場合は?
    4. Q4: ファイル名に時刻も含めたい場合は?
    5. Q5: 既存ファイルを上書き保存したい場合は?
  9. まとめ
    1. 関連記事
  10. 次にやりたくなること
  11. もっとカスタマイズしたい場合

完成イメージ(Before / After)

Before(手入力で日付を付ける)

Before(実行前)のExcel画面
A B
1 ファイル名 問題
2 検査報告_20260418.xlsx 手入力で日付を間違える
3 検査報告_20260417.xlsx 昨日の日付を付けてしまった
4 検査報告_0416.xlsx 命名ルールがバラバラ

After(VBAで自動保存)

After(実行後)のExcel画面
A B
1 ファイル名 結果
2 検査報告_20260416.xlsm 自動保存済み
3 検査報告_20260417.xlsm 自動保存済み
4 検査報告_20260418.xlsm 自動保存済み

ボタン1つで今日の日付が正確に入る。命名ルールが統一される。

どんな場面で使う?

  • 品質管理: 毎日の検査レポートを「検査報告_日付.xlsx」で日付付き保存する
  • 事務: 月次報告書を「月次報告_2026年3月_営業部.xlsx」のように部署名+年月で保存する
  • 経理: 請求書や見積書をPDF保存するとき、取引先名+日付をファイル名に自動で付ける
  • どんな職種でも: 「ファイル名に日付を手入力している」なら、この自動化が使える

実行前の準備

Excelをマクロ有効ブック(.xlsm)で保存する

  1. Excelを開く(新規でも既存でもOK)
  2. 「ファイル」→「名前を付けて保存」
  3. ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存

.xlsx のままだとマクロは保存できない。必ず .xlsm にすること。

保存先フォルダを確認する

保存先のフォルダが存在しない場合、SaveAsはエラーになる。エクスプローラーで保存先フォルダが存在することを確認しておくこと。

パスの確認方法:エクスプローラーでフォルダを開き、アドレスバーをクリックするとパスが表示される。それをコピーして使う。

手順(コピペ → 実行まで約5分)

ステップ1:VBEを開いてコードを貼り付ける

  1. Alt + F11 でVBE(コードを書く画面)を開く
  2. メニュー「挿入」→「標準モジュール
  3. 下の「コード(基本版)」「コード(応用版)」「コード(実務版)」のいずれかをコピーしてコードウィンドウに貼り付ける

一般的にはAlt + F11で開けるが、企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。ボタンからワンクリックで実行したい場合は マクロをボタン1つで実行する方法 を参照。

ステップ2:保存先パスを書き換える

コード内の savePath を、自分の保存先フォルダのパスに書き換える。

パスの末尾に \ を忘れないこと。

ステップ3:マクロを実行する

  1. Alt + F8 を押す
  2. マクロ名を選択して「実行」
  3. 保存先フォルダにファイルが作成されたことを確認する

コード(基本版)– 日付をファイル名に付けて保存

まずはこれだけで動く。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 ファイル名のベース部分 "報告書"

コードの流れ

  1. Format(Date, “yyyymmdd”): 今日の日付を「20260314」形式の文字列に変換する
  2. ファイル名の組み立て: baseName & "_" & dateStr & ".xlsm" で「報告書_20260314.xlsm」を生成
  3. Dir() で保存先フォルダの存在チェック: フォルダがなければエラーメッセージを出して終了
  4. Dir() で同名ファイルチェック: 同名ファイルがあれば警告して終了(上書き防止)
  5. SaveAs で保存: FileFormat:=xlOpenXMLWorkbookMacroEnabled で .xlsm 形式として保存

ポイント:

  • Date 関数は今日の日付を返す。Now 関数を使えば日時(年月日+時分秒)を取得できる
  • FileFormatxlOpenXMLWorkbookMacroEnabled(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

コードの流れ

  1. セル値(部署名)の取得: Sheet1のA1セルから部署名を読み取る
  2. 空欄チェック+不正文字の除去: セルが空ならエラー、ファイル名に使えない文字はReplace
  3. 日付の取得: Format(Date, "yyyymmdd") で今日の日付を文字列にする
  4. 保存形式の決定: saveAsMacro の設定で .xlsm/.xlsx と対応する FileFormat 定数を選択
  5. ファイル名の組み立て: baseName & "_" & deptName & "_" & dateStr & ext で「日次報告_営業部_20260314.xlsm」を生成
  6. 保存先フォルダの存在チェック: フォルダがなければエラーメッセージ。フォルダの自動作成は フォルダを自動作成して振り分ける方法 を参照
  7. 同名ファイルの上書き確認: 同名ファイルがあればYes/Noで上書きを確認
  8. 確認ダイアログ: ファイル名・保存先・形式を表示して最終確認
  9. SaveAs で保存: Application.DisplayAlerts = False で上書き確認を抑制(直前の手動確認で代替)。エラー発生時はErrHandlerで必ず True に戻す

ポイント:

よくある落とし穴5選

1. 保存先フォルダが存在しなくてエラー

原因: savePath に指定したフォルダが存在しない。SaveAsはフォルダを自動作成しない。

対策: Dir(savePath, vbDirectory) で保存先フォルダの存在を確認してからSaveAsを実行する。フォルダを自動で作りたい場合は フォルダを自動作成して振り分ける方法 を参照。

2. .xlsm なのにマクロが保存されない

原因: FileFormatxlOpenXMLWorkbook(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 のバージョン / OS
  • 保存先フォルダの構成
  • ファイル名の命名ルール(例:日付+部署名+連番)
  • 保存形式(.xlsm / .xlsx / .pdf / .csv)
  • 保存頻度(毎日 / 毎週 / 毎月)

コメント

タイトルとURLをコピーしました