VBAを長く勉強していると、Excel、AccessだけではなくOutlookでの処理も自動化できないか考えるようになってくる人もいるでしょう。例えばあるユーザーのOutlookで、フォルダ内に数万以上のメールが溜まってしまう人もいます。
そのような状態になるとOutlookの動作がやたら重くなりますし、何らかの特定のメールを検索するのも大変です。ですから、もういらないメールなどは削除ボックスへ移動させようと思う人もいるでしょう。
1個のメールボックスだけだったら手動でも良いかもしれませんが、Outlook内に数十個、数百個のフォルダがあって、そのフォルダ内に大量のメールが溜まっている人もいるかもしれません。それらのフォルダ全部から手動で削除ボックスへ移動させるのは大変です。
場合によっては手を出してはいけないフォルダもあるかもしれませんし、何らかの条件に一致するメールだけは移動させてもよいといったフォルダもあるかもしれません。
なので、フォルダが多くなるといらないメールを削除するにも苦労してしまう場合もあります。そのような場合にVBAで特定のフォルダから特定のメールだけを特定のフォルダへ移動させることができたら便利です。
今回はそのような処理ができるOutlookVBAの簡易的なコードを説明していきます。
VBAでOutlookのメールを特定のフォルダに移動するコード
事前に参照設定で「Microsoft Outlook 16.0 Object Library」を選択しておいてください。各行の詳細な説明は以下の通りです
Sub OlMail_Move() Dim ol As outlook.Application Dim INmail As Folder Dim Fol1 As Folder Dim Fol2 As Folder Dim i As Variant Dim cnt As Variant Set ol = outlook.Application With ol.GetNamespace("MAPI") '受信ボックスの取得 Set INmail = .GetDefaultFolder(olFolderInbox) 'Outlook内のテスト1フォルダの取得 Set Fol1 = .Folders.Item(1).Folders.Item("テスト1") 'Outlook内のテスト2フォルダの取得 Set Fol2 = .Folders.Item(1).Folders.Item("テスト2") End With cnt = INmail.Items.Count For i = cnt To 1 Step -1 If InStr(INmail.Items(i).Subject, "test") > 0 Then '件名が「test」の場合はテスト1フォルダへ移動する INmail.Items(i).Move Fol1 ElseIf InStr(INmail.Items(i).Subject, "テスト") > 0 Then '件名が「テスト」の場合はテスト2フォルダへ移動する INmail.Items(i).Move Fol2 End If Next i End Sub
上記のコードについて、以下に順番に説明していきます。
Sub OlMail_Move():プロシージャの名前になります。
Dim ol As outlook.Application:Outlookアプリケーションオブジェクトを参照する変数olを宣言します。
Dim INmail As Folder: 受信トレイを参照するための変数INmailを宣言します。
Dim Fol1 As Folder, Dim Fol2 As Folder: メールの移動先フォルダを参照するための変数Fol1とFol2を宣言します。
Dim i As Variant, Dim cnt As Variant: ループカウンタとメールの数を格納するための変数iとcntを宣言します。
Set ol = outlook.Application: Outlookアプリケーションを変数olに設定します。
With ol.GetNamespace(“MAPI”): OutlookのMAPI名前空間(メール、連絡先、カレンダーなどの情報にアクセスするためのインターフェース)を操作します。
Set INmail = .GetDefaultFolder(olFolderInbox): Outlookの受信トレイを変数INmailに設定します。
Set Fol1 = .Folders.Item(1).Folders.Item(“テスト1”): 「テスト1」という名前のフォルダを変数Fol1に設定します。
Set Fol2 = .Folders.Item(1).Folders.Item(“テスト2”): 「テスト2」という名前のフォルダを変数Fol2に設定します。
End With: Withステートメントの終了を宣言します。
cnt = INmail.Items.Count: 受信トレイのメール数を変数cntに格納します。
For i = cnt To 1 Step -1: cntから1まで逆順にループを開始します。
If InStr(INmail.Items(i).Subject, “test”) > 0 Then: メールの件名に「test」が含まれている場合、次の行を実行します。
INmail.Items(i).Move Fol1: メールを「テスト1」フォルダに移動します。
ElseIf InStr(INmail.Items(i).Subject, “テスト”) > 0 Then: メールの件名に「テスト」が含まれている場合、次の行を実行します。
INmail.Items(i).Move Fol2: メールを「テスト2フォルダに移動します。
End If: Ifステートメントの終了を宣言します。
Next i: Forループの次の反復を開始します。
End Sub: プロシージャの終了を宣言します。
以上が、このVBAコードの各行の動作になります。このコードはOutlookの受信トレイにあるメールを、その件名に基づいて特定のフォルダに自動的に移動させるためのものです。
メールの件名に「test」が含まれている場合は「テスト1」フォルダに、「テスト」が含まれている場合は「テスト2」フォルダに移動します。このようにして、メールの整理を自動化できます。
まとめ
今回は、VBAを使ってOutlookのメールの移動のコードについて説明しました。
「メールの移動」なんて「需要や使いどころなんてあるの?」と思う人もいるでしょう。当初は自分もそのような考えを持っていました。しかし、VBAのSEとして色々な人からヒアリングしたりしていると「こういうこともあるんだ!?」という状況に出くわしたりします。
冒頭部分でも述べましたが、例えばOutlookの1つのフォルダ内に数万単位のメールが入っている人も世の中にはいます。それが1つ2つではなく、もっといくつもあるのです。
それだけでなく、Outlook内のメールを入れるフォルダが数十や数百個もある人もいます。業務で大量にメールのやり取りをする必要があるようです。
そのような人が手動でメールを削除したり特定の条件のメールを特定のフォルダに移動させたりするのは大変です。手作業だと間違えてしまう可能性が高くなりますし、何より時間がかかります。
また、VBAというとExcelとかAccessのイメージが強いので、OutlookでVBAが使えるとは思っていない人も多いでしょう。
「メールの移動」というと単純すぎる操作かもしれませんが、需要があるところには大いにありますし、ちょっと工夫すればユーザーの業務を大きく効率化させることができるのです。
コメント