Excel VBAでOutlookの特定テンプレートをスケジュールしてメール送信する方法

Excel VBAでOutlookの特定テンプレートをスケジュールしてメール送信する方法では、実在OFTからitemを作り、未来時刻と宛先を設定してDisplayし、人が確認後にSendしてOutlookへ委ねる。DeferredDeliveryTimeはMailItemの配信時刻を指定するが、MailItemが送信操作され、Outlook/Exchange環境の条件を満たして初めて処理される。.Displayだけでは自動送信されない。この記事はschedule row、OFT absolute path、recipient、DeferredDeliveryTime、queue statusを一つにするを判断軸にして、記事固有のコード、合否、停止条件、復元を順序立てて説明します。

本文を一から組み立てるseq178と違い、承認済みOFT templateと将来時刻を使う。完了は「template内容、正しいrecipient、未来のDeferredDeliveryTimeを確認してSendし、schedule rowがQueuedになる」です。結果が空なら「templateやrecipientが空ならitemを作らず、既定templateや過去時刻へ補正しない」として調べ、エラーを0件へ置き換えません。

目次

OFTテンプレートpathとfuture時刻を読む

OFTテンプレートpathとfuture時刻を読むでは「schedule row、OFT absolute path、recipient、DeferredDeliveryTime、queue statusを一つにする」という粒度で対象を特定します。DeferredDeliveryTimeはMailItemの配信時刻を指定するが、MailItemが送信操作され、Outlook/Exchange環境の条件を満たして初めて処理される。.Displayだけでは自動送信されない。表示名や先頭候補だけを採用しません。

Outlookテンプレートの予約送信の対象が複数なら、候補数と除外理由を残します。Outlookテンプレートの予約送信では実行ユーザー、OS・製品版、locale、カレントディレクトリも結果の解釈へ影響するため同時に記録します。

CreateItemFromTemplateでMailItemを作る

CreateItemFromTemplateでMailItemを作るは変更や出力生成より先に行う観測です。schedule row、OFT absolute path、recipient、DeferredDeliveryTime、queue statusを一つにするを含む形で現状を保存し、後段のコードが同じ対象へ向くか確認します。

Option Explicit

Sub InspectSchedule()
    With ThisWorkbook.Worksheets("Schedule")
        Debug.Print "Template=" & .Range("B2").Value2
        Debug.Print "Recipient=" & .Range("C2").Value2
        Debug.Print "Deferred=" & .Range("D2").Value2
        Debug.Print "Approval=" & .Range("E2").Value2, "State=" & .Range("F2").Value2
    End With
End Sub

DeferredDeliveryTimeはMailItemの配信時刻を指定するが、MailItemが送信操作され、Outlook/Exchange環境の条件を満たして初めて処理される。.Displayだけでは自動送信されない。Outlookテンプレートの予約送信では取得不能、対象なし、値が空という三状態を分け、stderrや終了コードを捨てません。

宛先を一件へ限定

実在OFTからitemを作り、未来時刻と宛先を設定してDisplayし、人が確認後にSendしてOutlookへ委ねる。Outlookテンプレートの予約送信では、単にコマンドが終了したことではなく「template内容、正しいrecipient、未来のDeferredDeliveryTimeを確認してSendし、schedule rowがQueuedになる」を完了条件にします。本文を一から組み立てるseq178と違い、承認済みOFT templateと将来時刻を使う。

宛先を一件へ限定に入る前に、対象、実行場所、権限、入力の由来を確認します。templateやrecipientが空ならitemを作らず、既定templateや過去時刻へ補正しない。判定不能を成功へ丸めません。

DeferredDeliveryTimeを設定

DeferredDeliveryTimeを設定では実在OFTからitemを作り、未来時刻と宛先を設定してDisplayし、人が確認後にSendしてOutlookへ委ねる。Outlookテンプレートの予約送信のサンプルにあるパス、セル、ユーザー、時刻は検証用なので、直前に確認した承認値へ置き換えます。

Option Explicit

Sub QueueApprovedTemplateMail()
    Dim ws As Worksheet, olApp As Object, mail As Object, deliverAt As Date
    Dim templatePath As String, recipient As String, stateText As String
    Dim answer As VbMsgBoxResult, queueError As String
    Set ws = ThisWorkbook.Worksheets("Schedule")
    If StrComp(Trim$(CStr(ws.Range("E2").Value2)), "ApprovedToQueue", vbTextCompare) <> 0 Then Exit Sub
    stateText = Trim$(CStr(ws.Range("F2").Value2))
    If Len(stateText) > 0 And StrComp(stateText, "ReadyToQueue", vbTextCompare) <> 0 Then _
        Err.Raise 5, , "F2が空またはReadyToQueueの未処理行だけを登録します。現在=" & stateText
    If Not IsDate(ws.Range("D2").Value) Then Err.Raise 13, , "配信予定が日付ではありません"
    deliverAt = CDate(ws.Range("D2").Value)
    If deliverAt <= Now Then Err.Raise 5, , "配信予定は未来を指定します"
    templatePath = Trim$(CStr(ws.Range("B2").Value2))
    recipient = Trim$(CStr(ws.Range("C2").Value2))
    If Len(templatePath) = 0 Or Dir$(templatePath) = "" Then Err.Raise 53, , "テンプレートがありません"
    If Len(recipient) = 0 Then Err.Raise 5, , "宛先が空です"
    ws.Range("F2").Value2 = "Queueing " & Format$(Now, "yyyy-mm-dd hh:nn:ss")
    On Error GoTo QueueFailure
    Set olApp = CreateObject("Outlook.Application")
    Set mail = olApp.CreateItemFromTemplate(templatePath)
    With mail
        .To = recipient
        .DeferredDeliveryTime = deliverAt
        If Not .Recipients.ResolveAll Then Err.Raise 5, , "宛先を解決できません"
        .Display
        answer = MsgBox("宛先・本文・配信予定を確認し、この未処理の1通を送信トレイへ登録しますか。", vbYesNo + vbQuestion, "予約送信の最終確認")
        If answer <> vbYes Then ws.Range("F2").Value2 = "QueueCancelled": Exit Sub
        .Send
    End With
    ws.Range("F2").Value2 = "Queued " & Format$(deliverAt, "yyyy-mm-dd hh:nn")
    Exit Sub
QueueFailure:
    queueError = CStr(Err.Number) & " " & Err.Description
    ws.Range("F2").Value2 = "QueueFailedReview " & Format$(Now, "yyyy-mm-dd hh:nn:ss")
    Err.Raise vbObjectError + 180, , queueError
End Sub

ApprovedToQueueと最終確認なしにSendしない。time zone、Outlook起動、offline、Exchange policyで遅延挙動が変わる。Outlookテンプレートの予約送信で変更が発生する場合は、新規出力、no-clobber、WhatIf、下書き表示など利用可能な安全機構を先に使います。

Displayで内容を人が確認

Displayで内容を人が確認では入力と出力を別々に再取得します。Outlookテンプレートの予約送信の合格は、template内容、正しいrecipient、未来のDeferredDeliveryTimeを確認してSendし、schedule rowがQueuedになることです。件数だけでなく識別値と内容も照合します。

Option Explicit

Sub VerifyQueuedScheduleRow()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Schedule")
    If IsDate(ws.Range("D2").Value) Then
        Debug.Print "Future=" & (CDate(ws.Range("D2").Value) > Now)
    Else
        Debug.Print "Future=False (invalid date)"
    End If
    Debug.Print "Approval=" & ws.Range("E2").Value2, "State=" & ws.Range("F2").Value2
End Sub

templateやrecipientが空ならitemを作らず、既定templateや過去時刻へ補正しない。Outlookテンプレートの予約送信の結果が期待と違えば追加変更を重ねず、入力、対象範囲、locale・時刻、権限、製品仕様の順に戻って調べます。

過去時刻やtemplate不存在

ApprovedToQueueと最終確認なしにSendしない。time zone、Outlook起動、offline、Exchange policyで遅延挙動が変わる。過去時刻やtemplate不存在に当てはまるときは中止理由、対象識別子、終了コードまたはErr.Number、直前に成功した段階を保存します。

templateやrecipientが空ならitemを作らず、既定templateや過去時刻へ補正しない。Outlookテンプレートの予約送信の再試行は原因を直し、同じ入力と対象を再確認してから行います。警告抑止や強制上書きで通しません。

送信トレイに残る条件を理解

配信時刻、mailbox、送信後statusを別監視し、Displayした事実を配信完了にしない。Outlookテンプレートの予約送信を反復するときは、正常、差分なし、対象なし、要承認、失敗を別の状態として記録します。

送信トレイに残る条件を理解の主キーschedule row、OFT absolute path、recipient、DeferredDeliveryTime、queue statusを一つにする
採用条件template内容、正しいrecipient、未来のDeferredDeliveryTimeを確認してSendし、schedule rowがQueuedになる
空結果templateやrecipientが空ならitemを作らず、既定templateや過去時刻へ補正しない
中止条件ApprovedToQueueと最終確認なしにSendしない。time zone、Outlook起動、offline、Exchange policyで遅延挙動が変わる

OFTテンプレートpathとfuture時刻を読むから証跡化する宛先を一件へ限定

Outlookテンプレートの予約送信の証跡は「schedule row、OFT absolute path、recipient、DeferredDeliveryTime、queue statusを一つにする」を主キーにします。OFTテンプレートpathとfuture時刻を読むで確認した値と、実行直前・実行直後の値を同じ作業番号に保存し、表示名が似ている別対象や前回の結果を混ぜません。

CreateItemFromTemplateでMailItemを作るで空結果を判定するDeferredDeliveryTimeを設定

Outlookテンプレートの予約送信の空結果は「templateやrecipientが空ならitemを作らず、既定templateや過去時刻へ補正しない」として扱います。CreateItemFromTemplateでMailItemを作るで入力自体が存在するか、権限で見えていないか、条件に一致しないだけかを分け、0件という表示だけで成功・失敗を決めません。

送信トレイに残る条件を理解から復旧可否を測るOFTテンプレートpathとfuture時刻を読む

Outlookテンプレートの予約送信の復旧判断では「QueueCancelledならschedule statusを承認の上で未処理へ戻す。Queued後は送信済みitemを照合する」を採用します。送信トレイに残る条件を理解を再確認し、復旧後に「template内容、正しいrecipient、未来のDeferredDeliveryTimeを確認してSendし、schedule rowがQueuedになる」へ戻ったかを別の読み取り処理で測定します。

Outlookテンプレートの予約送信の事前確認では、schedule row、OFT absolute path、recipient、DeferredDeliveryTime、queue statusを一つにするを画面表示や標準出力だけで済ませず、実行日時と一緒に作業記録へ写します。DeferredDeliveryTimeはMailItemの配信時刻を指定するが、MailItemが送信操作され、Outlook/Exchange環境の条件を満たして初めて処理される。.Displayだけでは自動送信されないという仕様があるため、似た名前の別対象、前回実行時の値、キャッシュされた表示を今回の対象と取り違えないことが重要です。

Outlookテンプレートの予約送信のコードを実行した直後は、まず終了状態を保存し、その後に別の読み取り処理で「template内容、正しいrecipient、未来のDeferredDeliveryTimeを確認してSendし、schedule rowがQueuedになる」を確認します。Outlookテンプレートの予約送信では同じコードの表示だけを合否判定に使うと部分成功や遅延反映を見逃すため、識別値、件数、内容の三点を照合します。

Outlookテンプレートの予約送信で結果が得られない場合は、templateやrecipientが空ならitemを作らず、既定templateや過去時刻へ補正しない。Outlookテンプレートの予約送信ではこの状態と、権限拒否、入力形式の不一致、接続先や時刻の違いを一緒にしません。Outlookテンプレートの予約送信の対象候補数、除外された候補、最後に成功した確認処理を残すと、再試行で同じ失敗を重ねずに済みます。

Outlookテンプレートの予約送信を元へ戻す必要があるときは、QueueCancelledならschedule statusを承認の上で未処理へ戻す。Queued後は送信済みitemを照合する。Outlookテンプレートの予約送信の復元前にも変更後の識別値を再取得し、別担当者の更新が入っていないか確認します。Outlookテンプレートの予約送信の復元結果も通常処理と同じ完了条件で測り、戻したつもりという報告だけで閉じません。

Outlookテンプレートの予約送信を引き継ぐ記録には、配信時刻、mailbox、送信後statusを別監視し、Displayした事実を配信完了にしない。特に「ApprovedToQueueと最終確認なしにSendしない。time zone、Outlook起動、offline、Exchange policyで遅延挙動が変わる」に該当した場合は、実行を止めたこと自体を正しい結果として扱います。Outlookテンプレートの予約送信の次回担当者が承認範囲と未処理対象を区別できるよう、作業番号と対象識別子を対応付けます。

Outlookテンプレートの予約送信の作業記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外理由を同じ作業番号で保存します。「schedule row、OFT absolute path、recipient、DeferredDeliveryTime、queue statusを一つにする」を省くと別対象との比較になり得るため、日時、実行場所、製品版と一緒に残します。

Excel VBAでOutlookの特定テンプレートをスケジュールしてメール送信する方法を定期運用へ組み込む場合も初回は対話的に確認します。正常は「template内容、正しいrecipient、未来のDeferredDeliveryTimeを確認してSendし、schedule rowがQueuedになる」、空結果は「templateやrecipientが空ならitemを作らず、既定templateや過去時刻へ補正しない」、停止は「ApprovedToQueueと最終確認なしにSendしない。time zone、Outlook起動、offline、Exchange policyで遅延挙動が変わる」として報告し、次の担当者が同じ条件で追試できるようにします。

DeferredDeliveryTimeを設定してSendする

DeferredDeliveryTimeを代入してDisplayしただけでは予約送信は成立しません。E2のApprovedToQueueに加え、F2が空またはReadyToQueueの未処理行だけを受け付け、Send前にQueueingへ先行遷移します。Queued・QueueFailedReview・QueueCancelledの行は、状態を照合して明示的に未処理へ戻すまで再登録しません。

QueuedはOutlookの送信トレイへ登録した状態であり、同じ行の再実行を禁止する完了stateでもあります。QueueFailedReviewはSend成否が曖昧な可能性があるため、送信トレイ・送信済みitem・message traceを照合するまでReadyToQueueへ戻しません。

公式情報・参考資料

Outlookテンプレートの配信時刻付き下書きのコマンド、API、対応範囲は次の公式一次資料で確認しました。確認日は2026年7月17日です。Outlookテンプレートの配信時刻付き下書きの実行環境にあるman、–help、VBA Object Browser、Get-Helpも併用してください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次