【入門編】【初心者向け】受信メールの本文から日付を抽出し、期限付きフラグを自動設定する方法 – Outlook VBA解析バイブル

スポンサーリンク

こんにちは!Outlook VBAの世界へようこそ。
マクロの記録から一歩踏み出し、「自分の手で業務を自動化するツールを作りたい」と思っているあなたを、今日は最高の世界へご案内します。

毎日のように届く大量のメール。「あ、これ来週の水曜日までに返信しなきゃいけないやつだ」「この案件、納期が明後日だ!」と、メール本文を一つひとつ読んで、タスクリストに書き写したり、フラグをつけたりしていませんか?

実はこの作業、Outlook VBAを使えば一瞬で自動化できます。
今回は、メールの本文から「期限」や「納期」といった日付を自動で見つけ出し、Outlookの「期限付きフラグ」をピタッと設定する魔法のようなプログラムを一緒に作っていきましょう。

ここをクリアすれば、あなたのOutlook VBAの基本はバッチリです。さあ、深呼吸して、一緒にコードの扉を開けましょう!

—

1. 現場の全体像:これから何を作るのか?

今回私たちが目指すのは、「特定のフォルダにメールが届いた瞬間、あるいは選択したメールに対して、裏側でVBAが勝手に本文を読み解き、タスクの期限を設定してくれる仕組み」です。

イメージとしては、優秀な秘書を雇うようなもの。
秘書(VBA)は、次のような手順で動きます。

1. メールの本文をスキャンする
2. 「納期:」や「期限:」というキーワードを探す
3. そのすぐ後ろにある日付(例:2023/12/25)をカレンダーの日付として正確に読み取る
4. その日付をOutlookの「タスク期限(FlagDueBy)」としてセットする

難しそうに聞こえますか?大丈夫。ひとつずつ分解して、優しく解説していきますね。

—

2. 開発の舞台裏:Outlook VBAの心臓部を知る

まずは、Outlook VBAを動かすための「お作法」と、今回主役になるオブジェクトについて知っておきましょう。

どこにコードを書くの?

1. Outlookを開いた状態で、キーボードの [Alt] + [F11] を押してください。VBE(Visual Basic Editor)という開発画面が開きます。
2. メニューの [挿入] > [標準モジュール] をクリックします。
3. 真っ白なエディタ画面が出てきますね。ここにこれから紹介するコードを貼り付けます。

主役のオブジェクトたち

Outlook VBAでは、操作する対象を「オブジェクト」と呼びます。今回は主に以下の3つを使います。

  • `Application.ActiveExplorer.Selection`

今、あなたのマウスで選択している(あるいはプレビューしている)メールのことです。

  • `MailItem`

メールそのものを指します。件名、本文、送信者、そして「フラグ」といったプロパティ(属性)を持っています。

  • `Item.TaskDueDate`

メールに設定する「タスクの期限」ですここに日付を代入すると、OutlookのToDoバーやタスク一覧に締め切りとして反映されます。

—

3. 実装コード:本文から日付を抜き出しフラグを立てる

お待たせしました!コピペしてすぐに使える実用的なコードです。
今回は、初学者でも分かりやすいように、「今選択しているメール」に対して実行するマクロとして作成しています。

以下のコードを、先ほどの標準モジュールにそのまま貼り付けてください。

Sub SetDueDateFromEmailBody()
Dim objItem As Object
Dim mail As MailItem
Dim bodyText As String
Dim targetDate As Date
Dim pos As Long

‘ エラーハンドリング(選択していない場合の対策)
On Error GoTo ErrorHandler

‘ 1. 現在Outlookで選択しているアイテムを取得する
Set objItem = Application.ActiveExplorer.Selection.Item(1)

‘ 2. 選択されたアイテムが「メール」であるか厳密にチェック
If objItem.Class = olMail Then
Set mail = objItem
bodyText = mail.Body ‘ メールの本文を取得

‘ 3. 本文から「納期:」または「期限:」というキーワードを探す
‘ (ここでは「納期:」をターゲットにします)
pos = InStr(1, bodyText, “納期:”, vbTextCompare)

‘ キーワードが見つからない場合は「期限:」を探す
If pos = 0 Then
pos = InStr(1, bodyText, “期限:”, vbTextCompare)
End If

‘ キーワードが見つかった場合の処理
If pos > 0 Then
‘ キーワードの直後にある日付(10文字分:例 “2023/12/25″)を切り出す
‘ ※実際の運用では日付のフォーマットに合わせて文字数を調整します
Dim dateStr As String
‘ キーワードの長さ(3文字分 “納期:”)を飛ばした位置から10文字を抽出
dateStr = Mid(bodyText, pos + 3, 10)

‘ 抽出した文字列が本当の日付かチェックして変換
If IsDate(dateStr) Then
targetDate = CDate(dateStr)

‘ 4. メールのフラグを設定する
‘ フラグの文言を「要確認」にし、期限を設定
mail.MarkAsTask olMarkComplete
mail.TaskSubject = “【自動設定】” & mail.Subject
mail.TaskDueDate = targetDate
mail.ReminderSet = True
mail.ReminderTime = targetDate & ” 9:00:00″ ‘ 期限当日の朝9時にアラーム

‘ 変更をメールに保存
mail.Save

MsgBox “成功! ” & Format(targetDate, “yyyy年mm月dd日”) & ” を期限としてフラグを設定しました。”, vbInformation, “完了”
Else
MsgBox “キーワードは見つかりましたが、その後ろに正しい日付が見つかりませんでした。”, vbExclamation, “日付形式エラー”
End If
Else
MsgBox “本文内に「納期:」または「期限:」の文字が見つかりませんでした。”, vbExclamation, “キーワードなし”
End If
Else
MsgBox “メールを選択した状態で実行してください。”, vbExclamation, “選択エラー”
End If

Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました。メールが選択されているか確認してください。” & vbCrLf & Err.Description, vbCritical, “システムエラー”
End Sub

—

4. コードの深掘り解説:なぜこの書き方なのか?

チーフアーキテクトとして、このコードの「こだわり」と、初学者が陥りがちな罠を防ぐポイントを解説しておきます。

① 安全第一のオブジェクト判定 (`If objItem.Class = olMail`)

Outlookには、メールだけでなく、予定表(AppointmentItem)や連絡先(ContactItem)など様々なアイテムが存在します。もしユーザーが「予定」を選択した状態でこのマクロを実行すると、`MailItem` 専用のプロパティを呼び出しているところで型不一致エラー(実行エラー 13)が起きてクラッシュします。
`Class` プロパティで厳密に「メールであるか」をガードすることが、堅牢なプログラムの第一歩です。

② 文字列の切り出し (`InStr` と `Mid`)

日本語のメール本文から機械的にデータを抜くのは、実はAIでもない限り少しコツがいります。
今回のコードでは、`InStr`関数で「納期:」という言葉が何文字目にあるかを探し、そのすぐ後ろの10文字(`Mid`関数)を無理やり日付として切り出しています。

  • 実践的なワンポイント: 現場のメールでは、「納期: 2023/12/25」のようにコピペや全角半角の揺れがあるため、実際の運用では正規表現(VBScript.RegExp)を使って「数字4桁/数字1〜2桁/数字1〜2桁」のパターンを綺麗にキャッチすると、さらに精度が上がります。まずはこの基本形からマスターしましょう!

③ フラグとリマインダーの連動

単にフラグをつけるだけでなく、`mail.ReminderSet = True` とすることで、Outlookのポップアップ通知まで自動で連動させています。これで「うっかり忘れ」を完全に防ぐことができます。

—

5. 初学者が絶対にハマる「3大トラップ」と回避策

最後に、実務でOutlook VBAを書くときに初心者が必ずと言っていいほどハマる落とし穴をシェアしておきます。ここを知っていれば、エラーが出てももう慌てずに済みますよ。

1. セキュリティの壁(マクロが無効化される)

  • 症状: ボタンを押しても何も起きない、または「マクロが無効にされました」と怒られる。
  • 対策: [ファイル] > [オプション] > [セキュリティ センター] > [セキュリティ センターの設定] > [マクロの設定す] から、「すべてのマクロを有効にする(推奨しませんが開発時は便利)」または「デジタル署名されたマクロ…」を選び、信頼できる場所(Trusted Locations)にVBAを書いたプロファイルやアドインを置きましょう。

2. 日付の区切り文字(スラッシュとハイフン)

  • 症状: 本文に「納期: 2023-12-25」と書かれていて、エラーになる。
  • 対策: `CDate()` 関数は日本の環境ではハイフン(`2023-12-25`)も理解してくれますが、システムによってはスラッシュ(`/`)に置換(`Replace`関数)してあげる優しさが必要です。

3. 「未保存」のまま閉じちゃう問題

  • 症状: コード内で `mail.TaskDueDate = targetDate` と書いたのに、Outlookの画面に戻るとフラグが消えている。
  • 対策: メールのプロパティを変更した後は、必ず最後に `mail.Save` を実行してOutlookのデータベースに書き込ませる必要があります。これを忘れるのがプログラマーあるあるの第1位です。

—

まとめ:業務自動化の扉は、今開かれた

お疲れ様でした!
今回は「メール本文から日付を読み取り、期限付きフラグを自動設定する」という、実務に直結する強力なマクロを解説しました。

この仕組みを応用すれば、

  • 特定の重要顧客からのメールだけ自動で赤フラグをつける
  • 添付ファイルがあるメールだけ別のフォルダに振り分ける

といった、あなただけの最強のカスタマイズが無限に広がっていきます。

「ここをクリアすれば、Outlook VBAの基本はバッチリですよ!」
ぜひご自身の環境で試して、自動化の爽快感を味わってみてください。あなたのエンジニアライフ、そして毎日のデスクワークが劇的にスマートになることを応援しています!

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