Contents
この記事でできること
Excelの宛先リストを見ながら、Outlookで1通ずつメールを作成していませんか? VBAを使えば、宛先・件名・本文をExcelから読み取り、Outlookの下書きメールを自動で作成できます。送信ボタンを押すまでメールは送信されないので、内容を確認してから安心して送れます。コピペだけで動くコードを紹介します。
- 対象:Excelの宛先リストを見ながらOutlookで手作業メールを作っている人、VBAが初めての人
- 所要時間:コピペ → 実行まで約5分(目安)
完成イメージ(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の内容で自動入力されている。送信ボタンを押すまで送信されない。
実行前の準備
Outlookの起動を確認する
VBAからOutlookを操作するには、Outlookがインストール済みで、初回起動(プロファイル設定)が完了している必要がある。マクロ実行前にOutlookを起動しておくこと。
※ Outlookが起動していない場合、「実行時エラー ‘429’」が発生します。タスクバーにOutlookのアイコンがあることを確認してください。
バックアップを取る
既存のデータが入っているExcelファイルで実行する場合は、先にファイルをコピーしてバックアップを取ること。
Excelをマクロ有効ブック(.xlsm)で保存する
- Excelを開く(新規でも既存でもOK)
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存
.xlsx のままだとマクロが保存されない。必ず .xlsm にすること。
宛先リストを準備する
シートの1行目にヘッダー、2行目以降にデータを入力する。
| A | B | C | |
|---|---|---|---|
| 1 | 宛先 | 件名 | 本文 |
| 2 | yamada@example.com | 会議のご案内 | 山田様 お疲れ様です。会議の日程… |
| 3 | suzuki@example.com | 報告書の送付 | 鈴木様 お世話になっております。… |
手順(コピペ → 実行まで約5分)
VBE(コードを書く画面)を開く
Alt + F11 キーを押すとVBE(Visual Basic Editor)が開く。
一般的にはAlt + F11で開けるが、企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。
標準モジュールを挿入する
- VBEのメニュー「挿入」→「標準モジュール」をクリック
- 右側に白い画面(コードウィンドウ)が表示される
コードを貼り付けて実行する
- 下の「コード(最小版)」をコピーして、コードウィンドウに貼り付ける
- Outlookが起動していることを確認する(※ 未起動の場合はエラー429が発生します。タスクバーにOutlookのアイコンがあることを確認してください)
- Alt + F8 を押す(または VBE上で F5)
- 「CreateMailFromList」を選択して「実行」
- Outlookに下書きメールが表示されることを確認する
コード(最小版)– 下書きメールを自動作成
まずはこれだけで動く。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" はシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。
コード(実務版)– 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
追加ポイント:
- D列(CC)・E列(BCC)に対応。空欄の場合は自動的にスキップ
- 実行時に「送信 / 下書き表示 / 中止」を選択できるダイアログを表示
- 送信を選んだ場合は、さらに最終確認ダイアログを表示(二重確認)
- F列にステータス(「送信済み」「作成済み」「スキップ」「エラー」)を記録
- エラーが発生した行はスキップして次の行を処理する
注意:.Send は一度実行すると取り消せません。 テスト時は必ず「いいえ」(下書き表示)を選んで動作確認してから、本番で「はい」(送信)を使うこと。初めて使う場合はまず最小版の .Display で動作を確認することを推奨。
シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は、自分のシート名に書き換えること。
CreateObject を使っているため、参照設定は不要。そのままコピペで動く。
よくある落とし穴5選
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 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部門に相談 |
FAQ
Q1: 添付ファイルを付けたい
.Attachments.Add "C:\Users\example\Documents\報告書.xlsx" のように、ファイルのフルパスを指定すれば添付できる。セルにファイルパスを記載してVBAで読み込む方法もある。複雑な添付処理が必要な場合はココナラで相談を推奨。
Q2: CC や BCC を指定したい
最小版では対応していないが、実務版コードでは D列:CC、E列:BCC に対応済み。複数のCCを指定する場合はセミコロン(;)で区切る。例:yamada@example.com;suzuki@example.com
Q3: 本文に宛名を差し込みたい(「○○様」など)
セルに宛名列を追加し、VBAで文字列結合する方法がある。例えば G列に宛名を入れて .Body = ws.Cells(i, 7).Value & " 様" & vbCrLf & vbCrLf & ws.Cells(i, 3).Value のようにする。複雑なテンプレート差し込みが必要な場合はココナラで相談を推奨。
Q4: 署名が消えてしまう
.Body を設定すると、Outlookの既定の署名が上書きされることがある。署名を維持したい場合は、.Display でメールを開いた後に本文の先頭に追記する方法がある。ただし処理が複雑になるため、記事の範囲外とする。
Q5: 一度に100通以上作成しても大丈夫?
VBAの制限はないが、.Display で大量のメールウィンドウを開くとメモリ不足になる可能性がある。目安として50通を超える場合は、一度に開くとOutlookやPCの動作が重くなる可能性がある。大量の場合は .Send で送信するか、一度に処理する件数を分けること。なお、大量送信はメールサーバーの制限や迷惑メール判定に注意が必要。IT部門やメールサーバー管理者に確認を推奨。
まとめ
この記事で、ExcelリストからOutlookメールを自動作成できるようになった。
- 最小版:A列:宛先、B列:件名、C列:本文 → .Display で下書き表示(送信しない)
- 実務版:CC/BCC対応+送信確認ダイアログ+F列にステータスログ
重要なのは、デフォルトは .Display(下書き表示) であること。送信前に1通ずつ内容を確認できるので、宛先の間違いや本文の誤りに気づける。
関連記事
- 宛先リストをステータスで色分けして管理したい場合 → 記事006「セルの値に応じて行を自動色分けする方法」
- 複数部署の宛先リストを1つに統合してからメール作成したい場合 → 記事005「複数Excelファイルを1つに統合する方法」
もっとカスタマイズしたい場合
「添付ファイルを自動で付けたい」「HTML形式のメールにしたい」「テンプレートに差し込みで名前を入れたい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。
相談時に以下の情報があるとスムーズです:
- Excel のバージョン / OS
- 宛先リストの列構成(どの列に何が入っているか)
- メールの形式(プレーンテキスト / HTML)
- 添付ファイルの有無とパターン
- 一度に送信するメールの件数(目安)


コメント