【入門編】【中級者向け】添付ファイルのファイル名に「送信日」と「連番」を自動付与するリネーム処理 – Outlook VBA解析バイブル

スポンサーリンク

こんにちは!バックオフィスや現場の業務自動化を愛してやまない、君の専属チーフアーキテクトだ。

「マクロの記録」ボタンを押してExcelを操作していた時代から一歩進み、ついにOutlookの領域に踏み込んできたんだね。素晴らしい挑戦だ。心から歓迎するよ。

さて、今日私たちが挑むのは、現場でよくあるこんな悩みだ。

> 「毎日のように取引先に送る添付ファイル、毎回手作業でファイル名を『日付+連番』にリネームして添付していませんか? ファイル名がバラバラだと、後から検索する時も一苦労だし、何よりヒューマンエラーの元ですよね……」

そう。ファイルを送信する直前に、自動で「送信日」と「連番」を付与してリネームし、スマートに添付する。今回は、この実用性抜群のテクニックを授けよう。

ここをクリアすれば、君はもう「初心者」のラベルを卒業し、現場をリードする「自動化エンジニア」の仲間入りだ。さあ、深呼吸して、私の後に続き給え。

—

1. なぜ「Outlook単体」でのファイル操作は一筋縄でいかないのか?

まず、プログラミングの世界に入る前に、私たちがこれから超えるべき「壁」の正体を知っておこう。

OutlookのVBA(`MailItem`オブジェクト)には、実は「既存のファイルをパソコン上で直接リネームする機能」は備わっていない。メールにファイルを添付するメソッド(`Attachments.Add`)はあるが、それは「指定したパスにあるファイルをコピーして添付する」だけだからだ。

したがって、今回の自動化のアーキテクチャ(設計)はこうなる。

1. 元となるファイルを、VBAの力で別の場所に複製(コピー)する。
2. その際、ファイル名を「元の名前 + 送信日 + 連番」に書き換える。
3. 書き換えた新しいファイルをOutlookのメールに添付する。
4. (必要に応じて)一時的に作ったファイルを掃除する。

この「OSのファイル操作(Scripting.FileSystemObject)」と「Outlookのメール操作(MailItem)」を美しく連携させることこそが、今回の最大のキモなのだ。

—

2. 【実践】送信日と連番を自動付与するマクロ全コード

百聞は一見に如かず。開発の現場でそのままコピペして、即座に動かせる完全版のコードを授けよう。
OutlookのVBAエディタ(`Alt` + `F11`)を開き、標準モジュールに貼り付けてほしい。

Option Explicit

Sub SendEmailWithRenamedAttachment()
‘ =========================================================================
‘ 目的: 添付ファイルのファイル名に「送信日」と「連番」を自動付与して送信する
‘ ターゲット層: マクロの記録から脱却し、実務で使えるスキルを習得したい中級者
‘ =========================================================================

Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Dim fso As Object
Dim originalPath As String
Dim folderPath As String
Dim originalName As String
Dim ext As String
Dim sendDateStr As String
Dim seqNumber As String
Dim newFileName As String
Dim newFilePath As String

‘ — 1. 設定エリア(君の環境に合わせてパスやファイル名を書き換えてね) —
originalPath = “C:\Work\Report.xlsx” ‘ 添付したい元のファイルのフルパス
seqNumber = “_01” ‘ 必要に応じた連番(自動採番にすることも可能)

‘ — 2. ファイルの存在チェック(エラーハンドリングの基本) —
Set fso = CreateObject(“Scripting.FileSystemObject”)

If Not fso.FileExists(originalPath) Then
MsgBox “指定された元ファイルが見つかりません。” & vbCrLf & originalPath, vbCritical, “ファイルエラー”
Exit Sub
End If

‘ — 3. 送信日文字列の生成(例: 20231025) —
sendDateStr = Format(Date, “yyyymmdd”)

‘ — 4. ファイルパスの分解と新しいファイル名の組み立て —
‘ 例: “Report.xlsx” から 拡張子(.xlsx) と 本体(“Report”) を分離する
folderPath = fso.GetParentFolderName(originalPath) & “\”
originalName = fso.GetBaseName(originalPath)
ext = fso.GetExtensionName(originalPath)

‘ 新しいファイル名: 元の名前 + “_” + 送信日 + 連番 + 拡張子
‘ 結果イメージ: Report_20231025_01.xlsx
newFileName = originalName & “_” & sendDateStr & seqNumber & “.” & ext
newFilePath = folderPath & newFileName

‘ — 5. 既存のファイル名でコピー(リネームに相当する処理) —
‘ Trueを指定することで、同名ファイルが存在する場合は上書きする
fso.CopyFile originalPath, newFilePath, True

‘ — 6. Outlookメールアイテムの生成と添付 —
Set olApp = Outlook.Application
Set olMail = olApp.CreateItem(olMailItem)

With olMail
.To = “client@example.com”
.Subject = “【ご報告】本日の業務レポート(” & Format(Date, “yyyy年m月d日”) & “)”
.Body = “関係者各位” & vbCrLf & vbCrLf & _
“お疲れ様です。本日のレポートを添付いたします。” & vbCrLf & _
“ご確認のほど、よろしくお願いいたします。”

‘ リネームされた新しいファイルをメールに添付
.Attachments.Add newFilePath

‘ 【重要】すぐに送信せず、画面に下書きを表示して人間の目で最終確認させる
.Display
End With

‘ — 7. オブジェクトの解放(メモリリークを防ぐプロの作法) —
Set olMail = Nothing
Set olApp = Nothing
Set fso = Nothing

MsgBox “ファイルの準備が完了しました。内容を確認して送信してください。”, vbInformation, “処理完了”
End Sub

—

3. コードの急所を解説!プロが教える「3つのこだわり」

このコードがなぜ優れているのか、エンジニアの視点から3つのポイントに絞って解説しよう。ここを理解すれば、どんな応用にも耐えられるようになる。

① `Scripting.FileSystemObject` の活用

VBAには標準でファイル操作の命令もあるが、少し古い仕様のものが多くクセが強い。そこでプロは、Windows環境で非常に安定して動作する `FileSystemObject`(通称FSO)を `CreateObject` で呼び出して使う。これを使うことで、ファイルの存在確認(`FileExists`)や、フォルダパス・拡張子の切り出し(`GetBaseName`, `GetExtensionName`)が驚くほど安全かつエレガントに記述できるんだ。

② メモリリークを許さない「オブジェクト解放」の美学

コードの後半にある `Set olMail = Nothing`。これ、何のために書いているか分かるかい?
VBAでは、オブジェクト変数(`Application`や`MailItem`など)を使うと、裏側でパソコンのメモリ(RAM)が消費される。プログラムが終わった時に `Nothing` を代入してメモリを綺麗に掃除してあげるのが、「分かっているエンジニア」の作法だ。これをサボると、Outlookがフリーズする原因になるので必ずセットで覚えよう。

③ `.Display` による「ヒューマン・イン・ザ・ループ」

自動化において、「すべてを完全に自動化して勝手に送信する」のは、実は非常にリスクが高い。「宛先を間違えたらどうする?」「ファイルを添付し忘れたらどうする?」――だからこそ、送信直前の一歩手前で `.Display` メソッドを使い、人間の目で画面を確認させてから送信ボタンを押させる。この安全設計が、実務の現場では何よりも重宝されるんだよ。

—

4. 初学者が陥りやすい「罠」と回避策

実際にコードを動かす中で、君が必ずつまずくであろうポイントを先回りして伝授しておこう。

  • 罠1:ファイルが開いたまま上書きできない
  • 原因: 添付元のExcelやWordファイルがバックグラウンドで開いたままになっていると、FSOの `CopyFile` でエラー(権限エラー)が起きて止まる。
  • 対策: マクロを実行する前に、必ず元ファイルは閉じておくこと。
  • 罠2:セキュリティの警告やマクロが無効になる
  • 原因: Outlookのセキュリティ設定でVBAが無効化されている。
  • 対策: 「ファイル」>「オプション」>「セキュリティ センター」>「セキュリティ センターの設定」から「マクロの設定」を見直し、信頼できる場所(Trusted Locations)にマクロ付きファイルを置くか、警告を表示して有効にする設定にしよう。

—

さあ、次のステージへ進もう

どうだい? 「送信日と連番の自動付与」という一見難しそうなテーマも、OSのファイル操作とOutlookのオブジェクト操作を適切に組み合わせれば、たったこれだけのスマートなコードで実現できるんだ。

ここをクリアした君なら、次は「連番を前回の続きから自動でカウントアップさせる方法(Excelやテキストファイルに状態を保存するテクニック)」や、「宛先ごとに添付ファイルを自動で切り替えるループ処理」など、さらなる高みへ進む資格が十分にある。

焦る必要はない。まずは今日のコードを自分の手で動かし、コンソールに緑の光が灯る感動を味わってほしい。
分からないことがあれば、いつでも私のところに相談に来るといい。君のエンジニアとしての成長を、私はいつでも応援しているよ。

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