Excel VBAを用いたメール添付ファイルの受信者別整理方法

Excel VBAを用いたメール添付ファイルの受信者別整理方法では、選択mail一件のRecipientsをResolveし、承認root配下のsafe key folderへ、同名衝突を検査して添付を保存する。MailItem.Toは表示文字列で複数recipientや区切り文字を含み得る。Recipients collectionを解決し、folder名に使える正規化keyを別途作る必要がある。この記事はEntryID、resolved recipient address、Attachment.FileName、size、target full pathを保存単位にするを判断軸にして、記事固有のコード、合否、停止条件、復元を順序立てて説明します。

mail送信ではなく、既存mailの添付をrecipient分類で安全にstagingする。完了は「各添付が意図したrecipient key配下に一つずつあり、元のfile名・size・hashと対応し、別mailを処理していない」です。結果が空なら「添付0件やrecipient未解決なら保存せず、空folderだけを量産しない」として調べ、エラーを0件へ置き換えません。

目次

選択MailItemを一件に限定

選択MailItemを一件に限定では「EntryID、resolved recipient address、Attachment.FileName、size、target full pathを保存単位にする」という粒度で対象を特定します。MailItem.Toは表示文字列で複数recipientや区切り文字を含み得る。Recipients collectionを解決し、folder名に使える正規化keyを別途作る必要がある。表示名や先頭候補だけを採用しません。

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

Recipientsを解決してSMTP keyを作る

選択mail一件のRecipientsをResolveし、承認root配下のsafe key folderへ、同名衝突を検査して添付を保存する。受信者別のOutlook添付ファイル整理では、単にコマンドが終了したことではなく「各添付が意図したrecipient key配下に一つずつあり、元のfile名・size・hashと対応し、別mailを処理していない」を完了条件にします。mail送信ではなく、既存mailの添付をrecipient分類で安全にstagingする。

Recipientsを解決してSMTP keyを作るに入る前に、対象、実行場所、権限、入力の由来を確認します。添付0件やrecipient未解決なら保存せず、空folderだけを量産しない。判定不能を成功へ丸めません。

許可文字だけのfolder名へ変換

許可文字だけのfolder名へ変換は変更や出力生成より先に行う観測です。EntryID、resolved recipient address、Attachment.FileName、size、target full pathを保存単位にするを含む形で現状を保存し、後段のコードが同じ対象へ向くか確認します。

Option Explicit

Sub InspectSelectedAttachmentMail()
    Dim olApp As Object, explorer As Object, item As Object
    Set olApp = GetObject(, "Outlook.Application")
    Set explorer = olApp.ActiveExplorer
    If explorer Is Nothing Then Err.Raise 5, , "Explorerがありません"
    If explorer.Selection.Count <> 1 Then Err.Raise 5, , "メールを1件だけ選択してください"
    Set item = explorer.Selection.Item(1)
    Debug.Print item.EntryID, item.Subject, item.Attachments.Count, item.Recipients.Count
End Sub

MailItem.Toは表示文字列で複数recipientや区切り文字を含み得る。Recipients collectionを解決し、folder名に使える正規化keyを別途作る必要がある。受信者別のOutlook添付ファイル整理では取得不能、対象なし、値が空という三状態を分け、stderrや終了コードを捨てません。

添付名をbasenameとして検査

添付名をbasenameとして検査では入力と出力を別々に再取得します。受信者別のOutlook添付ファイル整理の合格は、各添付が意図したrecipient key配下に一つずつあり、元のfile名・size・hashと対応し、別mailを処理していないことです。件数だけでなく識別値と内容も照合します。

Option Explicit

Sub VerifyAttachmentRoot()
    Dim fso As Object, root As String, folder As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    root = fso.GetAbsolutePathName(Trim$(ThisWorkbook.Worksheets("Config").Range("B2").Value2))
    If Not fso.FolderExists(root) Then Err.Raise 76, , "保存ルートがありません"
    For Each folder In fso.GetFolder(root).SubFolders: Debug.Print folder.Path, folder.Files.Count: Next folder
End Sub

添付0件やrecipient未解決なら保存せず、空folderだけを量産しない。受信者別のOutlook添付ファイル整理の結果が期待と違えば追加変更を重ねず、入力、対象範囲、locale・時刻、権限、製品仕様の順に戻って調べます。

同名がないstagingへSaveAsFile

同名がないstagingへSaveAsFileでは選択mail一件のRecipientsをResolveし、承認root配下のsafe key folderへ、同名衝突を検査して添付を保存する。受信者別のOutlook添付ファイル整理のサンプルにあるパス、セル、ユーザー、時刻は検証用なので、直前に確認した承認値へ置き換えます。

Option Explicit

Private Function SafeWindowsName(ByVal value As String, ByVal maxLength As Long) As String
    Dim token As Variant, stem As String, i As Long, codePoint As Long
    If maxLength < 1 Or Len(value) = 0 Then Err.Raise 5, , "名前が空です"
    If value <> RTrim$(value) Or Right$(value, 1) = "." Then Err.Raise 5, , "末尾dot/spaceは使えません"
    For i = 1 To Len(value)
        codePoint = AscW(Mid$(value, i, 1))
        If codePoint >= 0 And codePoint < 32 Then Err.Raise 5, , "Windows制御文字は名前に使えません"
    Next i
    value = Trim$(value)
    If Len(value) > maxLength Then Err.Raise 5, , "名前が上限を超えています: " & Len(value) & "/" & maxLength
    For Each token In Array("\", "/", ":", "*", "?", """", "<", ">", "|")
        value = Replace$(value, CStr(token), "_")
    Next token
    Do While InStr(value, "..") > 0: value = Replace$(value, "..", "_"): Loop
    If Len(value) = 0 Or value = "." Or value = ".." Then Err.Raise 5, , "安全なファイル名へ変換できません"
    stem = UCase$(Split(value, ".")(0))
    Select Case stem
        Case "CON", "PRN", "AUX", "NUL", "CLOCK$", _
             "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", _
             "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9"
            Err.Raise 5, , "Windows予約名は保存名に使えません: " & stem
    End Select
    SafeWindowsName = value
End Function

Sub SaveSelectedAttachmentsByRecipient()
    Dim olApp As Object, explorer As Object, item As Object, att As Object
    Dim fso As Object, root As String, recipientKey As String, target As String
    Dim attachmentName As String, savePath As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    root = fso.GetAbsolutePathName(Trim$(CStr(ThisWorkbook.Worksheets("Config").Range("B2").Value2)))
    If Not fso.FolderExists(root) Then Err.Raise 76, , "承認済み保存ルートがありません"
    Set olApp = GetObject(, "Outlook.Application")
    Set explorer = olApp.ActiveExplorer
    If explorer Is Nothing Or explorer.Selection.Count <> 1 Then Err.Raise 5, , "メールを1件だけ選択してください"
    Set item = explorer.Selection.Item(1)
    If item.Class <> 43 Then Err.Raise 5, , "MailItemではありません"
    If item.Attachments.Count = 0 Or item.Recipients.Count = 0 Then Err.Raise 5, , "添付または宛先がありません"
    If Not item.Recipients.ResolveAll Then Err.Raise 5, , "宛先を解決できません"
    recipientKey = SafeWindowsName(CStr(item.Recipients.Item(1).Address), 100)
    target = fso.BuildPath(root, recipientKey)
    If Len(target) > 240 Then Err.Raise 76, , "recipient保存pathが長すぎます"
    If Not fso.FolderExists(target) Then fso.CreateFolder target
    For Each att In item.Attachments
        attachmentName = SafeWindowsName(CStr(att.FileName), 120)
        savePath = fso.BuildPath(target, attachmentName)
        If Len(savePath) > 240 Then Err.Raise 76, , "添付保存pathが長すぎます"
        If fso.FileExists(savePath) Then Err.Raise 58, , "同名添付があります: " & savePath
        att.SaveAsFile savePath
    Next att
    Debug.Print item.EntryID, target, item.Attachments.Count
End Sub

..、path separator、reserved名、長すぎる名前を拒否する。active selectionが複数なら先頭を黙って採用しない。受信者別のOutlook添付ファイル整理で変更が発生する場合は、新規出力、no-clobber、WhatIf、下書き表示など利用可能な安全機構を先に使います。

複数recipientの分類規則

原mailは読み取りのみ。未採用stagingはEntryID単位で隔離し、他処理が利用後に勝手に整理しない。復元にも「EntryID、resolved recipient address、Attachment.FileName、size、target full pathを保存単位にする」を用い、類似名の別対象へ処理しません。

  • 受信者別のOutlook添付ファイル整理の開始前状態
  • 採用対象: EntryID、resolved recipient address、Attachment.FileName、size、target full pathを保存単位にする
  • 復元後の確認: 各添付が意図したrecipient key配下に一つずつあり、元のfile名・size・hashと対応し、別mailを処理していない
  • 復元を止める条件: ..、path separator、reserved名、長すぎる名前を拒否する。active selectionが複数なら先頭を黙って採用しない

保存後に件数とhashを確認

..、path separator、reserved名、長すぎる名前を拒否する。active selectionが複数なら先頭を黙って採用しない。保存後に件数とhashを確認に当てはまるときは中止理由、対象識別子、終了コードまたはErr.Number、直前に成功した段階を保存します。

添付0件やrecipient未解決なら保存せず、空folderだけを量産しない。受信者別のOutlook添付ファイル整理の再試行は原因を直し、同じ入力と対象を再確認してから行います。警告抑止や強制上書きで通しません。

原mailを変更しない

複数recipient mailはprimary、全員copy、共有bucketのどれにするかを業務規則で明示する。受信者別のOutlook添付ファイル整理を反復するときは、正常、差分なし、対象なし、要承認、失敗を別の状態として記録します。

原mailを変更しないの主キーEntryID、resolved recipient address、Attachment.FileName、size、target full pathを保存単位にする
採用条件各添付が意図したrecipient key配下に一つずつあり、元のfile名・size・hashと対応し、別mailを処理していない
空結果添付0件やrecipient未解決なら保存せず、空folderだけを量産しない
中止条件..、path separator、reserved名、長すぎる名前を拒否する。active selectionが複数なら先頭を黙って採用しない

選択MailItemを一件に限定から証跡化する許可文字だけのfolder名へ変換

受信者別のOutlook添付ファイル整理の証跡は「EntryID、resolved recipient address、Attachment.FileName、size、target full pathを保存単位にする」を主キーにします。選択MailItemを一件に限定で確認した値と、実行直前・実行直後の値を同じ作業番号に保存し、表示名が似ている別対象や前回の結果を混ぜません。

Recipientsを解決してSMTP keyを作るで空結果を判定する添付名をbasenameとして検査

受信者別のOutlook添付ファイル整理の空結果は「添付0件やrecipient未解決なら保存せず、空folderだけを量産しない」として扱います。Recipientsを解決してSMTP keyを作るで入力自体が存在するか、権限で見えていないか、条件に一致しないだけかを分け、0件という表示だけで成功・失敗を決めません。

原mailを変更しないから復旧可否を測る選択MailItemを一件に限定

受信者別のOutlook添付ファイル整理の復旧判断では「原mailは読み取りのみ。未採用stagingはEntryID単位で隔離し、他処理が利用後に勝手に整理しない」を採用します。原mailを変更しないを再確認し、復旧後に「各添付が意図したrecipient key配下に一つずつあり、元のfile名・size・hashと対応し、別mailを処理していない」へ戻ったかを別の読み取り処理で測定します。

受信者別のOutlook添付ファイル整理の事前確認では、EntryID、resolved recipient address、Attachment.FileName、size、target full pathを保存単位にするを画面表示や標準出力だけで済ませず、実行日時と一緒に作業記録へ写します。MailItem.Toは表示文字列で複数recipientや区切り文字を含み得る。Recipients collectionを解決し、folder名に使える正規化keyを別途作る必要があるという仕様があるため、似た名前の別対象、前回実行時の値、キャッシュされた表示を今回の対象と取り違えないことが重要です。

受信者別のOutlook添付ファイル整理のコードを実行した直後は、まず終了状態を保存し、その後に別の読み取り処理で「各添付が意図したrecipient key配下に一つずつあり、元のfile名・size・hashと対応し、別mailを処理していない」を確認します。受信者別のOutlook添付ファイル整理では同じコードの表示だけを合否判定に使うと部分成功や遅延反映を見逃すため、識別値、件数、内容の三点を照合します。

受信者別のOutlook添付ファイル整理で結果が得られない場合は、添付0件やrecipient未解決なら保存せず、空folderだけを量産しない。受信者別のOutlook添付ファイル整理ではこの状態と、権限拒否、入力形式の不一致、接続先や時刻の違いを一緒にしません。受信者別のOutlook添付ファイル整理の対象候補数、除外された候補、最後に成功した確認処理を残すと、再試行で同じ失敗を重ねずに済みます。

受信者別のOutlook添付ファイル整理を元へ戻す必要があるときは、原mailは読み取りのみ。未採用stagingはEntryID単位で隔離し、他処理が利用後に勝手に整理しない。受信者別のOutlook添付ファイル整理の復元前にも変更後の識別値を再取得し、別担当者の更新が入っていないか確認します。受信者別のOutlook添付ファイル整理の復元結果も通常処理と同じ完了条件で測り、戻したつもりという報告だけで閉じません。

受信者別のOutlook添付ファイル整理を引き継ぐ記録には、複数recipient mailはprimary、全員copy、共有bucketのどれにするかを業務規則で明示する。特に「..、path separator、reserved名、長すぎる名前を拒否する。active selectionが複数なら先頭を黙って採用しない」に該当した場合は、実行を止めたこと自体を正しい結果として扱います。受信者別のOutlook添付ファイル整理の次回担当者が承認範囲と未処理対象を区別できるよう、作業番号と対象識別子を対応付けます。

受信者別のOutlook添付ファイル整理の作業記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外理由を同じ作業番号で保存します。「EntryID、resolved recipient address、Attachment.FileName、size、target full pathを保存単位にする」を省くと別対象との比較になり得るため、日時、実行場所、製品版と一緒に残します。

Excel VBAを用いたメール添付ファイルの受信者別整理方法を定期運用へ組み込む場合も初回は対話的に確認します。正常は「各添付が意図したrecipient key配下に一つずつあり、元のfile名・size・hashと対応し、別mailを処理していない」、空結果は「添付0件やrecipient未解決なら保存せず、空folderだけを量産しない」、停止は「..、path separator、reserved名、長すぎる名前を拒否する。active selectionが複数なら先頭を黙って採用しない」として報告し、次の担当者が同じ条件で追試できるようにします。

Windows予約名と末尾文字も検証する

禁止記号の置換だけでなく、末尾dot/space、U+0001〜U+001FのWindows制御文字、空名、dot名、CON・NUL・COM1〜9・LPT1〜9などの予約名を拒否します。component上限を超える名前は切り詰めず停止し、BuildPath後のfull pathも240文字を超えたら保存しません。

添付ごとに変換後の名前とfull pathを確定してからFileExistsを調べ、既存ファイルは上書きしません。長い名前を黙って縮めないため、別名への縮退や拡張子消失を成功扱いにせず、入力を修正してから再実行します。

公式情報・参考資料

受信者別のOutlook添付ファイル整理のコマンド、API、対応範囲は次の公式一次資料で確認しました。確認日は2026年7月17日です。受信者別のOutlook添付ファイル整理の実行環境にあるman、–help、VBA Object Browser、Get-Helpも併用してください。

この記事を書いた人

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

コメント

コメントする

目次