こんにちは!Outlook VBAの世界へようこそ。
マクロの記録すらない孤高のアプリ「Outlook」を相手に、VBAで業務を自動化しようと思い立ったあなた、素晴らしい着眼点です。
ExcelやWordと違って、Outlookのオブジェクトモデルは少し癖があります。特に「メールの本文を上手に操る」という壁にぶつかり、途方に暮れてしまう人は数知れません。
でも、安心してください。今日ここで`Body`と`HTMLBody`の正体を完全に理解し、正規表現を使ったHTMLクリーニングの極意をマスターしてしまえば、Outlook VBAの基礎はもうバッチリです。
「マクロの記録から、本物のエンジニアへ」一歩を踏み出すための知見を、あなたに授けましょう。
—
1. Outlookオブジェクトの階層構造と「本文」の二面性
まず、Outlook VBAを操る上で絶対に外せない基本理念からお話しします。
Outlookのマクロを書くときは、常に以下の「3つの巨人」を意識する必要があります。
- `Application`: Outlookアプリそのもの(すべての頂点)
- `NameSpace` / `Session`: メールの世界へ接続するための「窓口」(通常は `”MAPI”` を指定します)
- `MailItem`: 私たちが触りたい個別のメールアイテム
そして、この `MailItem` には、本文を格納するプロパティが2つ存在します。ここが最初のトラップです。
1. `Body`: 純粋なプレーンテキスト(改行やスペースのみの素朴な文字列)
2. `HTMLBody`: 装飾や画像リンクを含んだ、HTMLコードそのものの文字列
⚠️ 初学者が必ずハマる「罠」
「HTMLメールを受信したんだから、`Body`を読めばテキストが取れるはず」……そう思っていませんか?
実は、HTMLメールに対して `Item.Body` を取得すると、余計な空白やレイアウト崩れ、あるいは何もない空っぽの文字列が返ってくることがあります。逆に、プレーンテキストのメールに対して `HTMLBody` を叩くと、勝手にOutlookが簡易的なHTMLタグでラップして返してきます。
【鉄則】
- 読み取る時は、相手の形式(`HTMLBody`か`Body`か)を見極める!
- 綺麗にテキストだけを抜き出したいなら、HTMLメールの `HTMLBody` を美しく調理(パース)すべし!
—
2. HTMLタグ地獄からの脱出!正規表現によるクリーニング技術
受信するメールの多くはHTML形式です。ここから「挨拶文」や「署名」を除外して、純粋なテキストだけを抽出したいと思ったとき、愚直に `Replace` 関数を何重にも書くのはプログラミングの美学に反します。
ここで登場するのが、VBA×正規表現(RegExp)です。
以下のコードを見てください。これが、実務の現場で即戦力となる「HTMLメールから純粋なテキストを美しく抽出する」ためのプロ仕様のマクロです。
実用VBAコード:HTMLメールからタグを駆逐し、テキストを抽出する
Sub ExtractTextFromHTMLMail()
Dim objItem As Object
Dim mail As Outlook.MailItem
Dim htmlText As String
Dim cleanedText As String
‘ 1. 現在Outlookで選択している(アクティブな)メールを取得
Set objItem = ActiveExplorer.Selection.Item(1)
‘ 選択されたアイテムがメールかどうかを安全確認
If objItem.Class = olMail Then
Set mail = objItem
‘ 2. 本文がHTML形式か判定し、対象ソースを取得
If mail.BodyFormat = olFormatHTML Then
htmlText = mail.HTMLBody
Else
‘ プレーンテキストならそのままBodyを使う
MsgBox “このメールはHTML形式ではありません。通常のBodyを使用します。”, vbInformation
Exit Sub
End If
‘ 3. 正規表現エンジン(RegExp)の準備
Dim regEx As Object
Set regEx = CreateObject(“VBScript.RegExp”)
With regEx
.Global = True ‘ マッチしたものを全て置換する
.IgnoreCase = True ‘ 大文字小文字を区別しない
‘ 【重要】不要なブロック(head, style, script)をごっそり削除
.Pattern = “<(head|style|script)[^>]>[\s\S]?<\/\1>”
htmlText = .Replace(htmlText, “”)
‘ 【キモ】すべてのHTMLタグ(<...〉)を空文字に置換
.Pattern = "<[^>]+>”
cleanedText = .Replace(htmlText, “”)
End With
‘ 4. HTML特有の特殊文字( や&など)をデコードする簡易処理
cleanedText = Replace(cleanedText, ” “, ” “)
cleanedText = Replace(cleanedText, “&”, “&”)
cleanedText = Replace(cleanedText, “<“, “<")
cleanedText = Replace(cleanedText, ">", ">“)
‘ 5. 結果を出力(イミディエイトウィンドウに表示)
Debug.Print “=== クリーニング後テキスト ===”
Debug.Print cleanedText
MsgBox “テキストの抽出に成功しました!イミディエイトウィンドウを確認してください。”, vbInformation
Else
MsgBox “メールアイテムを選択してください。”, vbExclamation
End If
‘ オブジェクト解放の作法
Set regEx = Nothing
Set mail = Nothing
Set objItem = Nothing
End Sub
—
3. コードの解説:なぜこの正規表現なのか?
プログラミング初心者の方にとって、先ほどの正規表現のパターン(Pattern)は呪文のように見えるかもしれません。一つずつ優しく紐解いていきましょう。
① `]>[\s\S]?`
- 意味: メールのデザインや挙動を司る裏側のコード(``タグの中身や、`