こんにちは、皆さんの頼れる先輩エンジニアです。
日々の業務で溢れかえるメール、その一通一通に目を通すだけで午前中が終わってしまう……そんな悩みを抱えていませんか?「マクロの記録」を卒業し、一歩先の「自動化」へ踏み出したいあなたへ。
今日は、Outlook VBAにAI(自然言語処理)の魂を吹き込み、届いたメールを自動で要約してフラグに書き込むという、究極のライフハックを伝授します。
「API?」「JSON?」「イベントハンドラ?」難しそうな言葉が並びますが、大丈夫。一つずつ紐解いていけば、あなたはOutlookをただのメールソフトから、「超優秀な専属秘書」へと進化させることができます。
ここをクリアすれば、Outlook VBAの基本、そして外部連携の神髄はバッチリですよ。
—
1. なぜ「自動要約」が必要なのか?
現代のビジネスにおいて、情報の取捨選択は最も重要なスキルです。
しかし、人間がすべてのメールを読んで判断するのは非効率。
1. 受信時にAIが内容をスキャン
2. 3行で要約
3. フラグの「タスク内容」や「件名」に要約を自動追記
これができれば、一覧画面を見るだけで「今すぐ返信すべきか」「後回しでいいか」が瞬時に判断できます。今回は、世界的に普及しているOpenAIのAPI(ChatGPTの裏側)をVBAから呼び出す手法を解説します。
—
2. Outlook VBAの心臓部「イベント」を理解する
まず、初心者が最初につまずくのが「いつ、マクロを動かすか」という点です。
ボタンを押して動かすのは「手動」ですが、今回はメールが届いた瞬間に動かしたい。
そこで使うのが、`Items.ItemAdd`イベントです。
なぜ `NewMailEx` ではなく `ItemAdd` なのか?
Outlookには `NewMailEx` というイベントもありますが、これは「複数のメールが同時に届くと不安定になる」という弱点があります。プロの現場では、特定のフォルダ(受信トレイ)を監視する `ItemAdd` を使うのが鉄則です。
—
3. 準備:APIを叩くための「武器」を揃える
VBAから外部のAI(API)と通信するために、以下の参照設定を有効にします。
1. VBE(Alt + F11)を開く
2. 「ツール」→「参照設定」を選択
3. Microsoft WinHTTP Services, version 5.1 にチェック
これで、VBAがインターネットの世界へ飛び出す準備が整いました。
—
4. 【実践】魂のコード実装
このコードは、`ThisOutlookSession` という場所に記述します。ここがOutlookの「意識」そのものになる場所です。
ThisOutlookSession
Option Explicit
‘ 受信トレイのアイテムを監視するための特別な変数
Private WithEvents TargetItems As Outlook.Items
‘ Outlook起動時に自動実行される
Private Sub Application_Startup()
Dim outlookApp As Outlook.Application
Dim objectNS As Outlook.NameSpace
Dim targetFolder As Outlook.MAPIFolder
Set outlookApp = Outlook.Application
Set objectNS = outlookApp.GetNamespace(“MAPI”)
‘ 受信トレイをセット
Set targetFolder = objectNS.GetDefaultFolder(olFolderInbox)
‘ 受信トレイの中身を監視対象にする
Set TargetItems = targetFolder.Items
Debug.Print “Outlook監視システム、起動しました。”
End Sub
‘ メールが届いた瞬間に発火するイベント
Private Sub TargetItems_ItemAdd(ByVal Item As Object)
‘ 届いたのがメール(MailItem)でなければ終了
If Not TypeOf Item Is MailItem Then Exit Sub
Dim oMail As MailItem
Set oMail = Item
‘ 【重要】無限ループ防止(自分自身の変更で再度発火しないように条件を絞る)
If InStr(oMail.Subject, “【要約済】”) > 0 Then Exit Sub
On Error GoTo ErrorHandler
‘ 1. 本文から不要な改行などを除去
Dim cleanBody As String
cleanBody = Left(Replace(oMail.Body, vbCrLf, ” “), 1000) ‘ 最初の1000文字程度を抽出
‘ 2. AI APIを呼び出して要約を取得
Dim summary As String
summary = CallAIAPI(cleanBody)
‘ 3. 要約をフラグのメモ(Todo項目の内容)と件名に反映
With oMail
.Subject = “【要約済】” & .Subject
‘ フラグ(備忘録)を設定
.MarkAsTask olMarkToday
.FlagStatus = olFlagMarked
‘ 要約をフラグのテキスト(CategoriesやBodyの先頭など)に刻む
.Categories = “AI要約”
.Body = “— AI要約 —” & vbCrLf & summary & vbCrLf & “————–” & vbCrLf & .Body
.Save ‘ 上書き保存
End With
Set oMail = Nothing
Exit Sub
ErrorHandler:
Debug.Print “エラー発生: ” & Err.Description
Set oMail = Nothing
End Sub
標準モジュール(API連携部分)
次に、「APIを呼び出す」という独立した機能を標準モジュールに書きます。
‘ APIを呼び出す関数
Public Function CallAIAPI(ByVal text As String) As String
Dim http As Object
Set http = CreateObject(“WinHttp.WinHttpRequest.5.1”)
Dim url As String
Dim apiKey As String
Dim payload As String
‘ — 設定項目 —
url = “https://api.openai.com/v1/chat/completions”
apiKey = “YOUR_API_KEY_HERE” ‘ 取得したAPIキーを入力
‘ —————-
‘ APIに送るデータ(JSON形式)を組み立て
‘ ※ 本来はJSONライブラリを使うのがベストですが、シンプルにするために文字列結合で作成
payload = “{“”model””: “”gpt-3.5-turbo””, “”messages””: [” & _
“{“”role””: “”system””, “”content””: “”あなたは有能な秘書です。以下のメールを30文字程度で要約してください。””},” & _
“{“”role””: “”user””, “”content””: “”” & text & “””}” & _
“]}”
With http
.Open “POST”, url, False
.SetRequestHeader “Content-Type”, “application/json”
.SetRequestHeader “Authorization”, “Bearer ” & apiKey
.Send payload
‘ レスポンスの解析(簡易版)
‘ ※ 本格的な運用の場合はJSONパーサーを使用してください
Dim response As String
response = .ResponseText
‘ 文字列操作で要約部分だけを強引に抽出(初学者向け簡易実装)
Dim startPos As Long, endPos As Long
startPos = InStr(response, “””content””: “””) + 11
endPos = InStr(startPos, response, “”””)
CallAIAPI = Mid(response, startPos, endPos – startPos)
End With
Set http = Nothing
End Function
—
5. 陥りやすいエラーと「極限の知見」
ここで、私が長年の開発で培った「ハマりポイント」を伝授します。
① 無限ループの罠
`Item.Save` を実行すると、環境によっては再度「アイテムが更新された」とみなされ、自分自身を呼び出してしまうことがあります。必ず `If InStr(oMail.Subject, “【要約済】”) > 0 Then Exit Sub` のような「防波堤」を設けましょう。
② APIキーの露出
コード内に直接APIキーを書くのは、自分だけで使う分には構いませんが、他人に配布する場合は注意してください。環境変数や外部ファイルから読み込むのがプロの流儀です。
③ オブジェクトの解放(ライフサイクル)
`Set oMail = Nothing` を忘れないでください。特に大量のメールを受信する環境では、メモリリークが発生し、Outlookが重くなる原因になります。「使い終わったら片付ける」は、エンジニアの基本です。
④ 非同期処理の壁
VBAの `WinHttp` は、レスポンスが返ってくるまでOutlookの操作を固めてしまいます(同期処理)。AIの回答が遅いとイライラするかもしれません。その場合は、タイムアウト設定を適切に行うか、バックグラウンド処理を検討する必要がありますが、まずはこの基本形をマスターしましょう。
—
最後に:ここをクリアすれば、あなたは「自動化の職人」
いかがでしたか?
「メールを読む」という当たり前の行為を、VBAとAIの力で「機械に任せる」。これは単なる時短ではなく、「人間にしかできない付加価値の高い仕事に集中する」ための第一歩です。
このコードをベースに、「特定の差出人だけ要約する」「要約内容によってフォルダを分ける」など、自分なりにカスタマイズしてみてください。それが、マクロの記録から脱却し、真のエンジニアへと成長する唯一の道です。
もし途中でつまずいたら、いつでも聞いてくださいね。
Outlook VBAの世界は、あなたが思うよりずっと自由で、奥が深いものです。
さあ、魔法のコードを走らせて、メールの山を宝の山に変えましょう!
