どんな場面で使う?
- 月末の報告メールを複数の取引先に一斉送信している
- 社内の各部署へ同じ形式のメールをCC付きで送る定型業務がある
- 請求書や見積書をPDF添付でメール送信する作業を毎月繰り返している
- イベントや研修の案内メールを参加者リストから1通ずつ作っている
完成イメージ(Before / After)
Before(実行前)

Excelシートに宛先リストが入っている状態。Outlookには何も準備されていない。
| A(宛先) | B(件名) | C(本文) | |
|---|---|---|---|
| 1 | 宛先 | 件名 | 本文 |
| 2 | yamada@example.com | 会議のご案内 | 山田様 お疲れ様です。… |
| 3 | suzuki@example.com | 報告書の送付 | 鈴木様 お世話になっております。… |
| 4 | tanaka@example.com | 日程調整のお願い | 田中様 ご確認をお願いいたします。… |
After(実行後)
Outlookに下書きメールが1通ずつ表示される。宛先・件名・本文がExcelの内容で自動入力されている。送信ボタンを押すまで送信されない。
今回の検証条件と安全確認結果
この記事では、Excelの宛先リストからOutlookメールを作成し、まずは送信せずに下書き表示する流れを前提にしています。送信事故を避けるため、最小版では .Send ではなく .Display を使います。
| 確認したこと | 結果 | 記事内での判断 |
|---|---|---|
| Outlookが起動している状態 | 下書きウィンドウを作成しやすい | 最初に起動確認を入れる |
| 宛先・件名・本文をExcelから差し込む | 列の役割を固定するとミスを追いやすい | A列=宛先、B列=宛名、C列=件名、D列=本文で説明 |
| いきなり送信するコード | 誤送信した場合に取り消せない | 実務版でも確認ダイアログを挟む |
Beforeは、Excelのリストを見ながらOutlookで1通ずつメールを作る状態です。Afterは、Excelの行ごとに下書きメールを作り、Outlook上で内容を確認してから送信できる状態です。
実務でメール自動化を使うときの安全ルール
Outlookメールの自動作成は便利ですが、誤送信の影響が大きい処理です。最初から自動送信にせず、まずは下書き表示にして、宛先、件名、本文、添付ファイルを人が確認してから送る運用にするのが安全です。特に社外宛てや複数人宛てのメールでは、確認を省かないほうがよいです。
宛先リストをExcelで管理する場合は、メールアドレスの空欄、全角文字、余分なスペース、CC/BCCの入れ間違いに注意します。同じ部署で使うなら、送信対象の条件、送らない行の扱い、送信済みフラグの付け方を決めておくと、二重送信を防ぎやすくなります。
| 確認項目 | 起きやすいミス | 対策 |
|---|---|---|
| 宛先 | 空欄や古いアドレス | 送信前に一覧で確認する |
| 添付ファイル | 違うファイルを添付 | ファイル名を本文やログに残す |
| 送信済み管理 | 同じ相手へ二重送信 | 送信済み列を作る |
| 自動送信 | 確認前に送ってしまう | 最初はDisplayで下書き表示にする |
送信前に宛先を確認する例
If Trim(mailTo) = "" Then
MsgBox "宛先が空欄です"
Exit Sub
End If
mailItem.Display '最初は送信せず下書き表示
慣れてきても、社外向けメールでは .Send より .Display を基本にするのがおすすめです。自動化するほど確認が流れ作業になりやすいので、最後に人が見るポイントを残しておくと安心です。
実務で使うときの判断ポイント
自分も実務でOutlook送信を自動化するときは、最初からSendで送るのではなく、Displayで下書きを表示して確認する形から始めます。宛先や本文は一見単純ですが、差し込み元のExcelに空欄があるだけで、想定外のメールができることがあります。
現場で使いやすくするなら、宛先、件名、本文、添付ファイルの確認をマクロの中に入れて、問題があれば送信処理に進まないようにします。慣れてから自動送信に切り替えるほうが、説明もしやすく、トラブル時の切り戻しも簡単です。


実行前の準備
Outlookの起動を確認する
VBAからOutlookを操作するには、Outlookがインストール済みで、初回起動(プロファイル設定)が完了している必要がある。マクロ実行前にOutlookを起動しておくこと。
※ Outlookが起動していない場合、「実行時エラー ‘429’」が発生します。タスクバーにOutlookのアイコンがあることを確認してください。
バックアップを取る
既存のデータが入っているExcelファイルで実行する場合は、先にファイルをコピーしてバックアップを取ること。
宛先リストを準備する
シートの1行目にヘッダー、2行目以降にデータを入力する。
| A | B | C | |
|---|---|---|---|
| 1 | 宛先 | 件名 | 本文 |
| 2 | yamada@example.com | 会議のご案内 | 山田様 お疲れ様です。会議の日程… |
| 3 | suzuki@example.com | 報告書の送付 | 鈴木様 お世話になっております。… |
コード(最小版)– 下書きメールを自動作成
まずはこれだけで動く。Excelの宛先リストからOutlookに下書きメールを作成する。送信はしない(.Display で下書き表示のみ)。
Sub CreateMailFromList()
Dim olApp As Object
Dim olMail As Object
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
' 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
' メールを新規作成
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列:本文
.Display ' ★ 下書き表示(送信しない)
End With
Set olMail = Nothing
Next i
MsgBox lastRow - 1 & " 通のメールを作成しました。" & vbCrLf & _
"Outlookで内容を確認してから送信してください。", vbInformation
Set olApp = Nothing
End Sub
重要:このコードはメールを送信しません。 .Display は下書きとしてメールウィンドウを開くだけ。内容を確認してからOutlook上で送信ボタンを押す。
シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。
.Display と .Send の判断基準
Outlook自動化で一番大事なのは、コードの短さではなく事故を起こさないことです。.Display と .Send は1行違いですが、運用上の重みはかなり違います。
| 使い方 | 向いている場面 | 注意点 |
|---|---|---|
.Display |
初回テスト、宛先確認が必要なメール、社外向けメール | 手動で送信ボタンを押す必要がある |
.Send |
定型メール、社内通知、十分に検証済みの処理 | 送信後は取り消せない前提で使う |
| 確認ダイアログ付きSend | 半自動化したい業務 | 大量送信前に件数と宛先列を確認する |
自分なら、初回は必ず .Display にします。送信まで完全自動化するのは、テスト用リスト、本番リスト、添付ファイル、ログ出力まで確認できてからです。
コード(実務版)– CC/BCC対応+送信確認ダイアログ付き
業務で使うなら、CC/BCCへの対応と、送信するかどうかの確認ダイアログがあると便利。ステータスログも記録する。
シートのレイアウト(実務版):
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | 宛先 | 件名 | 本文 | CC | BCC | ステータス |
| 2 | yamada@example.com | 会議のご案内 | 山田様… | admin@example.com | ||
| 3 | suzuki@example.com | 報告書の送付 | 鈴木様… | manager@example.com |
Sub CreateMailFromListEx()
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
' --- 送信モードの選択 ---
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 & _
"送信したメールは取り消せません。", _
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, 6).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列:本文
' --- ここが追加:CC / BCC ---
If Trim(ws.Cells(i, 4).Value) <> "" Then
.CC = ws.Cells(i, 4).Value ' D列:CC
End If
If Trim(ws.Cells(i, 5).Value) <> "" Then
.BCC = ws.Cells(i, 5).Value ' E列:BCC
End If
' --- 送信 or 下書き表示 ---
If sendMode = vbYes Then
.Send ' ★★★ 送信実行(取り消し不可・注意)★★★
ws.Cells(i, 6).Value = "送信済み"
Else
.Display ' 下書き表示(送信しない)
ws.Cells(i, 6).Value = "作成済み"
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 & _
"F列にステータスを記録しました。", vbInformation, "完了"
Set olApp = Nothing
Exit Sub
ErrHandler:
' エラーをリセットして次の行へ進む
ws.Cells(i, 6).Value = "エラー:" & Err.Description
errCount = errCount + 1
Set olMail = Nothing
On Error GoTo 0
Resume NextRow
End Sub
自分はこの実務版に切り替えてから、月末の報告メール20件が5分で終わるようになった。F列にステータスが残るので「どれを送ったか」が一目でわかるし、CC/BCCの入力ミスもなくなった。
追加ポイント:
- D列(CC)・E列(BCC)に対応。空欄の場合は自動的にスキップ
- 実行時に「送信 / 下書き表示 / 中止」を選択できるダイアログを表示
- 送信を選んだ場合は、さらに最終確認ダイアログを表示(二重確認)
- F列にステータス(「送信済み」「作成済み」「スキップ」「エラー」)を記録
- エラーが発生した行はスキップして次の行を処理する
注意:.Send は一度実行すると取り消せません。 テスト時は必ず「いいえ」(下書き表示)を選んで動作確認してから、本番で「はい」(送信)を使うこと。初めて使う場合はまず最小版の .Display で動作を確認することを推奨。
シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。
CreateObject を使っているため、参照設定は不要。そのままコピペで動く。
よくある落とし穴5選
自分が初めてこのマクロをテストしたとき、.Display を .Send に書き換えてしまい、テスト用のメールが全社の宛先リストに送信されてしまった。幸い本文が「テスト」だけだったので大事にはならなかったが、冷や汗をかいた。以来、テスト時は絶対に .Display のまま動かす、本番で .Send に切り替えるときはダミーの宛先で最終確認してから、を鉄則にしている。
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | 「実行時エラー ‘429’: ActiveXコンポーネントはオブジェクトを作成できません」 | Outlookがインストールされていない、または一度も起動されていない | Outlookをインストールし、初回起動してプロファイル設定を完了させてからマクロを実行する |
| 2 | 「プログラムが電子メールを送信しようとしています」と警告が表示される | OutlookのObject Model Guard(セキュリティ機能)がVBAからのメール操作を検知した | Outlookの「ファイル」→「オプション」→「セキュリティセンター」→「プログラムによるアクセス」で設定を確認する。企業環境ではIT部門に相談 |
| 3 | 本文の改行が反映されない | Excelのセル内改行(Alt+Enter)と、メールの改行コードが異なる | 本文に改行を入れたい場合は、セル内で vbCrLf の代わりに Alt+Enter で改行するか、コード側で Replace(本文, vbLf, vbCrLf) を追加する |
| 4 | .Send で送信したメールを取り消したい | .Send は即座に送信を実行する。Outlookの「送信取り消し」機能は相手が未読の場合のみ有効で、確実ではない | .Send を使う場合は必ず確認ダイアログを挟む。テスト時は必ず .Display で動作確認してから .Send に切り替える |
| 5 | 「実行時エラー ‘287’」が表示される | Outlookのセキュリティ設定がVBAからの操作をブロックした | ウイルス対策ソフトの設定やOutlookのセキュリティ設定を確認する。企業のグループポリシーで制限されている場合はIT部門に相談 |
VBAでOutlookメールが作成できないときの対処法
「実行時エラー ‘429’が出てメールが作成されない」という場合、原因はOutlookが起動していないか、初回起動のプロファイル設定が未完了であることだ。タスクバーにOutlookのアイコンがあることを確認し、なければOutlookを起動してから再実行すれば解決する。
VBAで作成したメールの本文が改行されないときの対処法
「Excelのセルでは改行しているのにメール本文が1行になる」という場合、原因はExcelのセル内改行(LF)とメールの改行コード(CRLF)が異なることだ。コード内で .Body に値を設定する前に Replace(本文, vbLf, vbCrLf) を入れれば、改行が正しく反映される。
実務で詰まりやすい失敗例
失敗例1: Outlookが起動していない、またはプロファイル選択で止まる
社内PCではOutlookの初期設定やプロファイル選択画面で止まることがあります。最初のテストでは、Outlookを開いて送受信できる状態にしてからマクロを実行します。
失敗例2: 本文の改行が想定と違う
テキスト形式の .Body とHTML形式の .HTMLBody では改行の扱いが違います。表現を整えたい場合は、本文をHTMLとして組み立てるか、まずテキスト形式に絞って運用します。
失敗例3: 空の宛先行まで処理してしまう
宛先列が空の行をスキップしないと、下書きだけが増えたりエラーになったりします。実務版では空欄チェックを入れ、処理結果をステータス列へ残すと確認しやすくなります。
FAQ
Q1: 添付ファイルを付けたい
Q2: CC や BCC を指定したい
最小版では対応していないが、実務版コードでは D列:CC、E列:BCC に対応済み。複数のCCを指定する場合はセミコロン(;)で区切る。例:yamada@example.com;suzuki@example.com
Q3: 本文に宛名を差し込みたい(「○○様」など)
Q4: 署名が消えてしまう
.Body を設定すると、Outlookの既定の署名が上書きされることがある。署名を維持したい場合は、.Display でメールを開いた後に本文の先頭に追記する方法がある。ただし処理が複雑になるため、記事の範囲外とする。
Q5: 一度に100通以上作成しても大丈夫?
VBAの制限はないが、.Display で大量のメールウィンドウを開くとメモリ不足になる可能性がある。目安として50通を超える場合は、一度に開くとOutlookやPCの動作が重くなる可能性がある。大量の場合は .Send で送信するか、一度に処理する件数を分けること。なお、大量送信はメールサーバーの制限や迷惑メール判定に注意が必要。IT部門やメールサーバー管理者に確認を推奨。
まとめ
この記事で、ExcelリストからOutlookメールを自動作成できるようになった。
- 最小版:A列:宛先、B列:件名、C列:本文 → .Display で下書き表示(送信しない)
- 実務版:CC/BCC対応+送信確認ダイアログ+F列にステータスログ
重要なのは、デフォルトは .Display(下書き表示) であること。送信前に1通ずつ内容を確認できるので、宛先の間違いや本文の誤りに気づける。
関連記事
- 宛先リストをステータスで色分けして管理したい場合 → 【VBA】セルの値に応じて行を自動色分けする方法
- 複数部署の宛先リストを1つに統合してからメール作成したい場合 → 【VBA】複数Excelファイルを1つに統合する方法
次にやりたくなること
- 【VBA】Excelの表をOutlookメール本文に貼り付けて送る方法 — メール本文にExcelの表を埋め込みたい場合はこちら
- 【VBA】メールに添付ファイルを自動で付ける方法 — 報告書PDFを添付して一斉送信したい場合はこちら
- 【VBA】ExcelファイルをPDFに一括変換する方法 — メール添付用のPDFをまとめて作りたい場合はこちら


コメント