【入門編】【中級者向け】Excelの「送信予約リスト」を読み込み、DeferredDeliveryTimeプロパティで一括予約送信を行うツール – Outlook VBA解析バイブル

スポンサーリンク

脱・手動送信!Excelで「送信予約リスト」を操り、Outlookを最強の自動配信マシンに変える技術

こんにちは。自動化の現場で血と涙を流しながら「いかに楽をするか」だけを追求してきたエンジニアです。

皆さんは、毎朝のルーチンワークで「このメール、月曜の朝9時に送らなきゃいけないから、土日も気が気じゃない……」なんて経験はありませんか?

今回は、そんなストレスを根絶やしにする「Excelで作成した送信予約リストを読み込み、Outlookで一括予約送信する」という魔法のような仕組みを解説します。これをマスターすれば、あなたの仕事のスタイルは「作業者」から「司令塔」へと確実にランクアップします。

なぜ「DeferredDeliveryTime」なのか?

Outlookには標準で「配信タイミングの指定」機能がありますが、1通ずつ設定するのは苦行です。今回使う `DeferredDeliveryTime` プロパティは、Outlookのエンジンに対して「このメールは、指定した時刻になるまで送信トレイで眠らせておけ」と命令を下すためのものです。

単なる自動送信ではなく、「送信トレイ」という安全な場所に一度預ける。この「プロセスの分離」こそが、堅牢な自動化の第一歩です。

開発の全体設計

1. Excelリスト: 宛先、CC、件名、本文、送信予定日時を管理。
2. VBAエンジン: Excelから情報を吸い上げ、Outlookオブジェクトを制御。
3. 実行: 各メールを `DeferredDeliveryTime` で予約し、送信トレイへ放り込む。

現場でそのまま使える実装コード

まずは、Excelの標準モジュールに以下のコードを貼り付けてください。

Sub BulkScheduleEmails()
‘ 事前準備: 参照設定で “Microsoft Outlook 16.0 Object Library” を追加してください
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Dim ws As Worksheet
Dim lastRow As Long, i As Long

Set ws = ThisWorkbook.Sheets(“送信リスト”) ‘ リストがあるシート名
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

‘ Outlookのインスタンスを取得(なければ新規作成)
Set olApp = New Outlook.Application

For i = 2 To lastRow ‘ 2行目からデータ開始と仮定
Set olMail = olApp.CreateItem(olMailItem)

With olMail
.To = ws.Cells(i, 1).Value ‘ 宛先
.CC = ws.Cells(i, 2).Value ‘ CC
.Subject = ws.Cells(i, 3).Value ‘ 件名
.Body = ws.Cells(i, 4).Value ‘ 本文

‘ 【重要】ここで予約送信の魔法をかける
‘ Excelのセルに “2023/10/25 09:00:00” のように日時を入力しておくこと
.DeferredDeliveryTime = ws.Cells(i, 5).Value

.Save ‘ 一旦保存して送信トレイへ
.Close olSave
End With
Next i

MsgBox “全メールの予約が完了しました!”, vbInformation
End Sub

初学者が必ずハマる「3つの落とし穴」

このコードを動かす際に、多くの人が経験する壁があります。あらかじめ対策を知っておきましょう。

1. 「参照設定」という最初の壁

VBAエディタで `ツール > 参照設定` を開き、Microsoft Outlook 16.0 Object Library にチェックを入れてください。これを忘れると、「ユーザー定義型は定義されていません」というエラーで立ち止まってしまいます。

2. 日付形式の不一致

`DeferredDeliveryTime` に渡す値は、Excel上で「日付型」として認識されている必要があります。セルに文字列(「2023年10月25日」など)が入っているとエラーになることがあるので、Excel側でしっかり日付書式を設定するか、VBA側で `CDate()` 関数を使って明示的に変換するのがプロの流儀です。

3. Outlookが起動していない場合

Outlookが完全に終了していると、`olApp.CreateItem` でエラーになることがあります。実務では `On Error Resume Next` で起動チェックを行うか、あらかじめOutlookを起動しておく運用が安全です。

さらなる高みへ:エンジニアからのアドバイス

このコードは「メールを作る」ことの自動化ですが、次のステップとして「エラーハンドリング」を学ぶことをお勧めします。

例えば、宛先が空白だったらどうするか? 送信失敗したらログを残すには?
`If .To = “” Then MsgBox i & “行目の宛先が空です”` といったガード節を入れるだけで、あなたのプログラムの信頼性は一気に跳ね上がります。

最後に:なぜ自動化するのか

「楽をするため」は良い動機ですが、真の目的は「あなたの脳のメモリを空けること」です。

深夜の配信予約など、人間がPCの前に張り付くべきではない作業をOutlookに任せる。そうして空いた時間で、あなたはもっとクリエイティブで、あなたにしかできない仕事に集中してください。

何か不明点があれば、またいつでも聞きに来てください。応援していますよ!

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