【入門編】【初心者向け】特定のフォルダに保存された全ファイルを、ファイル名順に自動添付してメールを作成するループ処理 – Outlook VBA解析バイブル

スポンサーリンク

現場で差がつく!Outlook VBAで「フォルダ内の全ファイルを自動添付」する方法

こんにちは。業務自動化の深淵へようこそ。
「毎日決まったフォルダにある報告書を、メールに添付して送る」。この単純作業、手作業でやれば数分ですが、1年続ければ膨大な時間ロスになります。

今日は、マクロの記録が使えないOutlookの世界で、「FileSystemObject (FSO)」を操り、フォルダ内のファイルをスマートに添付する極意を伝授します。ここをマスターすれば、Outlook VBAの基礎体力が一気に向上します。

1. なぜ「FileSystemObject」を使うのか?

Windowsのファイル操作には古くからある命令もありますが、私たちは「FileSystemObject」を愛用します。なぜなら、フォルダの階層構造やファイルの属性取得において、最も安定しており、エラー処理も書きやすいからです。

今回のアプローチは以下の3ステップです。
1. フォルダの中身を覗く(FSOの準備)
2. ファイルを1つずつ取り出す(ループ処理)
3. MailItemオブジェクトに流し込む(添付処理)

2. 【即戦力コード】ファイル一括添付マクロ

以下のコードをVBAエディタ(Alt + F11)に貼り付けてください。

Sub AttachFilesFromFolder()
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Dim fso As Object
Dim targetFolder As Object
Dim fileItem As Object
Dim folderPath As String

‘ 1. 対象フォルダのパスを指定(末尾の\を忘れずに)
folderPath = “C:\Users\YourName\Documents\Reports\”

‘ 2. 各種オブジェクトの生成
Set olApp = Outlook.Application
Set olMail = olApp.CreateItem(olMailItem)
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set targetFolder = fso.GetFolder(folderPath)

‘ 3. メールの基本設定
With olMail
.Subject = “【自動送信】フォルダ内の資料送付”
.To = “target@example.com”
.Body = “フォルダ内のファイルを全て添付しました。”

‘ 4. ファイルを1つずつループして添付
For Each fileItem In targetFolder.Files
‘ ファイルのフルパスを渡して添付
.Attachments.Add fileItem.Path
Next fileItem

‘ 5. 確認用に表示(いきなり送信せず、まずは表示させるのがプロの作法です)
.Display
End With

‘ メモリ解放(クリーンなコーディングの基本)
Set olMail = Nothing
Set fso = Nothing
End Sub

3. このコードを理解するための「3つの鍵」

① `For Each` ループの恩恵

`For Each fileItem In targetFolder.Files` は、フォルダの中にあるファイルを「最初から最後まで順番に」取得する非常に効率的な書き方です。インデックス番号を管理する必要がないため、バグが起きにくい最強のループ構文です。

② `.Attachments.Add` の魔法

このメソッドは非常に賢いです。ファイルのパスさえ渡せば、Outlook側でバイナリデータへの変換を自動で行ってくれます。ただし、「ファイル名に禁則文字がないか」「ファイルが既に他のアプリで開かれていないか」は常に注意が必要です。

③ なぜ `.Display` を推奨するのか?

`olMail.Send` を使うと、マクロが動いた瞬間にメールが飛んでいきます。開発中は必ず `.Display`(画面表示)を使い、内容に問題がないことを目視確認する「ガード」を入れましょう。

4. よくある失敗と回避策(ここが重要!)

  • 「ファイルが見つかりません」エラー
  • パスの末尾に `\` が入っていないことが最も多いです。`folderPath = “C:\Data\”` のように、必ず区切り文字を入れてください。
  • 添付ファイルが多すぎてメールが重い
  • あまりに多くのファイルを一度に添付すると、Outlookが応答なしになることがあります。もし100個以上のファイルを扱うなら、途中で `.Save` を挟むなどの工夫が必要です。
  • ファイル名順に添付されない?
  • 今回のFSOはOSの並び順に依存します。もし厳密に「ファイル名順」に並べたい場合は、一度配列にファイル名を格納し、並び替える(ソート)処理を追加する必要があります。

先輩エンジニアからのアドバイス

「マクロの記録」はあくまで入り口です。今回のように `FileSystemObject` を使いこなせるようになると、単にメールを送るだけでなく、「古いファイルを自動でアーカイブする」「添付ファイル名をチェックしてエラーがあれば通知する」といった高度な自動化へ足を踏み入れることができます。

まずはこのコードを動かし、自分の環境に合わせてパスを書き換えるところから始めてみてください。それが、あなたの業務効率化の記念すべき第一歩です。

何か分からないことがあれば、いつでも聞いてくださいね。応援しています!

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