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

【VBA】日付やセル値でファイル名を付けて自動保存する方法の解説用アイキャッチ画像 VBA
  1. 手入力の日付ミスがゼロになる(Before / After)
    1. この保存マクロが効く場面
  2. Save・SaveAs・SaveCopyAs:どれを使うかを先に決める
  3. 先に保存先フォルダのパスを控えておく
    1. 保存先フォルダを確認する
  4. STEP1:日付付きファイル名で保存する(基本版)
    1. 基本版で書き換える2つの変数
    2. 保存までの5ステップ
    3. Format関数の日付書式パターン
  5. STEP2:セル値・連番をファイル名に使う(応用版)
    1. パターン1:セル値をファイル名にする
    2. パターン2:連番付きで保存する
  6. STEP3:日次レポートの保存を完全にルール化する(実務版)
    1. 実務版で書き換える4項目
    2. 実務版が保存までにやる9つのこと
  7. マクロが消えた・勝手に上書きされた:保存系の事故5つ
    1. 1. 保存先フォルダが存在しなくてエラー
    2. 2. .xlsm なのにマクロが保存されない
    3. 3. ファイル名に「:」「/」が含まれてエラー
    4. 4. 同名ファイルが無警告で上書きされた
    5. 5. セル値が空欄でファイル名がおかしくなる
    6. VBAでSaveAs時にエラー1004が出るときの対処法
    7. VBAで日付付きファイル名が意図しない形式になるときの対処法
  8. よくある質問(元ファイル・xlsx・PDF・時刻付き)
    1. Q1: SaveAs後に元のファイルはどうなる?
    2. Q2: .xlsx(マクロなし)で保存したい場合は?
    3. Q3: PDF形式で保存したい場合は?
    4. Q4: ファイル名に時刻も含めたい場合は?
    5. Q5: 既存ファイルを上書き保存したい場合は?
    6. Q6: ファイル名の日付を「前日」や「前月」にしたい
    7. Q7: OneDriveやネットワークドライブに保存する場合の注意は?
  9. ボタン運用か、閉じる前の自動実行か
  10. まとめ:FormatとSaveAs、事故防止は2つのDirチェック
    1. 保存の自動化とセットで読む関連記事
  11. 次のステップ:PDF化・バックアップ・ボタン化
  12. 命名ルールが複雑な場合はご相談を

手入力の日付ミスがゼロになる(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保存するとき、取引先名+日付をファイル名に自動で付ける
  • どんな職種でも: 「ファイル名に日付を手入力している」なら、この自動化が使える

Save・SaveAs・SaveCopyAs:どれを使うかを先に決める

VBAの保存メソッドは3つあり、挙動がまったく違う。ここを混同すると「マクロが動いているブックの名前が勝手に変わった」「元ファイルのつもりが別ファイルを編集していた」という混乱が起きる。この記事で使うのはSaveAsだが、目的によっては別のメソッドが正解になる。

メソッド 動き 向いている目的
Save 今のファイルに上書き保存 作業中の保存。ファイル名は変わらない
SaveAs 新しい名前で保存し、開いているブックが新ファイルに切り替わる 「今日の分」として名前を確定させたいとき(本記事)
SaveCopyAs コピーを別名で保存し、開いているブックは元のまま 作業を続けながら日次スナップショットだけ残したいとき

意外と知られていないのがSaveCopyAsだ。たとえば「作業用のブックはそのままで、毎日17時時点のコピーを日付付きで残したい」という用途なら、SaveAsよりSaveCopyAsのほうが適している。SaveAsだと保存のたびに開いているブック自体が新しいファイルへ切り替わるため、翌日また元の作業ファイルを開き直す一手間が発生する。この記事のコードで ThisWorkbook.SaveAs ... の行を ThisWorkbook.SaveCopyAs Filename:=fullPath に変えるだけで切り替えられる(SaveCopyAsはFileFormat指定が不要で、元と同じ形式で保存される)。

先に保存先フォルダのパスを控えておく

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

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

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

STEP1:日付付きファイル名で保存する(基本版)

まずはこれだけで動く。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

基本版で書き換える2つの変数

変数 説明 初期値
savePath 保存先フォルダ(末尾に \ "C:\Users\(ユーザー名)\Desktop\報告書\"
baseName ファイル名のベース部分 "報告書"

保存までの5ステップ

  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つだけ強く勧めたいのが、日付は必ず「yyyymmdd」の桁固定・年から始まる形式にすることだ。理由は並び順にある。この形式なら、エクスプローラーでファイル名順に並べたとき辞書順=時系列順になり、「20260314」の次に「20260315」が来る。「3月14日」や「20260314」と「2026314」(0埋めなし)が混ざったフォルダは、並べ替えても時系列にならず、月末に該当ファイルを探す時間が地味に積み上がる。命名をコードで固定する価値の半分は、この「探す時間の削減」にあると思っている。

STEP2:セル値・連番をファイル名に使う(応用版)

パターン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…)にする
  • ファイルを途中で削除した場合、連番が飛ぶ可能性がある。厳密な連番管理が必要な場合は、セルに最終番号を保持する方法もある

補足すると、この「件数+1」方式の連番は途中のファイルを削除すると番号が重複し得る点に注意してほしい。たとえば001〜005のうち003を削除すると、既存は4件なので次が005になり、既存の005とぶつかる(同名チェックで止まるので上書きはされないが、保存に失敗する)。番号の欠番や削除が日常的にある運用なら、連番よりも日付+時刻方式のほうがトラブルが少ない。

STEP3:日次レポートの保存を完全にルール化する(実務版)

日付+部署名(セル値)を組み合わせてファイル名を生成し、確認ダイアログ付きで保存する。日次レポートや月次報告を毎回同じルールで保存したい場合に使える。

以前、日次レポートを毎日手動で保存していた。ファイル名は「日次報告_営業部_20260314.xlsm」のように部署名と日付を入れるルールだったが、入力を間違えて「日時報告」になっていたり、部署名を忘れて「日次報告_20260314」になっていたり。月末に集計しようとしたら、ファイル名がバラバラで検索にも引っかからなかった。このマクロを使い始めてからは、命名ルールが完全に統一された。

検証環境: Microsoft 365(Windows 11)で、日次レポートの保存を半年以上この形で運用して確認している。保存自体は一瞬で、体感の変化はスピードよりも「ファイル名を考えなくてよくなった」ことと「月末の検索でヒットしないファイルがなくなった」ことのほうが大きい。


'============================================================
' ■ 日次レポートの自動保存(実務版)
'   → 日付+セル値(部署名)でファイル名を自動生成
'   → 保存先フォルダの存在チェック
'   → 同名ファイルの上書き防止
'   → 確認ダイアログ付き
'   → 保存形式選択可能(.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

実務版で書き換える4項目

変数 説明 初期値
savePath 保存先フォルダ(末尾に \ "C:\Users\(ユーザー名)\Desktop\日次レポート\"
baseName ファイル名のベース部分 "日次報告"
ws / deptCell 部署名が入力されているシートとセル "Sheet1" / "A1"
saveAsMacro True: .xlsm / False: .xlsx True

実務版が保存までにやる9つのこと

  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) で同名ファイルの存在をチェックする。この記事のコードではすべてのバージョンにチェックを組み込んでいる。

自分がこれをやったのは、同じ日に2回目の保存をしたときだった。午前に保存した報告書へ午後に追記して再実行したところ、同じ日付のファイル名が生成されて午前版が消えた。上書き自体は意図どおりのこともあるので、「無警告で消える」ことが問題だと考えて、以降は必ずDirチェック+確認ダイアログの2段構えにしている。同日に版を分けたい場合は、FAQのQ4で紹介している時刻付きファイル名にするのが手っ取り早い。

5. セル値が空欄でファイル名がおかしくなる

原因: セル値をファイル名に使う際に、セルが空欄のまま実行した。結果「報告書__20260314.xlsm」のように _ が連続する。

対策: セル値を取得した直後に If cellValue = "" Then で空欄チェックを行い、空欄ならMsgBoxで通知して処理を中止する。

VBAでSaveAs時にエラー1004が出るときの対処法

「名前を付けて保存でエラーが出る」という場合、原因はファイル名にWindowsで使えない文字(/ \ : * ? " < > |)が含まれていることだ。セル値をファイル名に使う場合は、Replace関数で禁止文字を除去してから保存すれば解決する。

VBAで日付付きファイル名が意図しない形式になるときの対処法

「ファイル名が'20260314'ではなく'3/14/2026'になってしまう」という場合、原因はFormat関数を使わずにDate関数の戻り値をそのまま文字列に結合していることだ。Format(Date, "yyyymmdd") で明示的に形式を指定すれば、OSの日付設定に依存せず確実に「20260314」形式になる。

よくある質問(元ファイル・xlsx・PDF・時刻付き)

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 に戻すこと。

Q6: ファイル名の日付を「前日」や「前月」にしたい

夜間バッチや月初の締め処理では「今日」ではなく前日・前月の日付を付けたいことが多い。前日なら Format(Date - 1, "yyyymmdd") でいい。前月は少しコツが必要で、Format(DateSerial(Year(Date), Month(Date), 0), "yyyymm") と書くと「今月の0日=前月末日」が得られるため、月初に実行しても正しく前月の年月になる。1月に実行した場合も自動で「前年12月」になるので、年またぎを自分で場合分けする必要はない。

Q7: OneDriveやネットワークドライブに保存する場合の注意は?

ネットワークドライブはUNCパス(\\サーバー名\共有名\...)を savePath に指定すればそのまま動く。注意が必要なのはOneDrive配下で、同期の状態によっては開いているブックのパスが https:// 形式になっていることがあり、Dir でのチェックがうまく働かない場合がある。OneDrive配下で運用するなら、エクスプローラー上のローカルパス(C:\Users\ユーザー名\OneDrive\...)を指定し、初回は同名チェックと保存が意図どおり動くかを新規フォルダで試してから本運用に入るのが安全だ。

ボタン運用か、閉じる前の自動実行か

このマクロをどう実行させるかも、運用の定着を左右する。自分が試した結論は「シート上のボタンに割り当てる」が一番事故が少ない、だ。マクロをボタン1つで実行する方法 で「日付保存」ボタンを作っておけば、保存のタイミングを自分で決められる。

一方、「ブックを閉じるときに自動で日付保存する」(Workbook_BeforeCloseイベントに仕込む)方法も技術的には可能だが、個人的には勧めない。ちょっと開いて閉じただけの日にもファイルが増えていき、フォルダが「中身の変わらない日付違いファイル」だらけになるからだ。保存は「意味のある区切りで、人が判断して押す」ほうが、あとから見返すファイル群の質が上がる。どうしても押し忘れが心配なら、閉じる前に「今日の日付ファイルがまだ無ければ保存を促すメッセージだけ出す」形にとどめるのが、自動保存と手動判断のバランスとしてちょうどいい。

まとめ:FormatとSaveAs、事故防止は2つのDirチェック

この記事で、VBAを使って日付やセル値をファイル名に付けて自動保存できるようになった。

  • 基本版: Format(Date, "yyyymmdd") で日付をファイル名に付けてSaveAs
  • 応用版: セル値をファイル名に使用 / 連番付きで保存
  • 実務版: 日付+部署名で日次レポートを自動保存(確認ダイアログ付き)

重要:SaveAsは同名ファイルを上書きする可能性がある。必ず同名チェックを入れること。

保存の自動化とセットで読む関連記事

次のステップ:PDF化・バックアップ・ボタン化

命名ルールが複雑な場合はご相談を

「部署ごとにフォルダを分けて保存したい」「連番を自動採番したい」「テンプレートから差し込みで複数ファイルを一括保存したい」「定期的に自動実行したい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。

相談時に以下の情報があるとスムーズです:

  • Excel のバージョン / OS
  • 保存先フォルダの構成
  • ファイル名の命名ルール(例:日付+部署名+連番)
  • 保存形式(.xlsm / .xlsx / .pdf / .csv)
  • 保存頻度(毎日 / 毎週 / 毎月)

コメント

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