こんにちは、現場の最前線でOutlookの自動化と格闘し続けてきたチーフアーキテクトです。
「マクロの記録」機能が存在しないOutlookの世界へようこそ。ここは、Excel VBAとは少し毛色の違う、しかし極めれば「仕事の時間を数分の一に圧縮できる」魔法のような力が眠っている場所です。
今日は、プログラミング初学者の方が最初にぶつかる壁であり、かつ最も恩恵を感じやすい「受信メールの自動振り分け」をテーマに解説します。
「ルール設定で十分じゃない?」と思うかもしれません。しかし、VBAを使えば「フォルダがなければ自動で作る」「特定の条件で複雑に分岐させる」といった、標準機能では不可能な意思を持った自動化が可能になります。
ここをクリアすれば、Outlook VBAの基本はバッチリですよ。それでは、コードの深淵を覗いてみましょう。
—
1. 全体像:メールがフォルダに届くまでの「地図」
プログラムを書く前に、Outlookがメールをどう管理しているかイメージしましょう。
今回のロジックは以下の4ステップです。
1. 受信トレイにアクセスする
2. 未読メールだけをピックアップする
3. 差出人のメールアドレスを確認する
4. そのアドレス専用のフォルダがあるか確認し、メールを移動する
この「フォルダがあるか確認し、なければ作る」という処理が、VBAならではの強力なポイントです。
—
2. 実装コード:差出人別・自動振り分けマクロ
以下のコードを、OutlookのVBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてください。
Sub AutoSortBySender()
Dim objNamespace As NameSpace
Dim objInbox As Folder
Dim objTargetFolder As Folder
Dim objMail As MailItem
Dim colItems As Items
Dim strSenderEmail As String
Dim i As Long
‘ 1. Outlookのデータへアクセス開始
Set objNamespace = Application.GetNamespace(“MAPI”)
‘ 受信トレイ(olFolderInbox)を取得
Set objInbox = objNamespace.GetDefaultFolder(olFolderInbox)
‘ 2. 未読メールだけを効率的にフィルタリング
‘ [Unread] = true という条件でアイテムを絞り込みます
Set colItems = objInbox.Items.Restrict(“[Unread] = true”)
‘ 3. アイテムを後ろから順に処理(重要:後述のTips参照)
‘ 1から順に処理すると、移動した際に添え字がズレてエラーになります
For i = colItems.Count To 1 Step -1
‘ メールアイテム以外(会議出席依頼など)を避ける判定
If TypeName(colItems.Item(i)) = “MailItem” Then
Set objMail = colItems.Item(i)
‘ 差出人のメールアドレスを取得
strSenderEmail = objMail.SenderEmailAddress
‘ 4. フォルダの存在確認と作成
‘ 受信トレイの下に「差出人アドレス」のフォルダがあるか探す
On Error Resume Next
Set objTargetFolder = objInbox.Folders(strSenderEmail)
On Error GoTo 0
‘ フォルダが存在しなかった場合の処理
If objTargetFolder Is Nothing Then
Set objTargetFolder = objInbox.Folders.Add(strSenderEmail)
Debug.Print “新しくフォルダを作成しました: ” & strSenderEmail
End If
‘ 5. メールの移動と既読化(お好みで)
objMail.Move objTargetFolder
‘ objMail.UnRead = False ‘ 既読にしたい場合はこの行を有効化
‘ オブジェクトの解放(メモリ管理)
Set objTargetFolder = Nothing
End If
Next i
MsgBox “振り分けが完了しました!”, vbInformation
End Sub
—
3. 伝説のチーフアーキテクトによる「ここが肝」解説
① なぜ `Step -1`(逆順)でループを回すのか?
これはOutlook VBA(およびすべてのコレクション操作)における鉄則です。
例えば、3通のメールがあるとき、1番目を移動させると、もともと2番目だったメールが「新しい1番目」に繰り上がります。しかし、ループは「次は2番目だ」と進むため、繰り上がってきたメールをスキップしてしまうのです。
後ろ(Count)から前に向かって処理すれば、この「絨毯引き(Rug Pull)」現象を防げます。
② `SenderEmailAddress` の信頼性
今回は `SenderEmailAddress`(メールアドレス)をフォルダ名にしました。
`SenderName`(表示名)を使うことも可能ですが、表示名は「株式会社A 担当者」のように全角文字や記号が含まれやすく、将来的にファイルパスとして扱う際にエラーの火種になります。一意性が高いアドレスをキーにするのがエンジニアとしての定石です。
③ `On Error Resume Next` の正しい使い方
「フォルダがあるか確認する」という専用の命令はVBAにはありません。
そこで、「とりあえずフォルダを指定してみて、エラーが出たら(=存在しなければ)作る」というアプローチを取ります。
`On Error Resume Next` でエラーを一時的に無視し、直後に `On Error GoTo 0` で正常なエラー検知に戻す。これは「行儀の良い」エラーハンドリングの基本です。
—
4. 陥りやすいエラーと対策
1. 「型が一致しません」エラー
受信トレイには「メール」だけでなく「会議の招待(MeetingItem)」なども届きます。`objMail` に代入する前に `If TypeName(…) = “MailItem”` でチェックを入れているのは、これを防ぐためです。
2. フォルダ名に使えない文字
メールアドレスにはあまり含まれませんが、フォルダ名に `/` や `\` などの記号が含まれると `Folders.Add` で失敗します。もし表示名をフォルダ名にする場合は、記号を置換するロジックが必要になります。
—
5. 次のステップへ
このマクロが動くようになったら、次は「自動実行」に挑戦してみてください。
`ThisOutlookSession` という場所に、`Application_NewMailEx` というイベントを書くことで、メールが届いた瞬間にこのマクロを自動で動かすことができます。
「手動で実行する」から「勝手に動いている」状態へ。これこそが業務自動化の真髄です。
今回のコードは、いわば「整理整頓の自動化」の第一歩。これがマスターできれば、特定のドメインからのメールだけをフラグ立てしたり、添付ファイルを自動保存したりといった応用は、もう目の前です。
一歩ずつ、コードに魂を込めていきましょう。応援していますよ!
