【入門編】【初心者向け】メール受信時に添付ファイルの拡張子をチェックし、特定の形式のみをデスクトップへ自動保存する仕組み – Outlook VBA解析バイブル

スポンサーリンク

Outlook VBAを掌握する:受信メールの添付ファイルを「自動選別・保存」する極意

こんにちは。現場の最前線で自動化システムを設計しているアーキテクトです。

多くの人が「マクロの記録」から一歩踏み出し、Outlookのイベント駆動型プログラミング(メールが届いた瞬間に動く仕組み)の世界に足を踏み入れようとしていますね。素晴らしい決断です。

今回は、「特定の拡張子を持つ添付ファイルだけを、デスクトップに日時付きで整理して保存する」という、実用度MAXの自動化コードを題材に、Outlook VBAの本質を解説します。

—

1. なぜ「イベント駆動」なのか?

Outlook VBAの真髄は、「手動でマクロをボタンポチッとする」のではなく、「受信した瞬間にプログラムが自律的に判断する」点にあります。

これには`ThisOutlookSession`という特別なモジュールを使います。ここにはOutlookの「ライフサイクル」を監視する特別なフック(`NewMailEx`イベントなど)が用意されており、これこそが自動化の心臓部となります。

—

2. 実装の設計図:コードの全体像

以下のコードを、OutlookのVBAエディタ(`Alt + F11`)を開き、左側のツリーにある`ThisOutlookSession`に貼り付けてください。

‘ メール受信を検知して起動するイベント
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Dim objMail As Object
Dim objAttachment As Attachment
Dim fso As Object
Dim saveFolder As String
Dim fileName As String
Dim targetExt As String

‘ 監視対象の拡張子(今回はPDFを指定)
targetExt = “.pdf”

‘ FSO(FileSystemObject)の生成:ファイル操作の万能ツール
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 保存先:デスクトップ\ReceivedFiles
saveFolder = CreateObject(“WScript.Shell”).SpecialFolders(“Desktop”) & “\ReceivedFiles\”

‘ フォルダがなければ作成する
If Not fso.FolderExists(saveFolder) Then
fso.CreateFolder (saveFolder)
End If

‘ 受信したアイテムを取得
Set objMail = Session.GetItemFromID(EntryIDCollection)

‘ メールかどうかを確認
If TypeOf objMail Is MailItem Then
‘ 添付ファイルがある場合のみ処理
If objMail.Attachments.Count > 0 Then
For Each objAttachment In objMail.Attachments
‘ 拡張子の判定(右から4文字を確認)
If LCase(Right(objAttachment.FileName, 4)) = targetExt Then

‘ ファイル名に受信日時を付与して重複を防ぐ
fileName = saveFolder & Format(objMail.ReceivedTime, “yyyyMMdd_HHnnss_”) & objAttachment.FileName

‘ 保存実行
objAttachment.SaveAsFile fileName
End If
Next
End If
End If

‘ メモリ解放の習慣(プロの作法)
Set objMail = Nothing
Set fso = Nothing
End Sub

—

3. 初学者がつまずく「3つの壁」と克服法

① FSO(FileSystemObject)って何?

Windowsでファイルやフォルダを扱うための強力なライブラリです。`CreateObject(“Scripting.FileSystemObject”)`と書くことで、OSの深部にあるファイル操作機能を呼び出せます。これを使えば「フォルダが存在するか確認して、無ければ作る」といった処理が数行で完結します。

② なぜ `NewMailEx` を使うのか?

Outlookには `ItemAdd` というイベントもありますが、`NewMailEx` は受信した瞬間の `EntryID` を直接受け取るため、メモリ効率が非常に高く、大量のメールが同時に入ってきた際の処理抜けを防ぐことができます。

③ ファイル名の日時付与(フォーマットの罠)

`Format(objMail.ReceivedTime, “yyyyMMdd_HHnnss_”)` に注目してください。なぜ `HH:mm:ss` ではなく `HHnnss` なのか?

  • VBAのルール: VBAにおいて「分」は `mm` ではなく `nn` です。`mm` と書くと「月」と誤認され、ファイル名が意図しない形になるため注意してください。

—

4. 運用上の注意:セキュリティとエラーハンドリング

  • 信頼性: このコードは「信頼できる場所」で実行される必要があります。また、組織のセキュリティポリシーによってはマクロがブロックされることがあります。その際はIT部門のガイドラインに従ってください。
  • 例外処理: 今回は簡略化していますが、実際の現場では `On Error Resume Next` を適切に使い、ファイルが既に開かれている場合や、読み取り専用の場合のエラーを拾う必要があります。

—

最後に:ここをクリアすれば「自動化エンジニア」の仲間入り

今回学んだのは「イベントの検知」→「対象の抽出」→「ファイル操作」という、すべての業務自動化に共通する基本の型です。

このコードをベースに、「特定の件名の時だけ保存する」「保存後にメールにフラグを立てる」といった処理を付け加えてみてください。それができれば、あなたはもうマクロを「使う側」から「作る側」へ完全に脱却したと言えるでしょう。

何かわからないことがあれば、またいつでも聞いてください。あなたの自動化ライフを全力でバックアップします。

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