【VBA】Outlookの受信トレイからExcelにデータを取得する方法【複数のメールアカウントがある場合】



この記事は「マクロを使ってOutlookのメールからExcelに情報を抽出するにはどうすれば良いでしょうか?」といった疑問に答えます。なお、以下の記事はMicrosoft 365 (Office 2016)を前提としています。




分析データが無いなら自分で集める

プロジェクトマネージャーという仕事柄、業務分析を行うことがよくあります。本来はプロジェクトマネージャーの仕事ではないのかもしれませんが、実際には必要に迫られてこういったこともやります。

プロジェクトが対象とする業務の内容をデータで見える化して、 プロセスを設計したり改善提案したりすることが目的です。最初からデータがあればこういった分析も簡単なのですが、ほとんどの場合は業務チームはこういったデータを持っていません。

昔ながらの勘と経験と度胸(いわゆるKKD)で運営してることが多いです。そうすると第三者には現状理解も改善提案もできないのです。





今回の前提条件

今回もとあるメール受付業務の業務分析を行うことになりました。お客様からのメールを受信して回答したり担当者に転送したりするよくある業務です。 

メールの操作は普通に Outlook のクライアントを使っておりCRMシステムは使っていません。このため、案の定業務内容に関するデータは無く、10名ほどいるスタッフの誰が何をしているのか、どういった問い合わせ内容をどのように処理しているのか、さっぱり分からない状態です。

そこで Outlook の受信トレイからデータをExcelに抽出して分析する、ということを考えました。このとき以下の前提条件がありました。

  • 問い合わせは複数のメールアドレスを受けて処理している
  • このためOutlookに複数のアカウントを登録している
  • それぞれのメールアドレスの受信メールは処理後に「処理済」フォルダーへ移される。この流れは変えたくない
  • データ取得のためにスタッフに余計な手間が増えないようにしてほしい
  • お客様に影響が出ないようにしてほしい

最後の2つは非常によく言われる「あるある要件」です。



業務データ取得の提案

「ふむふむなるほど」ということで、次のことを提案しました。

  • データ抽出専用のメールアドレスを1つ新設
  • Outlookの「クイック操作」機能を使って、「返信」「転送」といった処理時に自動的にBCCにデータ抽出専用のメールアドレスを入れるボタンを作る
  • データ抽出専用のメールアドレスの受信トレイからマクロを使ってデータを抽出する

これにより、複数のメールアドレスのうち、どのアドレスのメールを操作しても自動的にデータ抽出専用のメールアドレスにメール発信されるようになります。

また、スタッフの方は通常の「返信」「転送」ボタンに代えて、クイック操作に新しく作った「返信」「転送」ボタンを使うだけなので、毎回何かを入力したり設定したりする手間はありません。

BCCにデータ抽出専用のメールアドレスを入れれば、お客様からは見えませんので、影響もありません。「処理済」フォルダーへ移す流れもそのままです。

これで業務フローとしては一件落着です。





Outlookの受信トレイからExcelにデータを取得する方法

あとは「データ抽出専用のメールアドレスの受信トレイからマクロを使ってデータを抽出する」という部分を準備します。当初は「ググればサンプルプログラムがいくらでも出てくるので簡単」と思っていたのですが、やりたいことにマッチするサンプルをなかなか見つけることができず結構時間がかかりました。

特に手こずったのが、Outlookに複数のメールアカウントの登録がある場合に、任意のメールアカウントの受信トレイを指定してデータを抽出するという部分です。ググって見つけることができたサンプルは大抵の場合1つのメールアカウント(既定のアカウント)しかない場合のプログラムになっていました。複数の場合はどうしたらいいのか?がなかなか分かりませんでした。

こちらの記事を参考にしつつ、最終的には解決できましたので、そのサンプルプログラムを以下に掲載します。同じような問題にぶつかった方の参考になれば幸いです。

Outlookの登録アカウントが1つ(既定のアカウント)の場合のサンプルプログラム

Sub Outlook_mail_list()
    
   '使用する変数を宣言
    Dim InboxFolder, i, n  As Long
    Dim outlookObj As Outlook.Application
    Dim myNameSpace, objmailItem As Object

    '変数に設定
    Set outlookObj = CreateObject("Outlook.Application")
    Set myNameSpace = outlookObj.GetNamespace("MAPI")
    Set InboxFolder = myNameSpace.GetDefaultFolder(6)
    n = 2
 
    '受信トレイの件数分繰り返し実行
    For i = 1 To InboxFolder.Items.Count
        Set objmailItem = InboxFolder.Items(i)

        '受信メールの件数、送信者名、宛先、受信日時、件名(タイトル)を取得して表へ
        Range("A" & n).Value = i
        Range("B" & n).Value = objmailItem.SenderName
        Range("C" & n).Value = objmailItem.To
        Range("D" & n).Value = objmailItem.ReceivedTime
        Range("E" & n).Value = objmailItem.Subject

        n = n + 1
    Next

    '変数を解除
    Set outlookObj = Nothing
    Set myNameSpace = Nothing
    Set InboxFolder = Nothing

End Sub


Outlookの登録アカウントが2つの場合のサンプルプログラム

Sub Outlook_mail_list()
   '使用する変数を宣言
    Dim InboxFolder, i, n As Long
    Dim outlookObj As Outlook.Application
    Dim myNameSpace, objmailItem As Object
    

     '変数に設定
        Set outlookObj = CreateObject("Outlook.Application")
        Set myNameSpace = outlookObj.GetNamespace("MAPI")
        Set InboxFolder = myNameSpace.Folders("<任意のアカウントアドレス>").Folders("Inbox")
        n = 2

    '受信トレイの件数分繰り返し実行
      For i = 1 To InboxFolder.Items.Count
        Set objmailItem = InboxFolder.Items(i)

         '受信メールの件数、送信者名、宛先、受信日時、件名(タイトル)を取得して表へ
        Range("A" & n).Value = i
        Range("B" & n).Value = objmailItem.SenderName
        Range("C" & n).Value = objmailItem.To
        Range("D" & n).Value = objmailItem.ReceivedTime
        Range("E" & n).Value = objmailItem.Subject

        n = n + 1
    Next

     '変数を解除
    Set outlookObj = Nothing
    Set myNameSpace = Nothing
    Set InboxFolder = Nothing

End Sub

見ていただければ分かると思いますが、1つの場合と2つの場合の違いはこの一行だけです。 

  • 1つ: Set InboxFolder = myNameSpace.GetDefaultFolder(6)
  • 2つ: Set InboxFolder = myNameSpace.Folders(“<任意のアカウントアドレス>”).Folders(“Inbox”)

要するにInboxFolderへの参照を取得するところだけが違います。GetDefaultFolderを使えば「既定のアカウント」を対象とし、Foldersを使えば任意のアカウントアドレスの任意のフォルダーを対象にできます。

私の場合、上記のコードで<任意のアカウントアドレス>をデータ抽出専用のメールアドレスに設定すると、Outlookに複数のアカウントが登録されいてもうまく動作しました。

あとは、こういったシートを用意して、Outlook_mail_listを走らせるだけです。

Excel VBAでOutlookを操作する

あと、「ツール」→「参照設定」から「Microsoft Outlook 16.0 Object Library」のライブラリを追加しておくことをお忘れなく。これが無いとエラーになります。





以上、Outlookの受信トレイからExcelにデータを取得する方法、という話題でした。こういうちょっとした「ITスキル」があると、業務改善コンサルがスムーズに進むものです。業者に外注などしてしまうと、クライアント(お客様)にとっても結構なコストになりますので、ワンストップサービスとして提供できることを目指しております。


★★★人気記事★★★