Excel VBAを用いた予約変更の自動メール送信の方法では、ApprovedChangeの一行でold/newが異なること、宛先とtimezoneを確認し、両日時を並べたOutlook mailをSendする。予約変更通知では新日時だけでなく旧日時との対比が必要で、Date値とtimezoneを同じ基準で比較する。差分なしなら通知を作らない。この記事はchange ID、reservation ID、recipient、old datetime、new datetime、approval statusを一変更にするを判断軸にして、記事固有のコード、合否、停止条件、復元を順序立てて説明します。
seq192の初回確認と違い、確定済み予約のold/new差分を明示する。完了は「recipientとchange IDが一致し、timezone付き旧日時・新日時をSendしてstatusがSubmittedChangeになる」です。結果が空なら「差分なし、approvalなし、recipientなしなら送信itemを作らず、元値を推測しない」として調べ、エラーを0件へ置き換えません。
change IDとreservation IDを分ける
ApprovedChangeの一行でold/newが異なること、宛先とtimezoneを確認し、両日時を並べたOutlook mailをSendする。承認済み予約変更メールの送信では、単にコマンドが終了したことではなく「recipientとchange IDが一致し、timezone付き旧日時・新日時をSendしてstatusがSubmittedChangeになる」を完了条件にします。seq192の初回確認と違い、確定済み予約のold/new差分を明示する。
change IDとreservation IDを分けるに入る前に、対象、実行場所、権限、入力の由来を確認します。差分なし、approvalなし、recipientなしなら送信itemを作らず、元値を推測しない。判定不能を成功へ丸めません。
変更前・変更後日時を比較
変更前・変更後日時を比較は変更や出力生成より先に行う観測です。change ID、reservation ID、recipient、old datetime、new datetime、approval statusを一変更にするを含む形で現状を保存し、後段のコードが同じ対象へ向くか確認します。
Option Explicit
Sub InspectReservationChange()
With ThisWorkbook.Worksheets("Changes")
Debug.Print "ID=" & .Range("A2").Value2, "To=" & .Range("B2").Value2
Debug.Print "Before=" & .Range("C2").Value2, "After=" & .Range("D2").Value2
Debug.Print "TimeZoneLabel=" & .Range("E2").Value2, "State=" & .Range("H2").Value2
End With
End Sub
予約変更通知では新日時だけでなく旧日時との対比が必要で、Date値とtimezoneを同じ基準で比較する。差分なしなら通知を作らない。承認済み予約変更メールの送信では取得不能、対象なし、値が空という三状態を分け、stderrや終了コードを捨てません。
差分なしrowを除外
差分なしrowを除外では「change ID、reservation ID、recipient、old datetime、new datetime、approval statusを一変更にする」という粒度で対象を特定します。予約変更通知では新日時だけでなく旧日時との対比が必要で、Date値とtimezoneを同じ基準で比較する。差分なしなら通知を作らない。表示名や先頭候補だけを採用しません。
承認済み予約変更メールの送信の対象が複数なら、候補数と除外理由を残します。承認済み予約変更メールの送信では実行ユーザー、OS・製品版、locale、カレントディレクトリも結果の解釈へ影響するため同時に記録します。
ApprovedChangeだけ本文生成
ApprovedChangeだけ本文生成ではApprovedChangeの一行でold/newが異なること、宛先とtimezoneを確認し、両日時を並べたOutlook mailをSendする。承認済み予約変更メールの送信のサンプルにあるパス、セル、ユーザー、時刻は検証用なので、直前に確認した承認値へ置き換えます。
Option Explicit
Sub SendApprovedReservationChange()
Dim ws As Worksheet, olApp As Object, mail As Object
Dim changeId As String, recipient As String, zoneLabel As String
Dim beforeAt As Date, afterAt As Date, sendError As String
Set ws = ThisWorkbook.Worksheets("Changes")
If StrComp(Trim$(CStr(ws.Range("H2").Value2)), "ApprovedChange", vbTextCompare) <> 0 Then Exit Sub
changeId = Trim$(CStr(ws.Range("A2").Value2))
recipient = Trim$(CStr(ws.Range("B2").Value2))
zoneLabel = Trim$(CStr(ws.Range("E2").Value2))
If Len(changeId) = 0 Or Len(recipient) = 0 Or Len(zoneLabel) = 0 Then Err.Raise 5, , "ID・宛先・タイムゾーン表記が必要です"
If Not IsDate(ws.Range("C2").Value) Or Not IsDate(ws.Range("D2").Value) Then Err.Raise 13, , "変更前後が日付ではありません"
beforeAt = CDate(ws.Range("C2").Value): afterAt = CDate(ws.Range("D2").Value)
If beforeAt = afterAt Then Err.Raise 5, , "日時差分なし"
If afterAt <= Now Then Err.Raise 5, , "変更後日時は未来を指定します"
ws.Range("H2").Value2 = "SubmittingChange"
On Error GoTo SendFailure
Set olApp = CreateObject("Outlook.Application")
Set mail = olApp.CreateItem(0)
With mail
.To = recipient
.Subject = "予約変更 " & changeId
.Body = "変更前: " & Format$(beforeAt, "yyyy-mm-dd hh:nn") & " " & zoneLabel & vbCrLf & _
"変更後: " & Format$(afterAt, "yyyy-mm-dd hh:nn") & " " & zoneLabel
If Not .Recipients.ResolveAll Then Err.Raise 5, , "変更通知の宛先を解決できません"
.Send
End With
ws.Range("H2").Value2 = "SubmittedChange"
Exit Sub
SendFailure:
sendError = CStr(Err.Number) & " " & Err.Description
ws.Range("H2").Value2 = "SendFailedChange"
Err.Raise vbObjectError + 193, , sendError
End Sub
cancelを単なる日時変更として送らない。timezoneや夏時間を表示せず曖昧な日時を通知しない。承認済み予約変更メールの送信で変更が発生する場合は、新規出力、no-clobber、WhatIf、送信item表示など利用可能な安全機構を先に使います。
old/newを並べてDisplay
cancelを単なる日時変更として送らない。timezoneや夏時間を表示せず曖昧な日時を通知しない。old/newを並べてDisplayに当てはまるときは中止理由、対象識別子、終了コードまたはErr.Number、直前に成功した段階を保存します。
差分なし、approvalなし、recipientなしなら送信itemを作らず、元値を推測しない。承認済み予約変更メールの送信の再試行は原因を直し、同じ入力と対象を再確認してから行います。警告抑止や強制上書きで通しません。
cancelやtimezone変更の扱い
cancelやtimezone変更の扱いでは入力と出力を別々に再取得します。承認済み予約変更メールの送信の合格は、recipientとchange IDが一致し、timezone付き旧日時・新日時をSendしてstatusがSubmittedChangeになることです。件数だけでなく識別値と内容も照合します。
Sub VerifyChangeSubmission()
With ThisWorkbook.Worksheets("Changes")
Debug.Print "ID=" & .Range("A2").Value2, "State=" & .Range("H2").Value2
Debug.Print "Different=" & (CDate(.Range("C2").Value) <> CDate(.Range("D2").Value))
Debug.Print "TimeZoneLabel=" & .Range("E2").Value2
End With
End Sub
差分なし、approvalなし、recipientなしなら送信itemを作らず、元値を推測しない。承認済み予約変更メールの送信の結果が期待と違えば追加変更を重ねず、入力、対象範囲、locale・時刻、権限、製品仕様の順に戻って調べます。
SubmittedChangeを検証
同じchange IDを二度処理せず、送信後にNotifiedへ遷移する外部確認を用意する。承認済み予約変更メールの送信を反復するときは、正常、差分なし、対象なし、要承認、失敗を別の状態として記録します。
| SubmittedChangeを検証の主キー | change ID、reservation ID、recipient、old datetime、new datetime、approval statusを一変更にする |
| 採用条件 | recipientとchange IDが一致し、timezone付き旧日時・新日時をSendしてstatusがSubmittedChangeになる |
| 空結果 | 差分なし、approvalなし、recipientなしなら送信itemを作らず、元値を推測しない |
| 中止条件 | cancelを単なる日時変更として送らない。timezoneや夏時間を表示せず曖昧な日時を通知しない |
change IDとreservation IDを分けるから証跡化する差分なしrowを除外
承認済み予約変更メールの送信の証跡は「change ID、reservation ID、recipient、old datetime、new datetime、approval statusを一変更にする」を主キーにします。change IDとreservation IDを分けるで確認した値と、実行直前・実行直後の値を同じ作業番号に保存し、表示名が似ている別対象や前回の結果を混ぜません。
変更前・変更後日時を比較で空結果を判定するApprovedChangeだけ本文生成
承認済み予約変更メールの送信の空結果は「差分なし、approvalなし、recipientなしなら送信itemを作らず、元値を推測しない」として扱います。変更前・変更後日時を比較で入力自体が存在するか、権限で見えていないか、条件に一致しないだけかを分け、0件という表示だけで成功・失敗を決めません。
SubmittedChangeを検証から復旧可否を測るchange IDとreservation IDを分ける
承認済み予約変更メールの送信の復旧判断では「SendFailedで未送信と確認できた変更rowだけを承認手順でApprovedChangeへ戻す」を採用します。SubmittedChangeを検証を再確認し、復旧後に「recipientとchange IDが一致し、timezone付き旧日時・新日時をSendしてstatusがSubmittedChangeになる」へ戻ったかを別の読み取り処理で測定します。
承認済み予約変更メールの送信の事前確認では、change ID、reservation ID、recipient、old datetime、new datetime、approval statusを一変更にするを画面表示や標準出力だけで済ませず、実行日時と一緒に作業記録へ写します。予約変更通知では新日時だけでなく旧日時との対比が必要で、Date値とtimezoneを同じ基準で比較する。差分なしなら通知を作らないという仕様があるため、似た名前の別対象、前回実行時の値、キャッシュされた表示を今回の対象と取り違えないことが重要です。
承認済み予約変更メールの送信のコードを実行した直後は、まず終了状態を保存し、その後に別の読み取り処理で「recipientとchange IDが一致し、timezone付き旧日時・新日時をSendしてstatusがSubmittedChangeになる」を確認します。承認済み予約変更メールの送信では同じコードの表示だけを合否判定に使うと部分成功や遅延反映を見逃すため、識別値、件数、内容の三点を照合します。
承認済み予約変更メールの送信で結果が得られない場合は、差分なし、approvalなし、recipientなしなら送信itemを作らず、元値を推測しない。承認済み予約変更メールの送信ではこの状態と、権限拒否、入力形式の不一致、接続先や時刻の違いを一緒にしません。承認済み予約変更メールの送信の対象候補数、除外された候補、最後に成功した確認処理を残すと、再試行で同じ失敗を重ねずに済みます。
承認済み予約変更メールの送信を元へ戻す必要があるときは、SendFailedで未送信と確認できた変更rowだけを承認手順でApprovedChangeへ戻す。承認済み予約変更メールの送信の復元前にも変更後の識別値を再取得し、別担当者の更新が入っていないか確認します。承認済み予約変更メールの送信の復元結果も通常処理と同じ完了条件で測り、戻したつもりという報告だけで閉じません。
承認済み予約変更メールの送信を引き継ぐ記録には、同じchange IDを二度処理せず、送信後にNotifiedへ遷移する外部確認を用意する。特に「cancelを単なる日時変更として送らない。timezoneや夏時間を表示せず曖昧な日時を通知しない」に該当した場合は、実行を止めたこと自体を正しい結果として扱います。承認済み予約変更メールの送信の次回担当者が承認範囲と未処理対象を区別できるよう、作業番号と対象識別子を対応付けます。
承認済み予約変更メールの送信の作業記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外理由を同じ作業番号で保存します。「change ID、reservation ID、recipient、old datetime、new datetime、approval statusを一変更にする」を省くと別対象との比較になり得るため、日時、実行場所、製品版と一緒に残します。
Excel VBAを用いた予約変更の自動メール送信の方法を定期運用へ組み込む場合も初回は対話的に確認します。正常は「recipientとchange IDが一致し、timezone付き旧日時・新日時をSendしてstatusがSubmittedChangeになる」、空結果は「差分なし、approvalなし、recipientなしなら送信itemを作らず、元値を推測しない」、停止は「cancelを単なる日時変更として送らない。timezoneや夏時間を表示せず曖昧な日時を通知しない」として報告し、次の担当者が同じ条件で追試できるようにします。
変更通知を承認状態からSendする
ID、宛先、変更前後日時、タイムゾーン表記を検証し、H2がApprovedChangeのときだけ処理します。重複実行を避けるため先にSubmittingChangeへ遷移し、Recipients.ResolveAll後にSend、成功時にSubmittedChangeへ更新します。
本文には変更前後の両方へ同じタイムゾーン表記を明示します。SubmittedChangeは配送完了ではないため、再実行判断は送信済みアイテムをchange IDで照合してから行います。
公式情報・参考資料
予約変更差分のメール下書きのコマンド、API、対応範囲は次の公式一次資料で確認しました。確認日は2026年7月17日です。予約変更差分のメール下書きの実行環境にあるman、–help、VBA Object Browser、Get-Helpも併用してください。

コメント