Excel VBAでのシステムエラー報告メール送信方法

Excel VBAでのシステムエラー報告メール送信方法では、業務procedureのOn Error handlerでErr値を保存し、ErrorLogへ一行記録して、承認済みならOutlook通知を表示確認後にSendする。VBA Err objectは後続処理で値が変わり得るため、handler冒頭で必要fieldをlocal variableへ退避する。報告mailにはcredentialやsheet data全体を含めない。この記事はrun ID、Err.Number、Err.Source、Err.Description、発生時刻、workbook名を一error recordにするを判断軸にして、記事固有のコード、合否、停止条件、復元を順序立てて説明します。

一般mail作成ではなく、VBA Err objectを失わず安全に報告へ変換する。完了は「例外一件につき一つのrun IDとlog rowがあり、送信mailのNumber・DescriptionとSubmitted状態が同じrecordに一致する」です。結果が空なら「errorなしならreportを作らず、正常処理をErrorLogへ追加しない」として調べ、エラーを0件へ置き換えません。

目次

Err情報を上書き前に退避

業務procedureのOn Error handlerでErr値を保存し、ErrorLogへ一行記録して、承認済みならOutlook通知を表示確認後にSendする。承認後に送るVBAエラー報告メールでは、単にコマンドが終了したことではなく「例外一件につき一つのrun IDとlog rowがあり、送信mailのNumber・DescriptionとSubmitted状態が同じrecordに一致する」を完了条件にします。一般mail作成ではなく、VBA Err objectを失わず安全に報告へ変換する。

Err情報を上書き前に退避に入る前に、対象、実行場所、権限、入力の由来を確認します。errorなしならreportを作らず、正常処理をErrorLogへ追加しない。判定不能を成功へ丸めません。

ErrorLogの次行を確認

ErrorLogの次行を確認では「run ID、Err.Number、Err.Source、Err.Description、発生時刻、workbook名を一error recordにする」という粒度で対象を特定します。VBA Err objectは後続処理で値が変わり得るため、handler冒頭で必要fieldをlocal variableへ退避する。報告mailにはcredentialやsheet data全体を含めない。表示名や先頭候補だけを採用しません。

承認後に送るVBAエラー報告メールの対象が複数なら、候補数と除外理由を残します。承認後に送るVBAエラー報告メールでは実行ユーザー、OS・製品版、locale、カレントディレクトリも結果の解釈へ影響するため同時に記録します。

業務処理をhandlerで囲む

業務処理をhandlerで囲むは変更や出力生成より先に行う観測です。run ID、Err.Number、Err.Source、Err.Description、発生時刻、workbook名を一error recordにするを含む形で現状を保存し、後段のコードが同じ対象へ向くか確認します。

Option Explicit

Sub InspectDailyImport()
    Dim ws As Worksheet, connectionName As String
    Set ws = ThisWorkbook.Worksheets("ErrorLog")
    connectionName = "DailyImport"
    Debug.Print connectionName, ThisWorkbook.Connections(connectionName).Name
    Debug.Print "next log row=" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
End Sub

VBA Err objectは後続処理で値が変わり得るため、handler冒頭で必要fieldをlocal variableへ退避する。報告mailにはcredentialやsheet data全体を含めない。承認後に送るVBAエラー報告メールでは取得不能、対象なし、値が空という三状態を分け、stderrや終了コードを捨てません。

Number・Description・時刻を記録

Number・Description・時刻を記録では業務procedureのOn Error handlerでErr値を保存し、ErrorLogへ一行記録して、承認済みならOutlook通知を表示確認後にSendする。承認後に送るVBAエラー報告メールのサンプルにあるパス、セル、ユーザー、時刻は検証用なので、直前に確認した承認値へ置き換えます。

Option Explicit

Sub RefreshDailyImportWithApprovedErrorMail()
    Dim n As Long, sourceName As String, description As String
    Dim ws As Worksheet, cfg As Worksheet, r As Long, olApp As Object, mail As Object
    Dim answer As VbMsgBoxResult
    On Error GoTo Handler
    ThisWorkbook.Connections("DailyImport").Refresh
    ThisWorkbook.Worksheets("ErrorLog").Range("F2").Value2 = "Refresh requested " & Now
    Exit Sub
Handler:
    n = Err.Number: sourceName = Err.Source: description = Err.Description
    On Error GoTo ReportFailure
    Set ws = ThisWorkbook.Worksheets("ErrorLog")
    Set cfg = ThisWorkbook.Worksheets("Config")
    r = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
    ws.Cells(r, "A").Value2 = Now
    ws.Cells(r, "B").Value2 = n
    ws.Cells(r, "C").Value2 = sourceName
    ws.Cells(r, "D").Value2 = description
    ws.Cells(r, "E").Value2 = "Logged"
    If StrComp(Trim$(CStr(cfg.Range("B3").Value2)), "ApprovedToSend", vbTextCompare) <> 0 Then Exit Sub
    Set olApp = CreateObject("Outlook.Application")
    Set mail = olApp.CreateItem(0)
    With mail
        .To = Trim$(CStr(cfg.Range("B2").Value2))
        If Len(.To) = 0 Then Err.Raise 5, , "通知先が空です"
        .Subject = "DailyImport error " & Format$(Now, "yyyy-mm-dd hh:nn:ss")
        .Body = "Err.Number=" & n & vbCrLf & "Source=" & sourceName & vbCrLf & "Description=" & description
        If Not .Recipients.ResolveAll Then Err.Raise 5, , "通知先を解決できません"
        .Display
        answer = MsgBox("表示中の障害通知を1通送信しますか。機密情報を確認してください。", vbYesNo + vbExclamation, "障害通知の送信確認")
        If answer <> vbYes Then ws.Cells(r, "E").Value2 = "SendCancelled": Exit Sub
        .Send
    End With
    ws.Cells(r, "E").Value2 = "Submitted"
    Exit Sub
ReportFailure:
    ws.Cells(r, "E").Value2 = "ReportFailed: " & Err.Number
    MsgBox "エラー記録または通知送信にも失敗しました: " & Err.Description, vbExclamation
End Sub

意図的な1/0を本番診断へ残さない。handler内の二次error、個人情報、無限再通知を防ぐ。承認後に送るVBAエラー報告メールで変更が発生する場合は、新規出力、no-clobber、WhatIf、下書き表示など利用可能な安全機構を先に使います。

承認済みOutlook通知へ最小診断を入れてSendする

承認済みOutlook通知へ最小診断を入れてSendするでは入力と出力を別々に再取得します。承認後に送るVBAエラー報告メールの合格は、例外一件につき一つのrun IDとlog rowがあり、送信mailのNumber・DescriptionとSubmitted状態が同じrecordに一致することです。件数だけでなく識別値と内容も照合します。

Option Explicit

Sub VerifyLatestErrorNotification()
    Dim ws As Worksheet, r As Long
    Set ws = ThisWorkbook.Worksheets("ErrorLog")
    r = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    Debug.Print ws.Cells(r, "A").Value2, ws.Cells(r, "B").Value2, ws.Cells(r, "C").Value2
    Debug.Print "NotificationState=" & ws.Cells(r, "E").Value2
End Sub

errorなしならreportを作らず、正常処理をErrorLogへ追加しない。承認後に送るVBAエラー報告メールの結果が期待と違えば追加変更を重ねず、入力、対象範囲、locale・時刻、権限、製品仕様の順に戻って調べます。

機密値とstack情報の扱い

意図的な1/0を本番診断へ残さない。handler内の二次error、個人情報、無限再通知を防ぐ。機密値とstack情報の扱いに当てはまるときは中止理由、対象識別子、終了コードまたはErr.Number、直前に成功した段階を保存します。

errorなしならreportを作らず、正常処理をErrorLogへ追加しない。承認後に送るVBAエラー報告メールの再試行は原因を直し、同じ入力と対象を再確認してから行います。警告抑止や強制上書きで通しません。

同じerrorの通知stormを防ぐ

SendCancelledなら通知を送らずLoggedを残す。Submitted後の業務data rollbackは発生したprocedure固有のtransactionで行う。復元にも「run ID、Err.Number、Err.Source、Err.Description、発生時刻、workbook名を一error recordにする」を用い、類似名の別対象へ処理しません。

  • 承認後に送るVBAエラー報告メールの開始前状態
  • 採用対象: run ID、Err.Number、Err.Source、Err.Description、発生時刻、workbook名を一error recordにする
  • 復元後の確認: 例外一件につき一つのrun IDとlog rowがあり、送信mailのNumber・DescriptionとSubmitted状態が同じrecordに一致する
  • 復元を止める条件: 意図的な1/0を本番診断へ残さない。handler内の二次error、個人情報、無限再通知を防ぐ

復旧後に記録行を照合

同一run IDの重複を抑え、緊急度、再現手順、担当をmail本文の定型fieldにする。承認後に送るVBAエラー報告メールを反復するときは、正常、差分なし、対象なし、要承認、失敗を別の状態として記録します。

復旧後に記録行を照合の主キーrun ID、Err.Number、Err.Source、Err.Description、発生時刻、workbook名を一error recordにする
採用条件例外一件につき一つのrun IDとlog rowがあり、送信mailのNumber・DescriptionとSubmitted状態が同じrecordに一致する
空結果errorなしならreportを作らず、正常処理をErrorLogへ追加しない
中止条件意図的な1/0を本番診断へ残さない。handler内の二次error、個人情報、無限再通知を防ぐ

Err情報を上書き前に退避から証跡化する業務処理をhandlerで囲む

承認後に送るVBAエラー報告メールの証跡は「run ID、Err.Number、Err.Source、Err.Description、発生時刻、workbook名を一error recordにする」を主キーにします。Err情報を上書き前に退避で確認した値と、実行直前・実行直後の値を同じ作業番号に保存し、表示名が似ている別対象や前回の結果を混ぜません。

ErrorLogの次行を確認で空結果を判定するNumber・Description・時刻を記録

承認後に送るVBAエラー報告メールの空結果は「errorなしならreportを作らず、正常処理をErrorLogへ追加しない」として扱います。ErrorLogの次行を確認で入力自体が存在するか、権限で見えていないか、条件に一致しないだけかを分け、0件という表示だけで成功・失敗を決めません。

復旧後に記録行を照合から復旧可否を測るErr情報を上書き前に退避

承認後に送るVBAエラー報告メールの復旧判断では「SendCancelledなら通知を送らずLoggedを残す。Submitted後の業務data rollbackは発生したprocedure固有のtransactionで行う」を採用します。復旧後に記録行を照合を再確認し、復旧後に「例外一件につき一つのrun IDとlog rowがあり、送信mailのNumber・DescriptionとSubmitted状態が同じrecordに一致する」へ戻ったかを別の読み取り処理で測定します。

承認後に送るVBAエラー報告メールの事前確認では、run ID、Err.Number、Err.Source、Err.Description、発生時刻、workbook名を一error recordにするを画面表示や標準出力だけで済ませず、実行日時と一緒に作業記録へ写します。VBA Err objectは後続処理で値が変わり得るため、handler冒頭で必要fieldをlocal variableへ退避する。報告mailにはcredentialやsheet data全体を含めないという仕様があるため、似た名前の別対象、前回実行時の値、キャッシュされた表示を今回の対象と取り違えないことが重要です。

承認後に送るVBAエラー報告メールのコードを実行した直後は、まず終了状態を保存し、その後に別の読み取り処理で「例外一件につき一つのrun IDとlog rowがあり、送信mailのNumber・DescriptionとSubmitted状態が同じrecordに一致する」を確認します。承認後に送るVBAエラー報告メールでは同じコードの表示だけを合否判定に使うと部分成功や遅延反映を見逃すため、識別値、件数、内容の三点を照合します。

承認後に送るVBAエラー報告メールで結果が得られない場合は、errorなしならreportを作らず、正常処理をErrorLogへ追加しない。承認後に送るVBAエラー報告メールではこの状態と、権限拒否、入力形式の不一致、接続先や時刻の違いを一緒にしません。承認後に送るVBAエラー報告メールの対象候補数、除外された候補、最後に成功した確認処理を残すと、再試行で同じ失敗を重ねずに済みます。

承認後に送るVBAエラー報告メールを元へ戻す必要があるときは、SendCancelledなら通知を送らずLoggedを残す。Submitted後の業務data rollbackは発生したprocedure固有のtransactionで行う。承認後に送るVBAエラー報告メールの復元前にも変更後の識別値を再取得し、別担当者の更新が入っていないか確認します。承認後に送るVBAエラー報告メールの復元結果も通常処理と同じ完了条件で測り、戻したつもりという報告だけで閉じません。

承認後に送るVBAエラー報告メールを引き継ぐ記録には、同一run IDの重複を抑え、緊急度、再現手順、担当をmail本文の定型fieldにする。特に「意図的な1/0を本番診断へ残さない。handler内の二次error、個人情報、無限再通知を防ぐ」に該当した場合は、実行を止めたこと自体を正しい結果として扱います。承認後に送るVBAエラー報告メールの次回担当者が承認範囲と未処理対象を区別できるよう、作業番号と対象識別子を対応付けます。

承認後に送るVBAエラー報告メールの作業記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外理由を同じ作業番号で保存します。「run ID、Err.Number、Err.Source、Err.Description、発生時刻、workbook名を一error recordにする」を省くと別対象との比較になり得るため、日時、実行場所、製品版と一緒に残します。

Excel VBAでのシステムエラー報告メール送信方法を定期運用へ組み込む場合も初回は対話的に確認します。正常は「例外一件につき一つのrun IDとlog rowがあり、送信mailのNumber・DescriptionとSubmitted状態が同じrecordに一致する」、空結果は「errorなしならreportを作らず、正常処理をErrorLogへ追加しない」、停止は「意図的な1/0を本番診断へ残さない。handler内の二次error、個人情報、無限再通知を防ぐ」として報告し、次の担当者が同じ条件で追試できるようにします。

記録の成功と通知送信を別状態で残す

Import失敗は先にErrorLogへ保存し、その後Config!B3がApprovedToSendの場合だけ通知作成へ進みます。宛先解決、画面上の機密情報確認、Yesの最終確認を通過した一通に限りSendを呼び出します。

再試行ループは設けません。E列のLogged、SendCancelled、Submitted、ReportFailedを使い、通知失敗が元のImportエラーを上書きしないようErr.Number・Source・Descriptionを先に退避します。

公式情報・参考資料

VBA例外を記録するエラー報告下書きのコマンド、API、対応範囲は次の公式一次資料で確認しました。確認日は2026年7月17日です。VBA例外を記録するエラー報告下書きの実行環境にあるman、–help、VBA Object Browser、Get-Helpも併用してください。

この記事を書いた人

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

コメント

コメントする

目次