どんな場面で使う?
- 月末に報告書や請求書をOutlookに手作業でドラッグ&ドロップしている作業を自動化したい
- 宛先ごとに異なるファイルを添付して一括でメールを作成したい
- 添付忘れや送り先の間違いをゼロにしたい
- CC/BCCも含めた一括メール送信を安全に(下書き確認付きで)行いたい
完成イメージ(Before / After)
Before(実行前)

Excelシートに宛先リストと添付ファイルのパスが入っている状態。Outlookには何も準備されていない。
| A(宛先) | B(件名) | C(本文) | D(添付ファイルパス) | |
|---|---|---|---|---|
| 1 | 宛先 | 件名 | 本文 | 添付ファイル |
| 2 | yamada@example.com | 月次報告書の送付 | 山田様 お疲れ様です。… | C:\Reports\月次報告_202603.xlsx |
| 3 | suzuki@example.com | 請求書の送付 | 鈴木様 お世話になっております。… | C:\Reports\請求書_202603.pdf |
| 4 | tanaka@example.com | 資料の送付 | 田中様 ご確認をお願いいたします。… | C:\Reports\会議資料.pptx |
After(実行後)
Outlookにファイル添付済みの下書きメールが1通ずつ表示される。宛先・件名・本文に加え、添付ファイルが自動でセットされている。送信ボタンを押すまで送信されない。
今回の検証条件と安全確認結果
この記事では、Excelブックを1件添付するケースと、宛先一覧から複数メールを作るケースを分けて確認しています。検証では、添付ファイルが存在する場合、存在しない場合、保存直後のブックを添付する場合を想定しました。
| 確認したこと | 結果 | 記事内での判断 |
|---|---|---|
| 存在するxlsxを添付 | Outlookの下書きに添付できる | 最小版で紹介 |
| 存在しないパスを指定 | 添付前の存在チェックが必要 | Dir で確認してから添付する |
| 作成直後のブックを添付 | 保存前だと古い内容を送る可能性がある | 保存してから添付する |
| 一覧表から複数メール作成 | 送信前に下書き表示で確認した方が安全 | まずは .Display を使う |
Beforeは、毎回メールを作ってファイルを手で添付している状態です。Afterは、宛先・件名・添付パスを一覧で管理し、同じ条件で下書きを作れる状態です。
実務で使うときの判断ポイント
自分も実務でメール自動化を考えるときは、「送信まで自動」にするより「下書き作成で止める」設計を優先します。添付忘れより怖いのは、宛先違い・ファイル違い・個人情報の誤送信だからです。
特に部署内で使う場合は、添付ファイルの存在確認、宛先一覧の空欄確認、1件だけのテスト送信を入れておくと安心です。最初から完全自動送信にせず、人が見てから送る形にしておくと、現場でも説明しやすくなります。


実行前の準備
Outlookの起動を確認する
VBAからOutlookを操作するには、Outlookがインストール済みで、初回起動(プロファイル設定)が完了している必要がある。マクロ実行前にOutlookを起動しておくこと。
※ Outlookが起動していない場合、「実行時エラー ‘429’」が発生します。タスクバーにOutlookのアイコンがあることを確認してください。
添付ファイルを確認する
添付するファイルが指定したパスに実際に存在することを確認する。ファイルが存在しないとエラーになる。エクスプローラーでファイルを開けることを事前に確認しておくこと。
バックアップを取る
既存のデータが入っているExcelファイルで実行する場合は、先にファイルをコピーしてバックアップを取ること。
宛先リストを準備する
シートの1行目にヘッダー、2行目以降にデータを入力する。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | 宛先 | 件名 | 本文 | 添付ファイル |
| 2 | yamada@example.com | 月次報告書の送付 | 山田様 お疲れ様です。… | C:\Reports\月次報告_202603.xlsx |
| 3 | suzuki@example.com | 請求書の送付 | 鈴木様 お世話になっております。… | C:\Reports\請求書_202603.pdf |
D列(添付ファイル)にはファイルのフルパス(C:\から始まる絶対パス)を入力する。 相対パスでは動かない。エクスプローラーのアドレスバーからコピーすると確実。
添付メールを自動化してよいケース・避けるケース
添付メールは便利ですが、誤送信時の影響が大きい処理です。コードを短くするより、送信前に止まれる設計にする方が実務では安全です。
| 状況 | おすすめ | 理由 |
|---|---|---|
| 初回運用・宛先が少ない | .Display で下書き表示 | 宛先、本文、添付を目視確認できる |
| 添付ファイルが人ごとに違う | 一覧表に添付パス列を作る | 誰に何を送るかを表で確認できる |
| 個人情報や請求書を送る | 自動送信は避けるか二重確認を入れる | 誤添付のリスクが高い |
| 毎日同じ宛先へ定型資料を送る | ログ付きの実務版 | 送信履歴と失敗行を後から確認できる |
自分なら、添付メールは最初から .Send にしません。下書き表示で運用し、問題がないことを数回確認してから自動送信を検討します。
コード(最小版)– 1ファイルを添付してメール作成
まずはこれだけで動く。Excelの宛先リストから、ファイル添付済みのOutlook下書きメールを作成する。送信はしない(.Display で下書き表示のみ)。
Sub CreateMailWithAttachment()
Dim olApp As Object
Dim olMail As Object
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim filePath As String
' Outlook を起動(参照設定不要)
Set olApp = CreateObject("Outlook.Application")
' 対象シートを設定
Set ws = Worksheets("Sheet1")
' データの最終行を取得(A列基準)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' データがない場合は終了
If lastRow < 2 Then
MsgBox "宛先リストが空です。A2セル以降にデータを入力してください。", vbExclamation
Exit Sub
End If
' 2行目から最終行までループ(1行目はヘッダー)
For i = 2 To lastRow
' 宛先が空欄ならスキップ
If Trim(ws.Cells(i, 1).Value) = "" Then GoTo NextRow
' メールを新規作成
Set olMail = olApp.CreateItem(0) ' 0 = olMailItem
With olMail
.To = ws.Cells(i, 1).Value ' A列:宛先
.Subject = ws.Cells(i, 2).Value ' B列:件名
.Body = ws.Cells(i, 3).Value ' C列:本文
' ★ ここが今回のポイント:ファイルを添付 ★
filePath = Trim(ws.Cells(i, 4).Value) ' D列:添付ファイルパス
If filePath <> "" Then
If Dir(filePath) <> "" Then
.Attachments.Add filePath
Else
MsgBox i & " 行目:添付ファイルが見つかりません。" & vbCrLf & _
filePath, vbExclamation
End If
End If
.Display ' ★ 下書き表示(送信しない)
End With
Set olMail = Nothing
NextRow:
Next i
MsgBox lastRow - 1 & " 通のメールを作成しました。" & vbCrLf & _
"Outlookで添付ファイルと内容を確認してから送信してください。", vbInformation
Set olApp = Nothing
End Sub
重要:このコードはメールを送信しません。 .Display は下書きとしてメールウィンドウを開くだけ。添付ファイルと内容を確認してからOutlook上で送信ボタンを押す。
ポイント解説:
.Attachments.Add filePath— ファイルのフルパスを指定して添付する。これだけで添付完了Dir(filePath)— ファイルの存在チェック。存在しない場合は添付せずにメッセージを表示- D列が空欄の場合は添付なしでメールを作成する(添付忘れではなく、意図的に添付なしのケースに対応)
シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。
記事007「ExcelからOutlookメールを自動作成する方法」のコードに .Attachments.Add を追加した形になっている。007のコードが動いている人は、D列とファイル添付部分を追加するだけでOK。
コード(実務版)– 一覧表から宛先・添付ファイルを読み取り一括メール作成
業務で使うなら、CC/BCC対応、複数ファイル添付(セミコロン区切り)、送信確認ダイアログ、ステータスログが必要になる。
シートのレイアウト(実務版):
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | 宛先 | 件名 | 本文 | 添付ファイル | CC | BCC | ステータス |
| 2 | yamada@example.com | 月次報告書の送付 | 山田様… | C:\Reports\月次報告.xlsx | admin@example.com | ||
| 3 | suzuki@example.com | 請求書の送付 | 鈴木様… | C:\Reports\請求書.pdf;C:\Reports\明細.xlsx | manager@example.com | ||
| 4 | tanaka@example.com | 資料の送付 | 田中様… | C:\Reports\会議資料.pptx |
D列の複数ファイル添付: セミコロン(;)で区切れば、1通のメールに複数ファイルを添付できる。
Sub CreateMailWithAttachmentEx()
Dim olApp As Object
Dim olMail As Object
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim sendMode As VbMsgBoxResult
Dim modeText As String
Dim mailCount As Long
Dim errCount As Long
Dim filePath As String
Dim filePaths As Variant
Dim fp As Variant
Dim attachCount As Long
Dim attachFail As Long
' --- 送信モードの選択 ---
sendMode = MsgBox("メールを送信しますか?" & vbCrLf & vbCrLf & _
"「はい」→ 送信(取り消し不可)" & vbCrLf & _
"「いいえ」→ 下書き表示のみ(送信しない)" & vbCrLf & _
"「キャンセル」→ 処理を中止", _
vbYesNoCancel + vbQuestion, "メール作成モード")
' キャンセルなら終了
If sendMode = vbCancel Then
MsgBox "処理を中止しました。", vbInformation
Exit Sub
End If
' 送信モードの場合は再確認
If sendMode = vbYes Then
If MsgBox("本当に送信しますか?" & vbCrLf & _
"送信したメールは取り消せません。" & vbCrLf & _
"添付ファイルの内容も確認しましたか?", _
vbYesNo + vbExclamation, "最終確認") = vbNo Then
MsgBox "処理を中止しました。", vbInformation
Exit Sub
End If
End If
' Outlook を起動(参照設定不要)
Set olApp = CreateObject("Outlook.Application")
' 対象シートを設定
Set ws = Worksheets("Sheet1")
' データの最終行を取得(A列基準)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
' データがない場合は終了
If lastRow < 2 Then
MsgBox "宛先リストが空です。A2セル以降にデータを入力してください。", vbExclamation
Exit Sub
End If
mailCount = 0
errCount = 0
' 2行目から最終行までループ(1行目はヘッダー)
For i = 2 To lastRow
' 宛先が空欄ならスキップ
If Trim(ws.Cells(i, 1).Value) = "" Then
ws.Cells(i, 7).Value = "スキップ(宛先なし)"
GoTo NextRow
End If
On Error GoTo ErrHandler
' メールを新規作成
Set olMail = olApp.CreateItem(0) ' 0 = olMailItem
With olMail
.To = ws.Cells(i, 1).Value ' A列:宛先
.Subject = ws.Cells(i, 2).Value ' B列:件名
.Body = ws.Cells(i, 3).Value ' C列:本文
' ========== ファイル添付処理 ==========
' D列のパスをセミコロンで分割し、複数ファイルに対応
filePath = Trim(ws.Cells(i, 4).Value)
attachCount = 0
attachFail = 0
If filePath <> "" Then
filePaths = Split(filePath, ";")
For Each fp In filePaths
fp = Trim(fp)
If fp <> "" Then
If Dir(CStr(fp)) <> "" Then
.Attachments.Add CStr(fp)
attachCount = attachCount + 1
Else
attachFail = attachFail + 1
End If
End If
Next fp
End If
' ========== ファイル添付処理ここまで ==========
' --- CC / BCC ---
If Trim(ws.Cells(i, 5).Value) <> "" Then
.CC = ws.Cells(i, 5).Value ' E列:CC
End If
If Trim(ws.Cells(i, 6).Value) <> "" Then
.BCC = ws.Cells(i, 6).Value ' F列:BCC
End If
' --- 送信 or 下書き表示 ---
If sendMode = vbYes Then
.Send ' ★★★ 送信実行(取り消し不可・注意)★★★
ws.Cells(i, 7).Value = "送信済み(添付:" & attachCount & "件)"
Else
.Display ' 下書き表示(送信しない)
ws.Cells(i, 7).Value = "作成済み(添付:" & attachCount & "件)"
End If
' 添付失敗があれば追記
If attachFail > 0 Then
ws.Cells(i, 7).Value = ws.Cells(i, 7).Value & _
" ※添付失敗:" & attachFail & "件(ファイル不在)"
End If
End With
mailCount = mailCount + 1
Set olMail = Nothing
On Error GoTo 0
NextRow:
Next i
' 完了メッセージ
If sendMode = vbYes Then
modeText = "送信"
Else
modeText = "作成(下書き)"
End If
MsgBox modeText & ":" & mailCount & " 通" & vbCrLf & _
"エラー:" & errCount & " 通" & vbCrLf & _
"G列にステータスを記録しました。", vbInformation, "完了"
Set olApp = Nothing
Exit Sub
ErrHandler:
' エラーをリセットして次の行へ進む
ws.Cells(i, 7).Value = "エラー:" & Err.Description
errCount = errCount + 1
Set olMail = Nothing
On Error GoTo 0
Resume NextRow
End Sub
追加ポイント:
- D列(添付ファイル)をセミコロン区切りで分割し、複数ファイル添付に対応
- Dir関数で添付前にファイルの存在を確認。存在しないファイルはスキップしてG列にログを残す
- E列(CC)・F列(BCC)に対応。空欄の場合は自動的にスキップ
- 実行時に「送信 / 下書き表示 / 中止」を選択できるダイアログを表示
- 送信を選んだ場合は、さらに最終確認ダイアログを表示(二重確認)
- G列にステータス(「送信済み(添付:2件)」「作成済み(添付:1件)」「スキップ」「エラー」)を記録
- エラーが発生した行はスキップして次の行を処理する(記事022「エラー処理」の考え方)
注意:.Send は一度実行すると取り消せません。 添付ファイルの間違いも送信後には修正できません。テスト時は必ず「いいえ」(下書き表示)を選んで、添付ファイルが正しいか目視確認してから、本番で「はい」(送信)を使うこと。初めて使う場合はまず最小版の .Display で動作を確認することを推奨。
シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。
CreateObject を使っているため、参照設定は不要。そのままコピペで動く。
よくある落とし穴5選
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | 「実行時エラー ’76’: パスが見つかりません」 | 添付ファイルのパスが間違っている、またはファイルが存在しない | Dir関数で添付前にファイルの存在を確認する。パスはフルパス(C:\から始まる絶対パス)で指定する。エクスプローラーのアドレスバーからコピーすると確実 |
| 2 | 「実行時エラー ‘429’: ActiveXコンポーネントはオブジェクトを作成できません」 | Outlookがインストールされていない、またはOutlookが一度も起動されていない | Outlookをインストールし、初回起動でプロファイル設定を完了させてからマクロを実行する |
| 3 | 添付ファイルのサイズが大きすぎて送信できない | Outlookの添付ファイルサイズ制限(既定で20〜25MB)を超えている | 添付前にファイルサイズを確認する。具体的な方法はFAQ Q5を参照。大きなファイルはOneDriveリンクや共有フォルダで代替する |
| 4 | 添付されたファイルが0KBになる、または開けない | ファイルが別のプロセスでロック(使用中)されている。または一時ファイルを添付している | 添付するファイルを閉じた状態でマクロを実行する。一時ファイル(~$で始まるファイル)は添付しない |
| 5 | .Send で送信したが添付ファイルが間違っていた | .Send は即座に送信を実行する。添付ファイルの間違いに送信後に気づいても取り消せない | デフォルトは .Display を使う。テスト時は必ず .Display で添付ファイルが正しいか目視確認してから .Send に切り替える |
VBAでメール添付時にパスが見つかりませんエラーが出るときの対処法
「実行時エラー ’76’: パスが見つかりません」と出る場合、原因は添付ファイルのパスが間違っているか、ファイルが存在しないことだ。D列にはフルパス(C:\から始まる絶対パス)を正確に入力すること。エクスプローラーのアドレスバーからコピーすると確実。
VBAでOutlookメール作成時に添付ファイルが0KBになるときの対処法
「添付されたファイルが0KBで開けない」という場合、原因はファイルが別のプロセスでロック(使用中)されていることだ。添付するExcelファイルを閉じた状態でマクロを実行すること。一時ファイル(~$で始まるファイル)は添付しない。
実務で起きやすい添付メールの失敗例
失敗例1: 保存前のブックを添付して古い内容を送る
処理中にブックを書き換えている場合、保存前に添付すると更新前の内容を送ることがあります。添付する前に Save するか、送信用コピーを作ってから添付します。
失敗例2: 添付パスが空欄でもメールを作ってしまう
一覧表から作る場合、添付パス列の空欄や誤字を必ずチェックします。添付が必須の業務では、添付できない行はメール作成を止めた方が安全です。
失敗例3: 共有フォルダのパスが相手環境で変わる
OneDriveや共有フォルダでは、見た目のパスと実際のローカルパスが違うことがあります。マクロを使うPCで Dir による存在チェックを通してから運用します。
FAQ
Q1: 複数のファイルを1通のメールに添付したい
実務版コードで対応済み。D列にセミコロン(;)区切りでファイルパスを記載すれば、複数ファイルが順番に添付される。例:C:\Reports\報告書.xlsx;C:\Reports\明細.pdf。添付ファイル数に上限はないが、合計サイズに注意。
Q2: PDFに変換してから添付したい
記事009「ExcelファイルをPDFに一括変換する方法」でPDF化し、そのPDFファイルのパスをD列に記載すれば、PDF添付メールが作れる。月次報告をPDFに変換してからメール添付する流れなら、009 → 075 の順に実行するのが実務的。
Q3: 宛先ごとに異なるファイルを添付したい
実務版コードで対応済み。一覧表の各行のD列にそれぞれ異なるファイルパスを入力すれば、宛先ごとに異なるファイルが添付される。記事001「フォルダ内ファイル一覧を自動取得する方法」でファイル一覧を作成し、そのパスをD列に貼り付ける方法が効率的。
Q4: ネットワークドライブや共有フォルダのファイルを添付できる?
\\サーバー名\共有フォルダ\ファイル名.xlsx のようにUNCパスで指定すれば添付できる。ただしアクセス権限がないとエラーになるため、事前にエクスプローラーでファイルを開けることを確認する。VPN接続が必要な場合はVPN接続後にマクロを実行すること。
Q5: 添付ファイルのサイズを事前にチェックしたい
FileLen("ファイルパス") でバイト数を取得できる。例えば20MBを超える場合にスキップするなら、If FileLen(filePath) > 20 * 1024 * 1024 Then で分岐できる。実務版コードにこのチェックを追加する場合は、Dir関数の直後に記述すればよい。
まとめ
この記事で、ExcelリストからOutlookメールにファイルを自動添付できるようになった。
- 最小版:A列:宛先、B列:件名、C列:本文、D列:添付ファイルパス → .Display で下書き表示(送信しない)
- 実務版:複数ファイル添付(セミコロン区切り)+CC/BCC対応+送信確認ダイアログ+G列にステータスログ
重要なのは、添付ファイルのパスをフルパスで正しく指定することと、テスト時は必ず .Display で添付内容を目視確認すること。
関連記事
- メールの自動作成(添付なし)の基本形 → 記事007「ExcelからOutlookメールを自動作成する方法」
- 添付するファイルをPDFに変換したい → 記事009「ExcelファイルをPDFに一括変換する方法」
- 表やグラフをメール本文に直接貼り付けたい → 記事025「表メール」
- フォルダ内のファイル一覧を取得して添付パスに使いたい → 記事001「フォルダ内ファイル一覧を自動取得する方法」
- エラー処理の考え方 → 記事022「エラー処理」
次にやりたくなること
- 月次報告をPDFに変換してからメール添付する → 記事009「ExcelファイルをPDFに一括変換する方法」
- 表やグラフをメール本文に直接貼り付ける → 記事025「表メール」
- フォルダ内のファイル一覧を取得して添付パスに使いたい → 記事001「フォルダ内ファイル一覧を自動取得する方法」
- 添付ファイルをZIP圧縮してから送りたい → ファイルをZIP圧縮・解凍する方法
もっとカスタマイズしたい場合
「PDFに変換してから添付したい」「宛先ごとにフォルダから自動でファイルを選びたい」「HTML形式のメール+添付を同時に送りたい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。
相談時に以下の情報があるとスムーズです:
- Excel のバージョン / OS
- 宛先リストの列構成(どの列に何が入っているか)
- 添付ファイルのパターン(固定ファイル / 宛先ごとに異なる / フォルダから自動選択)
- メールの形式(プレーンテキスト / HTML)
- 一度に送信するメールの件数(目安)
次に読むと理解しやすい関連記事
- Outlookメールを自動作成する方法 – 添付前のメール作成処理を確認できます。
- 表をOutlookメール本文に貼り付ける方法 – 添付ではなく本文に表を入れたい場合に使えます。
- 請求書をPDF保存する方法 – 添付するPDFをVBAで作る流れにつながります。


コメント