【入門編】【中級者向け】受信メールの本文から正規表現で「問い合わせ番号」を抽出し、Excelの進捗管理表と突き合わせる自動照合システム – Outlook VBA解析バイブル

スポンサーリンク

こんにちは!情シスや業務自動化の現場を駆け抜けてきた先輩エンジニアの私です。

「毎日届く大量の問い合わせメールから、番号を目視でコピーしてExcelの進捗管理表と突合する……そんな泥臭い作業、もう終わりにしませんか?」

今回は、中級者へのステップアップとして、「Outlook VBAのイベント駆動」×「VBScriptの正規表現」×「Excel COM連携」を組み合わせた、実務で即戦力となる自動照合システムの作り方を徹底解説します。

ここをクリアすれば、単なる「マクロの記録」の使い手から、真の「業務自動化アーキテクト」へ一歩を踏み出せますよ。温かく導くので、一緒にリラックスして紐解いていきましょう!

—

1. 全体像の把握:このシステムがやること

今回構築するのは、「特定のフォルダにメールが届いた瞬間、自動で動き出す仕組み」です。

1. 検知: 受信トレイ(または特定フォルダ)へのメール着信をフック(検出)する。
2. 抽出: メールの本文から、正規表現を使って「問い合わせ番号(例:`REQ-2023-9999`)」を正確に抜き出す。
3. 照合: バックグラウンドでExcelファイルを開き、該当の問い合わせ番号を検索する。
4. アクション: 一致する行が見つかったら、ステータスを「確認済み」に書き換え、メール自体にフラグを立てる。

これらを人間が一切手を触れずに、コンマ数秒で裏側で完結させます。

—

2. 準備:Outlook VBAの「聖域」にコードを書く

通常のモジュール(標準モジュール)ではなく、Outlook特有の「イベントを受け取る場所」にコードを記述するのがポイントです。

ステップ①:ThisOutlookSessionを開く

1. Outlookを起動し、 `Alt + F11` キーを押してVBE(Visual Basic Editor)を開きます。
2. 左ツリーの「プロジェクト1 (VbaProject.OTM)」の中にある `ThisOutlookSession` をダブルクリックします。

ここに書くコードは、Outlookが起動している間、常に裏でイベント(メールの受信など)を待ち構える「番犬」のような役割を持ちます。

—

3. 実装コード(コピペで動く実用スクリプト)

以下のコードを、そっくりそのまま `ThisOutlookSession` に貼り付けてください。コード内のファイルパス(Excelの保存場所)は、ご自身の環境に合わせて書き換えてくださいね。

Option Explicit

‘ =====================================================================
‘ 【アーキテクチャ設計】
‘ Outlookの受信イベントをフックし、VBScript.RegExpで本文からキーを抽出。
‘ 閉じたままのExcelをCOM経由で高速操作し、進捗管理表と突合する。
‘ =====================================================================

‘ 受信トレイのアイテムを監視するためのオブジェクト変数
Private WithEvents Mails As Outlook.Items

‘ Outlook起動時に自動実行されるイベント(番犬の目覚め)
Private Sub Application_Startup()
Dim ns As Outlook.NameSpace
Set ns = Application.GetNamespace(“MAPI”)

‘ デフォルトの受信トレイのアイテムコレクションを取得
Set Mails = ns.GetDefaultFolder(olFolderInbox).Items

MsgBox “【システム稼働開始】問い合わせ自動照合スタンバイOKです。”, vbInformation, “Outlook Automation”
End Sub

‘ 受信トレイに新しいアイテム(メール)が追加された瞬間に走るイベント
Private Sub Mails_ItemAdd(ByVal Item As Object)
‘ 届いたアイテムがメール形式かチェック(会議通知やタスクを除外)
If TypeName(Item) = “MailItem” Then
Call ProcessInquiryMail(Item)
End If
End Sub

‘ メイン処理:正規表現による抽出とExcel突合
Private Sub ProcessInquiryMail(ByVal mail As Outlook.MailItem)
Dim regEx As Object
Dim matches As Object
Dim inquiryNo As String

‘ — 1. VBScript.RegExpオブジェクトの生成 —
Set regEx = CreateObject(“VBScript.RegExp”)

With regEx
‘ 検索パターン:REQ-XXXX-YYYY のような形式を想定
.Pattern = “REQ-\d{4}-\d{4}”
.IgnoreCase = True ‘ 大文字小文字を区別しない
.Global = False ‘ 最初に見つかったものを取得
End With

‘ 本文(Body)または件名(Subject)からパターンマッチング
If regEx.Test(mail.Body) Then
Set matches = regEx.Execute(mail.Body)
inquiryNo = matches(0).Value
ElseIf regEx.Test(mail.Subject) Then
Set matches = regEx.Execute(mail.Subject)
inquiryNo = matches(0).Value
Else
‘ 問い合わせ番号が見つからない場合は処理終了
Exit Sub
End If

‘ — 2. Excel COMオブジェクトによるバックグラウンド操作 —
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object
Dim excelPath As String
Dim foundCell As Object

‘ ※環境に合わせてパスを変更してください
excelPath = “C:\Work\InquiryProgress.xlsx”

On Error GoTo ErrorHandler

‘ Excelのインスタンスを非表示で起動(パフォーマンスとUXの向上)
Set xlApp = CreateObject(“Excel.Application”)
xlApp.Visible = False
xlApp.ScreenUpdating = False

Set xlWb = xlApp.Workbooks.Open(excelPath)
Set xlWs = xlWb.Sheets(1) ‘ 1番目のシートを対象

‘ A列(問い合わせ番号が入っている列)から合致するセルを検索
Set foundCell = xlWs.Columns(“A”).Find(What:=inquiryNo, _
LookIn:=xlValues, _
LookAt:=xlWhole)

If Not foundCell Is Nothing Then
‘ 該当行が見つかった場合:C列(ステータス)を「確認済」に変更
foundCell.Offset(0, 2).Value = “確認済”

‘ D列に受信日時を記録
foundCell.Offset(0, 3).Value = mail.ReceivedTime

‘ 変更を保存
xlWb.Save

‘ Outlook側のメールにも処理済みフラグとカテゴリを付与
mail.FlagStatus = olFlagComplete
mail.Categories = “自動突合完了”
mail.Save
End If

CleanUp:
‘ — 3. 確実なメモリ解放(メモリリーク防止の極意) —
If Not xlWb Is Nothing Then xlWb.Close False
If Not xlApp Is Nothing Then
xlApp.ScreenUpdating = True
xlApp.Quit
End If

Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
Set regEx = Nothing
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub

—

4. コードの深掘り解説:ここがプロの技

このコードには、実務で数々の修羅場を潜り抜けてきたエンジニアの知見が詰まっています。いくつか重要なポイントを解説します。

① `WithEvents` によるイベント駆動

通常のマクロは「ボタンを押して手動で実行」しますが、`WithEvents` を使うことで、「メールが受信トレイに着弾したその瞬間(ItemAdd)」にプログラムが自発的に目を覚まします。人間が監視画面に張り付く必要はもうありません。

② VBScript.RegExp(正規表現)の圧倒的な柔軟性

「完全一致」や「InStr関数」だけで文字列を探そうとすると、スペースの有無や表記ゆれに泣かされます。
正規表現 `REQ-\d{4}-\d{4}` を使えば、「REQ-で始まり、数字4桁、ハイフン、数字4桁が続く文字列」というルールだけで、本文のどこに書かれていても一瞬で正確にキャッチできます。

③ Excelを「非表示」で操るCOMの作法

`xlApp.Visible = False` と `xlApp.ScreenUpdating = False` により、Excelの画面がパチパチと立ち上がるストレスを排除しています。バックグラウンドで秒速処理するため、ユーザーの作業を一切邪魔しません。

—

5. 陥りやすいエラーと回避の極意(トラブルシューティング)

現場でこのシステムを導入した際、よくある「つまずきポイント」を先回りして共有します。

  • Q: コードを入れたのに、メールが来ても何も起きない!
  • A: Outlookのセキュリティ設定やマクロの有効化を確認してください。また、`Application_Startup` は、一度VBEを閉じてOutlookを再起動しないと発火しません。 初回は必ずOutlookを再起動してください。
  • Q: Excelのプロセスがタスクマネージャーに残って消えない(ゾンビプロセス)
  • A: エラーハンドリング(`On Error GoTo`)を通った際、Excelオブジェクトをメモリから解放し損ねると発生します。上記のコードでは `CleanUp:` ラベルを用意し、いかなるエラー時でも必ず `Quit` と `Set = Nothing` が走るよう堅牢に設計しています。ここがプロとアマの分かれ目です。

—

まとめ:あなたの右腕となる自動化ツールを手に入れよう

今回は、Outlook VBAと正規表現、そしてExcel連携を組み合わせた実用的な自動照合システムの作り方を解説しました。

最初は難しく感じるかもしれませんが、イベントの仕組みとメモリ管理の基本さえ押さえれば、どんなに退屈で反復的な業務も、あなた専属の優秀なデジタルアシスタントに任せることができます。

「ここをこう変えたい」「こういう例外処理はどう書くの?」といった疑問があれば、ぜひ次のステップへ挑戦してみてください。あなたの業務自動化の旅を、私はいつでも応援しています!

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