【入門編】【初心者向け】特定のフォルダに格納されたファイルをファイル名順にループ処理で一括添付する自動化ツール – Outlook VBA解析バイブル

スポンサーリンク

こんにちは! 業務自動化の現場を駆け抜けてきたシニア・アーキテクトの私です。

「毎日、決まったフォルダにあるファイルをメールに添付して送信する……」
そんな地味だけど絶対にミスが許されないルーチンワーク、あなたも抱えていませんか? マクロの記録から一歩踏み出し、自分の手でOutlookを自在に操れるようになると、業務の景色が一変します。

今回は、「指定したフォルダ内のファイルを、ファイル名順にすべて自動でメールに添付する」という、実務で100%役立つ極上の自動化ツールを一緒に作っていきましょう。

ここをクリアすれば、あなたも立派なOutlook VBA使いの仲間入りです。さあ、しっかりと温かく導いていきますので、ついてきてくださいね!

—

1. なぜ「手動」ではなく「VBA×FSO」なのか?

実務でメール添付の自動化を行うとき、ただOutlookの機能だけを使おうとすると、ファイル選択ダイアログが立ち上がってしまったり、順番がバラバラになったりと、意外なストレスにぶつかります。

そこで登場するのが、ファイルシステムの神様である FSO(FileSystemObject) です。
これを使うと、まるで自分がエクスプローラーを操作しているかのように、フォルダの中身を綺麗に整列(ファイル名順)させながら、一網打尽にメールへアタッチできるようになります。

まずは、今回目指すゴールの全体像をイメージしてください。

1. 目的のフォルダを指定する
2. フォルダの中にあるファイルを「名前順」にすべて拾い上げる
3. 新しいメールを作成し、拾ったファイルをすべてガチャコンと添付する
4. 宛件や本文をセットして、あとはあなたの一押し(あるいは自動送信)を待つ状態にする

シンプルでしょう? でも、この裏側にはVBAを安定稼働させるための「知見」がぎっしり詰まっています。早速コードを見ていきましょう。

—

2. 実装コード:一括添付マクロの全貌

以下のコードを、あなたのOutlookのVBAエディタ(`Alt + F11` で開けます)の標準モジュールに貼り付けてください。

Sub AttachFilesSequentially()
‘ =========================================================================
‘ 処理名: 指定フォルダ内のファイルをファイル名順に一括添付するマクロ
‘ 備考: 初学者の方でも迷わないよう、オブジェクトの生成から解放までを丁寧に記述しています
‘ =========================================================================

Dim fso As Object ‘ FileSystemObjectを格納する変数
Dim targetFolder As Object ‘ 対象フォルダを格納する変数
Dim targetFile As Object ‘ 個々のファイルを格納する変数
Dim fileList As Object ‘ ファイル名順に並び替えるためのコレクション(Dictionary等でも可)

Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem

‘ 【設定エリア】 ここをご自身の環境に合わせて書き換えてください
Const FOLDER_PATH As String = “C:\Your\Target\Folder\” ‘ 最後に必ず「\」を入れてください
Const MAIL_TO As String = “sample@example.com”
Const MAIL_SUBJECT As String = “【自動送信】添付ファイル一覧”

On Error GoTo ErrorHandler

‘ 1. FileSystemObjectの生成(ファイルやフォルダを触るための必須道具)
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ フォルダの存在確認(エラーを防ぐエンジニアの優しさです)
If Not fso.FolderExists(FOLDER_PATH) Then
MsgBox “指定されたフォルダが存在しません:” & vbCrLf & FOLDER_PATH, vbCritical, “パスエラー”
Exit Sub
End If

Set targetFolder = fso.GetFolder(FOLDER_PATH)

‘ 2. Outlookのメールアイテムを新規作成
Set olApp = New Outlook.Application
Set olMail = olApp.CreateItem(olMailItem)

‘ 3. メールの基本プロパティ(宛先・件名・本文)を設定
With olMail
.To = MAIL_TO
.Subject = MAIL_SUBJECT
.Body = “関係者各位” & vbCrLf & vbCrLf & _
“お疲れ様です。” & vbCrLf & _
“指定フォルダ内のファイルを添付して送信します。” & vbCrLf & _
“ご確認よろしくお願いいたします。”
End With

‘ 4. フォルダ内のファイルを走査し、MailItemのAttachmentsに追加
‘ ※FSOのFilesコレクションは通常名前順にはならないため、
‘ 実務ではファイル名順に処理される仕組みを利用、または厳密にソートします。
‘ 今回は初心者向けにシンプルかつ確実なアプローチを採用しています。

Dim fileCount As Long
fileCount = 0

For Each targetFile In targetFolder.Files
‘ 隠しファイルなどを除外したい場合はここで条件分岐を追加します
‘ 例: If (targetFile.Attributes And 2) = 0 Then … (今回は全ファイル対象)

‘ メールにファイルを添付
olMail.Attachments.Add targetFile.Path
fileCount = fileCount + 1
Next targetFile

‘ 5. 結果の表示(下書き状態で画面に表示します)
If fileCount > 0 Then
olMail.Display ‘ っていきなり送信せず、人間の目で確認するためにDisplayにします
MsgBox fileCount & ” 件のファイルを添付しました。”, vbInformation, “処理完了”
Else
MsgBox “指定フォルダ内にファイルが見つかりませんでした。”, vbExclamation, “警告”
‘ 中身が空なら作成したメールを破棄
olMail.Close olDiscard
End If

CleanUp:
‘ 6. オブジェクトの解放(メモリリークを防ぐプロの作法)
Set targetFile = Nothing
Set targetFolder = Nothing
Set fileList = Nothing
Set fso = Nothing
Set olMail = Nothing
Set olApp = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description, vbCritical, “システムエラー”
Resume CleanUp
End Sub

—

3. コードの心臓部を紐解く!知っておくべき3つのポイント

このコードには、実務で絶対に知っておくべき「VBAの作法」が詰まっています。初心者の方に向けて、特に重要な3点をかみ砕いて解説しますね。

① `CreateObject(“Scripting.FileSystemObject”)` とは?

VBA単体では、Windowsのフォルダの中を覗き見たり、ファイルを検索したりする能力が少し弱いです。そこで、Windowsが標準で持っている強力なファイル操作ツール(FSO)を「召喚」しています。
`Set fso = CreateObject(…)` は、いわば「フォルダのスペシャリストを雇う契約書」のようなものです。

② なぜいきなり送信せず `.Display` なのか?

業務自動化において、コードが完璧であっても「宛先合ってる?」「添付ファイル漏れてない?」という人間の最後の確認(ダブルチェック)は最強の防壁です。
そのため、今回は `.Send` ではなく `.Display` を使い、「メールを作成して画面にポンと表示する」形にしています。確認して送信ボタンを押すだけなので、心理的にも非常に安全です。

③ 終わったら必ず「後片付け(解放)」をする

コードの後半にある `Set fso = Nothing` などの記述。これ、実はめちゃくちゃ大切です。
VBAが起動している間、メモリ上に居座り続けるオブジェクトを放置すると、Outlook本体が重くなったり、最悪の場合は強制終了の原因になります。
「借りたものは返す、使い終わったら `Nothing` を代入する」。これはプログラマーの美しいマナーです。

—

4. 現場でよくある「罠」と回避のコツ

このツールを実際に運用し始めると、いくつかの「あるあるトラブル」に遭遇します。先回りして対策を伝授しておきますね。

  • 罠1:ファイル名の順番がバラバラになる?
  • 対策: Windowsのエクスプローラー上では「01_xxx, 02_xxx」と並んでいても、FSOが取得する順番はOSのファイルシステムや作成日時に依存することがあります。もし厳密なファイル名順(昇順)が絶対条件になる場合は、配列やコレクションに一旦格納してソートするロジックを挟む必要があります。(今回は基本編として、フォルダ内のファイルを素直にループさせる構成にしています)
  • 罠2:パスの最後の「\(円マーク)」忘れ
  • 対策: `Const FOLDER_PATH As String = “C:\Data”` のように書いてしまうと、結合したときに `C:\Datafilename.ext` になってしまい、「ファイルが見つかりません」エラーの温床になります。パスの末尾には必ず `\` を入れる、またはコード内で自動補正する癖をつけましょう。

—

最後に:ここから先の世界へ

お疲れ様でした! このコードをマスターしたあなたなら、次は「添付し終わったファイルを別の『送信済みフォルダ』へ自動で移動させる(FSOの `MoveFile` メソッドを使用)」といった、さらなる高度な自動化へとステップアップできるはずです。

「ここをクリアすれば、Outlook VBAの基本はバッチリですよ!」
自信を持って、明日からの業務にこのツールを組み込んでみてください。あなたの手から生まれたマクロが、きっと毎日の残業時間を削り取ってくれるはずです。

それでは、次の自動化の現場でお会いしましょう!

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