こんにちは!現場でバリバリ自動化を進めていると、「毎月(毎日)決まった宛先に、Excelの一覧表からコピペしてメールを作る作業、なんとかならないかな…」という相談を本当によく受けます。
マクロの記録から一歩踏み出し、自分の手でOutlookを自在に操れるようになると、業務効率は文字通り「ケタ違い」になります。
今回は、初心者の方でも安心して書けるように、「Excelのリストから宛先や件名を読み込み、ワンクリックで定型メールを自動作成する(画面で確認してから送る)」という王道かつ最強のテクニックを、私の現場ノウハウをたっぷり交えて解説します。
ここをクリアすれば、Outlook VBAの基本はバッチリですよ!一緒にマスターしていきましょう。
—
1. ざっくり全体像:何をするプログラムなのか?
今回作る仕組みのイメージはこうです。
1. Excel(一覧表)を用意する
- 1行目:見出し(「宛先」「件名」「本文」など)
- 2行目以降:実際の送信データ
2. VBAのスイッチ(ボタンやマクロ)を押す
- プログラムがExcelのデータを1行ずつ読み込みます。
3. Outlookの新規メールが立ち上がる
- 宛先、件名、本文が自動でセットされた状態で画面に「ポンッ」と表示されます。
- ※いきなり送信するのではなく、必ず人間が内容を目視で確認できるように `Display` メソッド(後述)を使います。これが実務で安全に使うための鉄則です。
—
2. 準備するもの(Excelのレイアウト)
まずはExcel側の準備です。適当なワークシート(ここではシート名を `送信リスト` とします)を開き、1行目に次のように入力してください。
- A列:宛先(メールアドレス)
- B列:件名
- C列:本文
| 列 | 項目名 (1行目) | 2行目のデータ例 |
| :— | :— | :— |
| A | 宛先 | `sample@example.com` |
| B | 件名 | `【ご案内】次回の定例会について` |
| C | 本文 | `お疲れ様です。次回の定例会の日程をお知らせします。` |
—
3. 実装コード(コピペで使える実用マクロ)
それでは、Excelの標準モジュールに貼り付けてそのまま動かせるコードを公開します。
初心者の方でも迷わないように、一行ずつ「なぜそれを書くのか」をコメントに刻み込んでおきました。
Sub CreateOutlookMailFromExcel()
‘ =========================================================================
‘ 目的: Excelのリストからデータを取得し、Outlookのメール作成画面を立ち上げる
‘ 前提: Microsoft Outlook Object Library への参照設定をしておくとベターですが、
‘ 今回は初心者向けに「CreateObject」を使った遅延バインディングで記述しています。
‘ =========================================================================
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(“送信リスト”) ‘ 読み込むシート名を指定
Dim lastRow As Long
‘ A列の最終行(データが入っている一番下の行番号)を取得
lastRow = ws.Cells(ws.Rows.Count, “A”).End(xlUp).Row
‘ データが2行目以降に存在するかチェック
If lastRow < 2 Then
MsgBox "送信データが見つかりません。", vbExclamation, "処理中断"
Exit Sub
End If
' Outlookを操作するための変数を定義
Dim olApp As Object
Dim olMail As Object
' Outlookが起動していなければ起動し、セッションを掴む
On Error Resume Next
Set olApp = GetObject(, "Outlook.Application")
If olApp Is Nothing Then
Set olApp = CreateObject("Outlook.Application")
End If
On Error GoTo 0
Dim i As Long
Dim mailTo As String, mailSubject As String, mailBody As String
' 2行目から最終行までループを回す
For i = 2 To lastRow
' セルから値を取得
mailTo = ws.Cells(i, 1).Value : ' A列:宛先
mailSubject = ws.Cells(i, 2).Value : ' B列:件名
mailBody = ws.Cells(i, 3).Value : ' C列:本文
' 宛先が空欄でなければメールを作成
If mailTo <> “” Then
‘ MailItemオブジェクトの生成
Set olMail = olApp.CreateItem(0) ‘ 0 = olMailItem
‘ プロパティに値を流し込む
With olMail
.To = mailTo ‘ 宛先
.Subject = mailSubject ‘ 件名
.Body = mailBody ‘ 本文
‘ 【重要】いきなり送信(.Send)せず、画面に表示して人間が確認する
.Display
End With
End If
Next i
‘ 後片付け
Set olMail = Nothing
Set olApp = Nothing
MsgBox “メールの作成が完了しました!内容を確認して送信してください。”, vbInformation, “完了”
End Sub
—
4. チーフアーキテクトが教える!コードの核心とポイント
このコードをただコピペするだけでなく、「プロの視点」を少しだけインストールしておきましょう。ここを理解すると、応用力が一気に跳ね上がります。
① `CreateObject` による「遅延バインディング」の採用
コードの中で `CreateObject(“Outlook.Application”)` という書き方をしています。これは、Excel側のVBAから「後からOutlookを呼び出す」という書き方です。
あらかじめ「参照設定」でOutlookを指定しなくても動くため、他の人にファイルを配ったときエラー(参照切れ)が起きにくいという大きなメリットがあります。初心者の方には一番トラブルが少ない安全な書き方です。
② いきなり `.Send` しない。命綱は `.Display`
初学者がやりがちな恐怖のミスが、コード内に `.Send`(自動送信)を書いてしまい、テスト中に大量のテストメールが実在の宛先に飛び散る大惨事です。
私たちプロの現場でも、自動化の初期段階や、人間による目視確認が必要な業務では、必ず `.Display`(画面表示) を使います。
「メールを作るまではロボットに任せる。最後の送信ボタンを押すのは人間」という役割分担が、実務では一番安全で確実です。
—
5. 現場でよくある「陥りやすいエラー」と対策
最後に、このコードや仕組みを実務で動かすときによくあるつまづきポイントを共有しておきます。
- エラー:「オブジェクトは、このプロパティまたはメソッドをサポートしていません。」が出る
- → 変数の定義ミスや、Excelのシート名(`”送信リスト”`)が間違っている時によく起きます。シート名が完全一致しているか確認してください。
- Outlookがフリーズしたようになる
- → 大量のデータ(例えば数百件)を一度に `.Display` しようとすると、Outlookのウィンドウが何枚も開きすぎてパソコンが悲鳴を上げます。一件ずつ目視確認するのはせいぜい10件〜20件程度に留めるか、件数が多い場合は送信ログを残す仕組み(後々のステップ)を検討しましょう。
—
まとめ
いかがでしたでしょうか?
ExcelとOutlookをVBAで繋ぐことができれば、毎日のルーティンワークが「ボタン一発」で終わる快適な世界を手に入れることができます。
まずは今日のコードをそのままコピーして、自分のパソコンのExcelとOutlookで実験してみてください。「おおっ、立ち上がった!」という感動が、自動化エンジニアへの第一歩です。
ここをクリアできたら、次は「CCやBCCの追加」「ファイルの添付」「HTMLメールの作成」へとステップアップしていきましょう。あなたの業務自動化の旅を、これからも応援しています!
