Blogブログ

TORAT | 2021.9.8

【Outlook VBA】Outlookで受信したメールをExcelに自動記録する方法

  • プログラミング

Outlookで受信したメールをExcelに自動記録できないか調べたところ、Outlook VBAで実装することができました。今回はその方法をシェアします!

VBAとは

Visual Basic for Applicationsの略で、Microsoft Officeに拡張機能として搭載されているプログラミング言語です。マクロを作成する言語の一つがVBAというイメージです。

マクロというとExcelのイメージがありますが、今回は「メール受信時に」という条件があるため、あらかじめイベントが用意されているOutlook VBAを利用します。

開発環境構築

リボンに開発タブを表示させる

Outlookを起動させたら、リボン(上部のファイル、ホーム…と並んでいるところ)に開発タブを表示させます。

「ファイル」→「オプション」→「リボンのユーザー設定」に進み、右側の開発のチェックボックスにチェックを入れます。

VBEを起動する

開発タブ一番左の「Visual Basic」をクリックします。
VBAのエディタ、VBE(Visual Basic Editor)が起動します。

参照設定をする

Outlook VBAでExcelのオブジェクトを使用できるようにします。
VBE内、「ツール」→「参照設定」でExcelのチェックボックスにチェックを入れます。

ThisOutlookSessionを開く

左に表示されている「ThisOutlookSession」をダブルクリックすると、右にウインドウが開きます。ここにマクロを書いていきます。

※今回使用するApplication_NewMailExイベントは標準モジュールに記載しても動作せず、ThisOutlookSessionに記載する必要があります。

実装条件

今回は、以下の条件で実装しました。
●Outlookでメール受信時に、Excelに自動記録する
●ExcelファイルはExcel Online上にあり、複数人で共有している
●自分もしくは他の誰かがExcelを開いていても記録できるようにする

サンプルコード

//Sleep関数を利用するためのAPI宣言
#If Win64 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

//イベントプロシージャの開始宣言
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
//変数の定義
Dim myNameSpace As NameSpace
Dim objId As Object

//Namespaceオブジェクトの取得
Set myNameSpace = GetNamespace("MAPI")
//Outlookアイテムの取得
Set objId = myNameSpace.GetItemFromID(EntryIDCollection)

    //変数の定義
    Dim strFile As String
    Dim objExcel As Excel.Application
        
    strFile = "Excelファイルのパス"

    //Excelオブジェクトの作成
    Set objExcel = New Excel.Application
    //Excelブックを開き情報を取得
    Set wb = objExcel.Workbooks.Open(strFile)
    //Excelシートの情報を取得
    Set ws = wb.Worksheets("シート名")

    //オブジェクト名を宣言
    With objId
        //最終行+1行(入力行)を取得
        i = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
        
        //入力列と入力内容を指定
        ws.Cells(i, 1).Value = .SentOn //送信日
            If InStr(.SenderEmailAddress, "@aaa.jp") > 0 Then //送信者メールアドレス
              ws.Cells(i, 2).Value = "A社"
            ElseIf InStr(.SenderEmailAddress, "@bbb.jp") > 0 Then
              ws.Cells(i, 2).Value = "B社"
            Else
              ws.Cells(i, 2).Value = ""
            End If
        ws.Cells(i, 3).Value = .SenderName //送信者名
        ws.Cells(i, 4).Value = .Subject //件名
        ws.Cells(i, 5).Value = .Body //本文
    End With

wb.Save   //変更を保存
Sleep 700   //指定した秒数だけ処理を止める   
wb.Close   //ブックを閉じる
objExcel.Quit   //アプリケーションを終了する

End Sub

コード解説

Application_NewMailExイベント

Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)

End Sub

Outlookでメール受信時にExcelを操作したい場合、Application_NewMailExイベントを使用します。

Application_NewMailExイベントの引数にEntryIDCollectionがあり、Outlookのアイテムフォルダに保存される際付与されるアイテムID(=EntryID)を渡してくれます。

NameSpace.GetItemFromIDメソッド

Set objId = myNameSpace.GetItemFromID(EntryIDCollection)

EntryIDで表されるOutlookのアイテムを返してくれます。

Withステートメント

With objId

End With

ステートメント内で、指定したオブジェクト名を省略することができます。
「objId.Subject」→「.Subject」のようにドットで表記します。

入力列と入力内容の指定

ws.Cells(i, 1).Value = .SentOn //送信日
  If InStr(.SenderEmailAddress, "@aaa.jp") > 0 Then //送信者メールアドレス
     ws.Cells(i, 2).Value = "A社"
  ElseIf InStr(.SenderEmailAddress, "@bbb.jp") > 0 Then
     ws.Cells(i, 2).Value = "B社"
  Else
     ws.Cells(i, 2).Value = ""
  End If
ws.Cells(i, 3).Value = .SenderName //送信者名
ws.Cells(i, 4).Value = .Subject //件名
ws.Cells(i, 5).Value = .Body //本文

入力列は、Cells(i, 1) の部分で数字で指定しています。

入力内容は、
●SentOn …送信日
●SenderEmailAddress …送信者メールアドレス
●SenderName …送信者名
●Subject …件名
●Body …本文
など用意されたプロパティで設定します。

サンプルコードのようにif文での記述や、” “で任意の内容を設定することも可能です。

Sleep関数

Sleep 700

ミリ秒単位で、指定した秒数だけ処理を止めることができます。

これがないと、ファイルを開いている状態で記述ができませんでした。 反映に時間がかかるため、ブックを閉める処理を遅らせることで反映できるようになったようです。

尚、Sleep関数を利用するにはAPI宣言が必要となります。
宣言はプロシージャの前に記述する必要があり、32Bit版/64Bit版で記述内容が異なるため条件分岐させています。

#If Win64 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)
#Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

補足

Excelファイルのパスは、Excel Onlineのものでも問題ありませんでした。
Sleep関数は環境に応じて、秒数を変えたり取り除いたりしてください。

さいごに

自動入力されることで入力忘れ防止にもなりますし、とても便利になりました。
条件に合わせてカスタマイズし、ぜひ使ってみてください!

この記事を書いた人

TORAT 管理者

関連記事

Recommend愛されているブログ