こんにちは!エンジニアリングの世界へようこそ。
マクロの記録ボタンを押すだけのステージから、自分の手でコードを書き、Outlookを自在に操る「真の自動化」のステージへ足を踏み入れようとしているあなたへ、この扉を開く鍵をお渡しします。
今回は、業務自動化の最も王道にして、最も強力なスキルである「受信メールの自動フィルタリングとフォルダ移動」をマスターします。
「毎日届く大量のメールから、特定のID(例えば `[PRJ-999]` のようなプロジェクトID)が入ったものだけを探して、既読にして専用のフォルダにしまいたい……」
そんな手作業を、VBA(Visual Basic for Applications)の力で一瞬で終わらせてしまいましょう。
ここをクリアすれば、Outlook VBAの基本構造はバッチリです。優しく、かつ本質的な知見を込めてガイドしていきますね。
—
1. Outlook VBAの全体像を掴む(最重要の心構え)
Excel VBAと違って、Outlook VBAには「セル」や「シート」という概念がありません。代わりに、「アイテム(MailItemなど)」と「フォルダ(Folder)」という2つの世界を行き来します。
今回私たちがやりたいことの流れを、頭の中でイメージ図にしてみましょう。
[ 新着メール受信 ]
↓
(イベント検知: 新しいメールが届いた!)
↓
[ 件名のチェック ]
├─ 特定のIDが含まれている? ── NO ──> (何もしない)
└─ YES
↓
[ 自動処理の実行 ]
1. 未読 ➔ 既読にする (.UnRead = False)
2. 指定のサブフォルダへ移動する (.Move)
この流れを、そのままコードに翻訳していきます。
—
2. 実装コード:コピペで動く実用マクロ
まずは、Outlookの裏側にあるVBE(Visual Basic Editor)を開き、以下のコードを標準モジュールに貼り付けてください。
> 💡 VBEの開き方:Outlookの画面で `[Alt]` + `[F11]` キーを押します。メニューの「挿入」から「標準モジュール」を選び、そこに以下のコードをペーストします。
Option Explicit
‘ =====================================================================
‘ プロシージャ名: SortSpecificMail
‘ 概要: 受信トレイを走査し、特定のIDを含むメールを既読にしてサブフォルダへ移動する
‘ =====================================================================
Sub SortSpecificMail()
‘ 1. 変数の宣言(型を明確に指定するのがプロの第一歩です)
Dim ns As Outlook.NameSpace
Dim inboxFolder As Outlook.MAPIFolder
Dim targetFolder As Outlook.MAPIFolder
Dim mailItem As Object
Dim i As Long
‘ 検索・判定用の定数
Const SEARCH_ID As String = “[PRJ-999]” ‘ 検索したい特定のID
Const TARGET_FOLDER_NAME As String = “案件A” ‘ 移動先のサブフォルダ名
‘ 2. オブジェクトの取得(Outlookのセッションを支配するNameSpace)
Set ns = Application.GetNamespace(“MAPI”)
Set inboxFolder = ns.GetDefaultFolder(olFolderInbox)
‘ 3. 移動先フォルダの取得(「受信トレイ」の下にある前提)
On Error Resume Next
Set targetFolder = inboxFolder.Folders(TARGET_FOLDER_NAME)
On Error GoTo 0 ‘ エラートラップを通常に戻す
‘ 移動先フォルダが存在しない場合の安全装置
If targetFolder Is Nothing Then
MsgBox “指定されたサブフォルダが見つかりません: ” & TARGET_FOLDER_NAME, vbCritical, “エラー”
Exit Sub
End If
‘ 4. 受信トレイのメールを「後ろから」ループ処理する(※重要テクニック)
‘ ※上から順に処理してメールを移動させると、インデックスがズレてバグの温床になります!
For i = inboxFolder.Items.Count To 1 Step -1
Set mailItem = inboxFolder.Items(i)
‘ 取得したアイテムが「メール」であるか厳密にチェック
If mailItem.Class = olMail Then
‘ 件名に特定のIDが含まれているかチェック (InStr関数)
If InStr(1, mailItem.Subject, SEARCH_ID, vbTextCompare) > 0 Then
‘ 5. 自動処理の実行
‘ A. 既読にする(Falseにすると既読になる)
mailItem.UnRead = False
‘ B. 指定フォルダへ移動する
mailItem.Move targetFolder
End If
End If
Next i
‘ 6. 完了の通知
MsgBox “特定のIDを持つメールの整理が完了しました!”, vbInformation, “処理終了”
End Sub
—
3. コードの急所を解説!初心者が押さえるべき3つのポイント
このコードには、現場で生き残るための「プロの知見」が詰まっています。特に重要な3つを解説します。
① ループは必ず「後ろから(Count から 1 へ)」回す
For i = inboxFolder.Items.Count To 1 Step -1
初心者がやりがちなミスが `For i = 1 To inboxFolder.Items.Count` と上から順番に処理することです。メールを別のフォルダに「移動」させると、受信トレイ内のアイテム数が減るため、ループのインデックスが狂い、処理し逃すメールが出てしまいます。
「リストからアイテムを削除・移動するときは、後ろから数える(Step -1)」。これはVBAにおける絶対の鉄則です。
② `InStr` 関数で文字列をハントする
If InStr(1, mailItem.Subject, SEARCH_ID, vbTextCompare) > 0 Then
「件名に特定の文字が含まれているか」を判定するには `InStr`(イン・ストリング)関数を使います。
- 第1引数 `1`:検索を開始する位置(先頭から)
- 第2引数 `mailItem.Subject`:調べたい対象(メールの件名)
- 第3引数 `SEARCH_ID`:探したい文字列 (`[PRJ-999]`)
- 第4引数 `vbTextCompare`:大文字・小文字を区別しない(フレンドリーな設定)
これが `0` より大きければ、「含まれている」と判定されます。
③ 「安全装置」と「オブジェクトの型」
Outlookは、メールだけでなく、会議の予定やタスク、連絡先なども同じフォルダに入り込んでいます。そのため、`mailItem.Class = olMail` と書いて「確実にメールであるもの」だけを処理対象に絞っています。これを怠ると、予期せぬオブジェクトで型不一致エラーが起きてしまいます。
—
4. 陥りやすい罠とエラー対策
実際に動かすときによくある「つまずきポイント」を先回りして解決しておきましょう。
- エラー「指定されたサブフォルダが見つかりません」が出る
- コード内の `TARGET_FOLDER_NAME = “案件A”` というフォルダが、本当に「受信トレイ」の直下に存在しているか確認してください。全角・半角スペースの混入にも要注意です。
- マクロのセキュリティ警告が出て実行できない
- 初めてVBAを実行する際、セキュリティレベルによってブロックされることがあります。
- 対策:`[ファイル]` > `[オプション]` > `[セキュリティ センター]` > `[セキュリティ センターの設定]` > `[マクロの設定]` から、「すべてのマクロを有効にする(非推奨だが開発環境では一般的)」または「デジタル署名されたマクロ…」を選択してください。
—
おわりに:ここをクリアすれば、あなたはもう初心者ではない
お疲れ様でした!
今回あなたが手に入れたのは、「オブジェクトの特定」「条件分岐」「コレクションの逆順ループ」「メソッドによる操作(既読化・移動)」という、VBAの全自動化に共通するコアの技術です。
「手作業でメールを振り分ける」という毎日のルーティンから解放されるだけでなく、「自分の思い通りにOutlookを働かせる快感」を味わえたのではないでしょうか。
ここをクリアすれば、Outlook VBAの基本はバッチリです。次はこれを「新着メール受信時に自動で発火するイベント(`ItemAdd`)」へと進化させていくことも夢ではありません。
あなたのエンジニアライフの第一歩を、心から応援しています!
