【入門編】【中級者向け】送信予約(DeferredDeliveryTime)をExcelのスケジュール表から一括設定し、下書きに保存するバッチ処理 – Outlook VBA解析バイブル

スポンサーリンク

【Outlook VBAの極意】Excelで「送信予約」を完全制御せよ!自動化バッチ作成の究極ガイド

こんにちは。現場で泥臭い自動化を積み重ねてきたエンジニアです。

「毎日決まった時間に、大量のメールを予約送信しなければならない」。そんなルーチンワークに追われていませんか?
手動で一件ずつ予約設定をするのは時間の無駄。今回は、Excelのスケジュール表を読み込み、Outlookの下書きに「送信予約済み」の状態で放り込むバッチ処理を伝授します。

これをマスターすれば、あなたはもう「メール配信係」ではなく「メール配信システムの設計者」です。さあ、深い領域へ足を踏み入れましょう。

—

1. なぜ「Outlook VBA」なのか?

「マクロの記録」ボタンを押して生成されたコードは、いわば「初心者の歩み」です。実務で求められるのは、「オブジェクトのライフサイクル」を制御する力です。

今回扱う `DeferredDeliveryTime` プロパティは、メールの送信を一時的に留保する魔法のパラメータ。これとExcelの行データを掛け合わせることで、Outlookは強力なメール配信エンジンに変貌します。

—

2. 準備:Excel側のデータ構造

まず、Excelのシート(Sheet1)に以下の項目を用意してください。

| A列(宛先) | B列(件名) | C列(本文) | D列(送信予定日時) |
| :— | :— | :— | :— |
| test@example.com | 業務連絡 | お疲れ様です… | 2023/12/25 09:00 |

※D列の日時は「標準形式(日付)」で入力してください。

—

3. 実践:送信予約バッチのコード

このコードは、ExcelからOutlookを操作する「外部制御」のスタイルで記述します。ExcelのVBE(Alt + F11)を開き、`ツール` > `参照設定` から 「Microsoft Outlook 16.0 Object Library」 にチェックを入れてから実行してください。

Sub CreateScheduledEmails()
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Dim ws As Worksheet
Dim i As Long

‘ Outlookのインスタンスを取得(なければ起動)
On Error Resume Next
Set olApp = GetObject(, “Outlook.Application”)
If olApp Is Nothing Then Set olApp = New Outlook.Application
On Error GoTo 0

Set ws = ThisWorkbook.Sheets(“Sheet1”)

‘ 2行目から最終行までループ
For i = 2 To ws.Cells(Rows.Count, 1).End(xlUp).Row
‘ 新規メールアイテムを作成
Set olMail = olApp.CreateItem(olMailItem)

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

‘ 【重要】送信予約の適用
‘ D列の日時をDate型として解釈し、予約プロパティに代入
.DeferredDeliveryTime = CDate(ws.Cells(i, 4).Value)

‘ 下書きに保存(直ちに送信せず、保留する)
.Save
End With
Next i

MsgBox “全メールの下書き保存と予約設定が完了しました!”, vbInformation
End Sub

—

4. 現場でハマる「落とし穴」と解決策

ここからがプロの知見です。初心者が必ず躓くポイントを先回りして解説します。

① 日時フォーマットの不整合

`CDate()` 関数は強力ですが、Excel上の値が「文字列」として認識されているとエラーになります。セルが「右寄せ」になっているか確認してください。もしエラーが出る場合は、`CDate(ws.Cells(i, 4).Text)` とすることで、表示形式通りに変換を試みるのがコツです。

② Outlookの「送信トレイ」と「下書き」の違い

上記コードでは `.Save` を使っています。これによりメールは「下書き」フォルダに入ります。この状態で予約日時が来ると、Outlookは自動的に送信トレイへ移動し、送信を実行します。
注意: 送信予約はOutlookが「起動している時」にしか動作しません。サーバーサイドの機能ではないことを理解しておきましょう。

③ オブジェクトの解放

コード内で `Set olMail = Nothing` を書く人がいますが、VBAのスコープ内であればループ終了時に自動解放されます。ただ、大規模なバッチ処理を行う際は、メモリリークを防ぐため、ループの最後に `Set olMail = Nothing` を明示的に記述する癖をつけておくと、より堅牢なコードになります。

—

5. 次のステップ:さらなる自動化へ

このコードを応用すれば、以下のようなカスタマイズが可能です。

  • 添付ファイル送信: `.Attachments.Add “C:\Files\Report.pdf”` を追加する。
  • HTMLメール: `.HTMLBody = “

    こんにちは

    “` に書き換えて、リッチなメールを作成する。

  • 宛先の動的抽出: `ADODB` や `SQL` を使って、社内データベースから宛先リストを直接引っ張ってくる。

プログラミングは「コードを書くこと」ではなく「運用を設計すること」です。今回のコードをベースに、あなたの現場に合わせた最強の自動化ツールを作り上げてください。

「ここをもっと詳しく知りたい!」という要望があれば、いつでも教えてくださいね。応援しています!

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